質問

以下は明らかに欠陥のあるコードであり、コンパイラは診断を出すべきだと思います。しかし、考えられるすべての警告オプションがあっても、 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 = 34389 は、これが g ++ 4.4 で修正される可能性があることを示唆しています。同じ問題であるか、その修正が実際にそのバージョンで行われるかどうかは、まだ明確ではありません。 4.3または4.4の誰かが私のテストケースを試すことができます。

役に立ちましたか?

解決

-Wconversionを使用します-問題は、関数f(short x)が[printfではない]と呼ばれる場合にlong xからshortへの暗黙のキャスト(変換)であり、-Wconversionはlongから&cast; shortは値を変更する可能性があります。」

..

編集:メモを見ました。 -Wconversionは、Linuxでg ++ 4.3.2を使用して、警告を表示します...(Debianでは4.3.2-1)

他のヒント

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

diy.cpp  14  Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top