mktime()调用无返回疑似库Bug?多时区测试异常及上报咨询
mktime()在特定时区陷入死循环的问题分析与处理
1. 复现情况确认
该问题可以稳定复现。在Africa/Algiers、Africa/Tripoli、Africa/Windhoek这三个非洲时区中,当处理「时区调快1小时但非夏令时切换」的特定时间点时,若调用mktime()时未显式设置tm_isdst字段(默认值为-1,由函数自动判断夏令时状态),会触发死循环,导致函数无法返回、CPU持续高占用。而显式将tm_isdst设为0或1时,mktime()可正常执行并返回结果。
2. 最优Bug上报方案
为让libc开发者快速定位并修复问题,上报时需按以下结构化内容提交到对应libc的官方Bug跟踪系统(如GNU glibc的Bugzilla、musl libc的GitHub Issues等):
- 完整环境信息:
- 操作系统版本、内核版本
- 使用的libc版本(如glibc 2.35)
- 编译器版本(如gcc 11.3.0)
- 时区数据库版本(如tzdata 2023c)
- 最小复现代码:
提取能稳定触发问题的最简代码,保留时区设置、目标时间构造、mktime()调用核心逻辑,剔除无关代码。示例框架:#include <stdio.h> #include <time.h> #include <stdlib.h> void print_time(struct tm *tm) { time_t t = mktime(tm); // 此处陷入死循环 if (t == -1) { printf("mktime failed\n"); return; } printf("%s", ctime(&t)); } int main() { setenv("TZ", "Africa/Algiers", 1); tzset(); struct tm tm = {0}; tm.tm_year = 2023 - 1900; tm.tm_mon = 3 - 1; tm.tm_mday = 12; tm.tm_hour = 2; tm.tm_min = 30; tm.tm_sec = 0; tm.tm_isdst = -1; // 未显式设置时触发问题 print_time(&tm); return 0; } - 复现步骤:
- 导出目标时区变量:
export TZ="Africa/Algiers" - 编译代码:
gcc test.c -o test - 运行程序:
./test - 观察现象:程序无输出,CPU占用持续100%
- 导出目标时区变量:
- 问题细节补充:
- 死循环触发点明确为
mktime(&tm)调用 - 显式设置
tm_isdst=0或tm_isdst=1时,函数可正常返回,无死循环
- 死循环触发点明确为
- 临时规避方案:在调用
mktime()前,显式指定tm_isdst的值为0或1,绕过自动判断逻辑
附:用户提供的原始测试代码、示例输出及编译环境信息
// 此处粘贴原始测试代码示例输出:
// 此处粘贴原始示例输出编译环境详情:
- [列出用户提供的编译环境信息,如操作系统、libc版本等]
内容的提问来源于stack exchange,提问作者chux
相关产品推荐
相关产品推荐

