2010-11-14 134 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的性能如何,儘管(或者就此而言,通常是編譯器)。