GCC -Wuninitialized不警告未初始化的结构
问题描述:
#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标志会产生警告?GCC -Wuninitialized不警告未初始化的结构
答
GCC无法在编译时查看strptime
,mktime
和ctime
函数的已编译代码。您只需从调用点传递结构的地址,而无需读取任何内容。另一方面,Valgrind执行你的程序并跟踪所有的内存,并在写入特定内存块之前检查是否有读操作,因此可以告诉你。
如果这些函数将在头文件中内联定义,那么编译器可能会内联它们,并将指针地址追溯回未初始化的结构。我还没有测试GCC的性能如何,尽管(或者就此而言,通常是编译器)。
什么版本的GCC? – 2010-11-14 19:57:18
gcc版本4.4.5(Debian 4.4.5-6) – Sard 2010-11-14 21:12:22