You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
    
  • 复现步骤:
    1. 导出目标时区变量:export TZ="Africa/Algiers"
    2. 编译代码:gcc test.c -o test
    3. 运行程序:./test
    4. 观察现象:程序无输出,CPU占用持续100%
  • 问题细节补充:
    • 死循环触发点明确为mktime(&tm)调用
    • 显式设置tm_isdst=0或tm_isdst=1时,函数可正常返回,无死循环
  • 临时规避方案:在调用mktime()前,显式指定tm_isdst的值为0或1,绕过自动判断逻辑

附:用户提供的原始测试代码、示例输出及编译环境信息

// 此处粘贴原始测试代码

示例输出:

// 此处粘贴原始示例输出

编译环境详情:

  • [列出用户提供的编译环境信息,如操作系统、libc版本等]

内容的提问来源于stack exchange,提问作者chux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:38:11