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,mktimeおよび関数の既にコンパイルされたコードを調べることができません。ctime呼び出しの時点から、何も読み取らずに構造体のアドレスを渡すだけです。一方、Valgrind はプログラムを実行し、すべてのメモリを追跡し、特定のメモリ ブロックの書き込みの前に読み取りがあるかどうかを確認し、それを通知します。

これらの関数がヘッダーでインラインで定義される場合、コンパイラがそれらをインライン化し、ポインター アドレスを初期化されていない構造体に戻す可能性があります。ただし、GCCがどれほど優れているかはテストしていません(または、一般的なコンパイラー)。

于 2010-11-14T20:06:48.203 に答える