以下のファイル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
が関数のどこかで使用されている限り警告しません。
私の質問:
- 、このような場合のために、警告を生成するGCCやクランを伝える方法はありますか? (
bar
への呼び出しを削除しても、警告を出すためにclang 3.0を得ることができませんでした) - 実際の動作には理由がありますか?つまり、オプティマイザによって破棄されるローカル変数を割り当てるのが実際には望ましい場合もあったのですが、
関数の引数 'const'とコンパイラが文句を言うだろうしてください:'無効のfoo(int型のconst A){/ * ...何でも... * /} ' – pmg
@pmg:ソースを変更するではありませんオプション:既存のコードベースで同様の無駄な割り当てを検出したい – adl
@pmg hehe、nice;) – ouah