文章

Bug:缺少空指针判断导致服务崩溃

Bug:缺少空指针判断导致服务崩溃

现象

2025年3月26日14:10 位于 10.30.127.1110.30.127.14 上的两个 GSS 服务先后崩溃

错误日志

10.30.127.11:

03/26/25 14:10:21 0000435c d:\tkproject\tkbase\tkservicebase\tknetservicebase\tknetclient.cpp : 1670, Exception: c0000005, IP: 00f03a83, SP: 07c7e6c0
03/26/25 14:10:21 0000435c d:\tkproject\tkbase\tkservicebase\tknetservicebase\tknetclient.cpp : 1673, type: 00036401, len: 241, last msg type: 00036401, ip: 127.0.0.1, LastExecLine:0, Service shutdown

dump日志

经调试 dump 日志,发现是上游传入的时间戳为 2147483647,导致通过该时间戳取 time 结构体时取到了空指针。出错代码片段如下:

1
2
3
4
    // ts 为 time_t 类型的对象,出问题时该值为2147483647
    time_t now = ( 0 == ts ) ? time(NULL) : ts;
    struct tm * nowtm = localtime(&now);   
    // 下面继续传递的 tm 指针为空指针 

错误分析

  • 两个服务相隔十几秒崩溃,可能是 GSS 在那一时间点收到了同一个请求导致的,崩溃原因可能与某一种特定的消息请求有关。
  • 很难排除此次崩溃与我昨天的升级有关,可能是因为升级到了 C++17 导致解析时间戳的函数不同导致的。(这个以后有空了可以验证一下)
  • 从日志的错误记录来看,应该是与内存和指针相关的。

解决方案

  • 在 dump 日志报错的地方增加了指针保护。
  • 增加了此种错误的日志输出。
  • 上述完成后,服务未再崩溃。

参考

msdn-函数localtime()

本文由作者按照 CC BY 4.0 进行授权