2010-11-14 129 views
1
#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不警告未初始化的结构

+1

什么版本的GCC? – 2010-11-14 19:57:18

+0

gcc版本4.4.5(Debian 4.4.5-6) – Sard 2010-11-14 21:12:22

回答

2

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

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