2
#include <ctime>
#include <iostream>
#include <cstring>
int main()
{

struct tm tm ;
//memset(&tm, 0, sizeof(struct tm));
strptime("1 Jan 2000 13:00:00", "%d %b %Y %H:%M:%S", &tm);
time_t t =mktime(&tm);
std::cout << ctime(&t);
return 0;
}

g++ -Wuninitialized -O2 test.cpp 不会警告 tm 尚未初始化。Valgrind 会一直这样做,直到添加 memset 行。Linux 上 strptime 的手册页说它应该被初始化,我在一个更复杂的程序上看到随机日期,直到我初始化它。在这些情况下是否有任何 GCC 标志会产生警告?

4

1 回答 1

2

GCC 无法在编译时查看strptime,mktimectime函数的已编译代码。您只需从调用点传递结构的地址,无需读取任何内容。另一方面,Valgrind 执行您的程序并跟踪所有内存,并在写入特定内存块之前检查是否有读取,从而可以告诉您。

如果这些函数将在标头中内联定义,则编译器可能有机会内联它们并将指针地址回溯到未初始化的结构。不过,我还没有测试过 GCC 在这方面有多好(或者就此而言,一般是编译器)。

于 2010-11-14T20:06:48.203 回答