12

以下は、コンパイラが診断を発行する必要があると私が考える、明らかに欠陥のあるコードです。しかし、私が考えることができるすべての警告オプションを使用しても、そうではありませgccん。g++-pedantic -Wall -Wextra

#include <stdio.h>

short f(short x)
{
    return x;
}

int main()
{
    long x = 0x10000007;   /* bigger than short */
    printf("%d\n", f(x));  /* hoping for a warning here */
    return 0;
}

gccこれを作成してg++警告する方法はありますか?余談ですが、デフォルトで、またはかなり一般的な特別な警告構成でこれについて警告する別のコンパイラがありますか?

注: GCC (C および C++ コンパイラの両方) バージョン 4.2.4 を使用しています。

編集:私はそれgcc -Wconversionがトリックを行うことを発見しましたが、同じオプションg++はそうではありません。ここでは実際にC++を使用しているため、解決策が必要ですg++(そして、なぜそう-Wconversionではないのか疑問に思っています)。

編集: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34389g++ 4.4は、これが...maybeで修正される可能性があることを示唆しています。それが同じ問題であるかどうか、および/または修正が実際にそのバージョンで行われるかどうかは、まだ明確ではありません. たぶん、4.3 または 4.4 の誰かが私のテスト ケースを試すことができます。

4

2 に答える 2

9

-Wconversion を使用してください -- 問題は、関数 f(short x) が呼び出されたときの long x から short への暗黙的なキャスト (変換) です [not printf]。 "。

..

編集:あなたのメモを見ました。-Wconversion を実行すると、Linux で g++ 4.3.2 を使用すると警告が表示されます... (Debian では 4.3.2-1)

于 2008-11-21T20:55:30.130 に答える
0

Gimpelの PC-lint/FlexeLint に投資することを強くお勧めします。このソフトウェアは、コンパイラがそうではないこのようなものをキャッチするために作られています。比較的安価で、価格に見合った価値があります。サイトには、評価に使用できるオンラインデモがあります。例から問題の行について報告されるものは次のとおりです。

diy.cpp  14  Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)
于 2008-11-21T20:55:00.367 に答える