海湾合作委员会 - 未初始化未警告未初始化的结构

时间:2010-11-14 19:52:16

标签: c++ struct initialization gcc-warning

#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的man页面说它应该初始化,我在一个更复杂的程序上看到随机日期,直到我初始化它。在这些情况下是否有任何GCC标志会产生警告?

1 个答案:

答案 0 :(得分:2)

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

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