2016-04-08 6 views
2

私はこのようなループに起因する私のコードのバグを見つけるのに苦労でした:g ++でint i = iのエラー/警告を生成する方法は?

for (int i=i;i<5;i++){ 
    // ... 
} 

私は-O2 -WallとG ++ 4.7.2を使用していますが、何の警告/エラーが表示されませんが。 -O2と組み合わせて、このような場合の警告を生成するコンパイラフラグもありますか?

私はいくつかの関連の質問が見つかりました:それは議論されているコメントに hereを何-O2がない場合、そのG ++は-Wallとの警告を示しています。しかし、問題のあるループは、警告が表示されないことを説明する-O2で最適化されているため、この質問は特に重要です。私の場合、ループは最適化されていませんが、警告は表示されません。 this questionthis oneも関連しています。これらの質問を読んだ後に、私はC++がそのような非感覚を許す理由を理解しています(私は全く意味がないのでhereが好きです)。 -O2 -Wall

int main() 
{ 
    int j = 0; 
    for (int i=i; i<5; ++i) 
     j++; 
    return 0; 
} 

をコンパイルするとき

+0

Upvotingの質問を、それは私が私のgccが同じ問題を抱えていると私はより多くの最近のものを使用する必要があり実感しましたので。 – jdarthenay

答えて

1

打ち鳴らすコンパイラは、私を与える:

warning_loop.cxx:4:16: warning: variable 'i' is uninitialized 
when used within its own initialization [-Wuninitialized] 
for (int i=i; i<5; ++i) 

のgcc(バージョン5.3)コンパイラは同様の警告を与える:

warning_loop.cxx: In function 'int main()': 
warning_loop.cxx:4:16: warning: 'i' is used uninitialized in 
this function [-Wuninitialized] 
for (int i=i; i<5; ++i) 

初期化されていない値の使用はvalgrindで追跡できます

valgrind --track-origins=yes ./a.out 

出力を与える:

==33052== Memcheck, a memory error detector 
==33052== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==33052== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
==33052== Command: ./a.out 
==33052== 
==33052== Conditional jump or move depends on uninitialised value(s) 
==33052== at 0x100000F8C: ??? (in ./a.out) 
==33052== by 0x10022F5AC: start (in /usr/lib/system/libdyld.dylib) 
==33052== Uninitialised value was created by a stack allocation 
==33052== at 0x7FFF5FC01036: _dyld_start (in /usr/lib/dyld) 
+0

'-Wall -O2'も試しましたか? – user463035818

+0

はい、違いはありません – Chiel

+0

あなたのケースでは、valgrindは何をしますか? – Chiel

関連する問題