2012-01-05 4 views
9

以下のファイルfoo.cは私のコードで見つかった微妙なバグの簡略化されたバージョンです。割り当てられた変数についての警告を受け取る方法を教えてください。

int b; 

void bar(int a); 

void foo(int a) 
{ 
    bar(a); 
    a = 42; 
} 

ラインa = 42は、実際に私のコードのタイプミスです:私はb = 42を意味しました。コンパイラが誤植を検出したとは思っていませんが、もう使用されないローカル変数(または関数パラメータ)に代入していることを警告したいと思います。このファイルをコンパイルすると

% gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c 

私は絶対に警告を受けません。生成されたコードを調べると、割り当てa = 42が実行されないので、gccはこの命令が役に立たない(したがって偽の可能性がある)ことを完全によく知っています。 bar(a);への呼び出しには、warning: parameter ‘a’ set but not used [-Wunused-but-set-parameter]という警告が表示されますので、はの前にに割り当てられていても、aが関数のどこかで使用されている限り警告しません。

私の質問:

  1. 、このような場合のために、警告を生成するGCCやクランを伝える方法はありますか? (barへの呼び出しを削除しても、警告を出すためにclang 3.0を得ることができませんでした)
  2. 実際の動作には理由がありますか?つまり、オプティマイザによって破棄されるローカル変数を割り当てるのが実際には望ましい場合もあったのですが、
+1

関数の引数 'const'とコンパイラが文句を言うだろうしてください:'無効のfoo(int型のconst A){/ * ...何でも... * /} ' – pmg

+0

@pmg:ソースを変更するではありませんオプション:既存のコードベースで同様の無駄な割り当てを検出したい – adl

+0

@pmg hehe、nice;) – ouah

答えて

4

この役に立たない割り当てについて警告できる私の知る限り、gccまたはclangオプションはありません。

PC-Lint一方、この状況で警告することができます。変数「シンボル」に割り当てられ

警告438最終値が使用されていない - 値が はその後使用されなかった変数に代入されていました。 メッセージは、変数が有効範​​囲外になったときにreturn文または ブロックの最後に発行されます。

-1

コンパイラは、これがデッドコードであることを検出して、それを最適化します。アセンブリリストを見ると(gccに最適化を指示していれば)、割り当てが存在しないことがわかります。

+0

元の質問に書かれているように、私は既に 'gcc'に最適化を指示しました。問題は、コンパイラが私に何か役に立たないものを書いたことを知らせない、または私にそれを私に知らせるためにどのように設定することができるのかということです。 – adl

+0

あなたは質問に答えていません。彼は、プログラマーが間違いに気づいていないので(そしてリストファイルを掘り下げることもない)、コンパイラがそのようなコードを検出することを望んでいる。 – ugoren

関連する問題