私がやろうとしているのは、私が持っているいくつかのソースファイルで、double型またはfloat型から他の型へのすべての明示的なキャストを見つけることです。これを行うための組み込みのgcc方法はありますか?言語はCです。ありがとう!
5 に答える
C コードを C++ モードでもコンパイルできる場合は、g++ の-Wold-style-cast
警告フラグを使用して、そのようなすべてのキャストで警告をトリガーできます。
スイッチを使用して、特定のコーディング パターンに対してトリガーされる警告が Clang にあるかどうかを判断できます-Weverything
(ただし、これは他のほとんどの目的には役に立たないことに注意してください。コード)。ただし、この場合、clang には、そのようなキャストでトリガーされる警告はありません。
-Wconversion
値を変更する可能性のある暗黙の変換(double
大きな型)-Wno-sign-conversion
について警告し、符号付き整数と符号なし整数の間の変換に関する警告を無効にします(したがって、不要な警告が少なくなります)。それ以外の場合、標準的な代替手段はありません...
最悪の場合、これらのキーワードをソースファイルに直接検索できます...
私が知っているコンパイラにはそのためのオプションがありませんが、Gimpel の FlexeLint はあなたが望むことを行うことができます:
$ cat tst.c
int main (void)
{
int i = 0, j = 0;
float f = 0.0;
double d = 0.0;
i = (int) f;
j = (int) d;
d = (double) f;
f = (float) d;
i = (int)j;
j = (unsigned) i;
return (int) j;
}
$ flexelint -w1 +e922 tst.c
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012
--- Module: tst.c (C)
_
i = (int) f;
tst.c 7 Note 922: cast from float to int
_
j = (int) d;
tst.c 8 Note 922: cast from double to int
_
d = (double) f;
tst.c 9 Note 922: cast from float to double
_
f = (float) d;
tst.c 10 Note 922: cast from double to float
shell returned 4
キャストは明示的に合法であり、奇妙な変換を実行する正しい方法であるため、gcc にそれらについて警告するオプションが含まれている可能性はほとんどありません。
代わりに、ソースがどれだけ巨大かによっては、次の方法で回避できる場合があります。
grep '\(double|float\) ' *
すべての double または float 変数を提供します。c は通常の言語ではないため、(シェル ツールを使用して) これを解析して double 変数または float 変数のリストにするのは簡単ではありませんが、ソースが十分に小さい場合は、これを手動で行うのは簡単です。
grep '([^()]*)[ ()]*\(your list of variable names\)' *
そこから、多くのキャストが表示されます。
まあ、そんな選択肢は無いと思います。結局のところ、意図せず行った可能性があることを警告するために、コンパイラによって警告が発行されます。ただし、明示的なキャストは基本的に、コンパイラに「黙って、何をしているのか知っている」と伝える方法です。