2012-04-25 13 views
6

私がしようとしているのは、私が持っているいくつかのソースファイルの中で、double型から浮動小数点型への明示的なキャストを見つけることです。これを行う組み込みgccの方法はありますか? 言語はCです。 ありがとう!gccやclangに明示的なキャストに関する警告を出す方法はありますか?

-Wconversion
+2

) 'または'(float) 'を使用していますか? –

+0

@RobertHarvey申し訳ありませんが、私はそれをより意味をなさなく言い換えました。 float/double型の明示的キャストをすべてキャッチしたいので、(int)などを検索することができますが、float型かdouble型かはわかりません。 – Chris

+1

ちょっと考えました(私はC++やそれが可能かどうか分かりません):doubleとfloatのキャスト演算子をオーバーライドしてコンパイルエラーを発生させ、C++でコンパイルします:) – pmg

答えて

2

キャストが明示的に合法的、そして奇妙な変換を実行するための正しい方法ので、それはあなたのソースがどのように巨大に応じて、あなたができることがあります、gccが代わりに

それらについてを警告するためのオプションが含まれているだろうと非常に低いのです離れて行く:

grep '\(double|float\) ' * 

あなたはすべてのdoubleまたはfloat変数を与えることができます。 cは通常の言語ではないので、二重変数やfloat変数のリストにこれを解析するのは簡単ではありませんが(シェルツールを使用して)、ソースが十分小さい場合は手作業で行うのは簡単です。

grep '([^()]*)[()]*\(your list of variable names\)' * 

あなたのキャストの多くが表示されます。

2

は(そうより少ない不要警告が存在することになる)値(doubleが大きいタイプである)、および符号付きおよび符号なし整数間の変換約-Wno-sign-conversion無効警告を変更することが暗黙的な変換のために警告します。そうでなければ私はまあ、私はそのようなオプションが存在しないと思います...

+1

私が理解するところでは、明示的な変換は-Wconversionによってキャッチされませんが、実際には警告を取り除く方法です。私はいくつかのテストを行い、これも真実であることがわかったので、そうするために他の方法を見つける必要があります。 – Chris

+0

不都合なことに、それらは表示されています(少なくとも私が数ヶ月後に試した時でした)。私は '-Wconversion'が_accidential_変換をキャッチすることを可能にしていました。明示的な(意図された)変換から生成されるノイズの量は耐え難いものでした。 – Damon

0

をあなたが直接あなたのソースファイルにこれらのキーワードを探していることができます任意の標準の代替...

最悪の場合は表示されません。結局のところ、あなたが意図せずにしたことからあなたに警告するために、コンパイラによって警告が発行されます。しかし、明示的なキャストは、基本的にコンパイラに「シャットダウンする、私がやっていることを知っている」と言う方法です。

+0

私が心配しているのはフロートしたり倍にしたりすることではなく、フロートから何かに倍増します。私はすべてのキャストのリストを作成しましたが、そのリストから浮動小数点数または倍数だけの変数名を抽出する必要があります。これは非常に困難です。 – Chris

+0

ここではどのタイプのキャストに問題がありますか?彼らが問題を抱えている場合、なぜ彼らは最初のコードで終わるのですか? –

+1

@cli_hlt:あなたが知っている、悪いコードがあります。それはより良いものに修正する必要があります:) –

6

CコードをC++モードでコンパイルできる場合は、g ++の-Wold-style-cast警告フラグを使用して、そのようなすべてのキャストに関する警告をトリガすることができます。 スイッチを使用して、Clangに特定のコーディングパターンに対してトリガーする警告があるかどうかを判断できます(ただし、これは他のほとんどの目的には役立ちません - clangには、合法的なコードの様々な形で)。しかし、この場合、clangはそのようなキャストに対してトリガする警告を持ちません。私が知っているコンパイラは、そのためのオプションを持っていませんが

0

、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 
関連する問題