広すぎる型を関数に渡す際にGCCに警告させることはできますか?
-
08-07-2019 - |
質問
以下は明らかに欠陥のあるコードであり、コンパイラは診断を出すべきだと思います。しかし、考えられるすべての警告オプションがあっても、 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)