私がしようとしているのは、私が持っているいくつかのソースファイルの中で、double型から浮動小数点型への明示的なキャストを見つけることです。これを行う組み込みgccの方法はありますか? 言語はCです。 ありがとう!gccやclangに明示的なキャストに関する警告を出す方法はありますか?
-Wconversion
私がしようとしているのは、私が持っているいくつかのソースファイルの中で、double型から浮動小数点型への明示的なキャストを見つけることです。これを行う組み込みgccの方法はありますか? 言語はCです。 ありがとう!gccやclangに明示的なキャストに関する警告を出す方法はありますか?
-Wconversion
キャストが明示的に合法的、そして奇妙な変換を実行するための正しい方法ので、それはあなたのソースがどのように巨大に応じて、あなたができることがあります、gccが代わりに
それらについてを警告するためのオプションが含まれているだろうと非常に低いのです離れて行く:
grep '\(double|float\) ' *
あなたはすべてのdoubleまたはfloat変数を与えることができます。 cは通常の言語ではないので、二重変数やfloat変数のリストにこれを解析するのは簡単ではありませんが(シェルツールを使用して)、ソースが十分小さい場合は手作業で行うのは簡単です。
grep '([^()]*)[()]*\(your list of variable names\)' *
あなたのキャストの多くが表示されます。
は(そうより少ない不要警告が存在することになる)値(double
が大きいタイプである)、および符号付きおよび符号なし整数間の変換約-Wno-sign-conversion
無効警告を変更することが暗黙的な変換のために警告します。そうでなければ私はまあ、私はそのようなオプションが存在しないと思います...
をあなたが直接あなたのソースファイルにこれらのキーワードを探していることができます任意の標準の代替...
最悪の場合は表示されません。結局のところ、あなたが意図せずにしたことからあなたに警告するために、コンパイラによって警告が発行されます。しかし、明示的なキャストは、基本的にコンパイラに「シャットダウンする、私がやっていることを知っている」と言う方法です。
私が心配しているのはフロートしたり倍にしたりすることではなく、フロートから何かに倍増します。私はすべてのキャストのリストを作成しましたが、そのリストから浮動小数点数または倍数だけの変数名を抽出する必要があります。これは非常に困難です。 – Chris
ここではどのタイプのキャストに問題がありますか?彼らが問題を抱えている場合、なぜ彼らは最初のコードで終わるのですか? –
@cli_hlt:あなたが知っている、悪いコードがあります。それはより良いものに修正する必要があります:) –
CコードをC++モードでコンパイルできる場合は、g ++の-Wold-style-cast
警告フラグを使用して、そのようなすべてのキャストに関する警告をトリガすることができます。 スイッチを使用して、Clangに特定のコーディングパターンに対してトリガーする警告があるかどうかを判断できます(ただし、これは他のほとんどの目的には役立ちません - clangには、合法的なコードの様々な形で)。しかし、この場合、clangはそのようなキャストに対してトリガする警告を持ちません。私が知っているコンパイラは、そのためのオプションを持っていませんが
、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
) 'または'(float) 'を使用していますか? –
@RobertHarvey申し訳ありませんが、私はそれをより意味をなさなく言い換えました。 float/double型の明示的キャストをすべてキャッチしたいので、(int)などを検索することができますが、float型かdouble型かはわかりません。 – Chris
ちょっと考えました(私はC++やそれが可能かどうか分かりません):doubleとfloatのキャスト演算子をオーバーライドしてコンパイルエラーを発生させ、C++でコンパイルします:) – pmg