7

整数除算 (ゼロへの切り捨て) を識別できる g++ 警告またはその他のツールはありますか? 通常は「float = int/int」が原因で、必然的に数値エラーが発生する計算を含む数千行のコードがあり、それらを特定する必要があります。これらを見つけるための合理的な方法が必要です。

4

6 に答える 6

2

試してみてください-Wconversion

gcc の man ページから:

値を変更する可能性のある暗黙の変換について警告します。これには、「x」が「double」の場合の「abs (x)」など、実数と整数の間の変換が含まれます。「unsigned ui = -1」のように、符号付きと符号なしの間の変換。「sqrtf (M_PI)」などの小さい型への変換。"abs ((int) x)" や "ui = (unsigned) -1" のような明示的なキャスト、または "abs (2.0)" のように変換によって値が変更されない場合は警告しません。符号付き整数と符号なし整数の間の変換に関する警告は、-Wno-sign-conversion を使用して無効にすることができます。

C++ の場合、「NULL」型と非ポインター型の間の変換についても警告します。ユーザー定義の変換のオーバーロード解決を混乱させる。型変換演算子を決して使用しない変換: 「void」、同じ型、基本クラス、またはそれらへの参照への変換。-Wsign-conversion が明示的に有効にされていない限り、C++ では、符号付き整数と符号なし整数の間の変換に関する警告はデフォルトで無効になっています。

次のサンプル プログラム ( test.cpp) では、エラーが発生しますtest.cpp: In function ‘int main()’: test.cpp:7: warning: conversion to ‘float’ from ‘int’ may alter its value

#include <iostream>

int main()
{
    int a = 2;
    int b = 3;
    float f = a / b;

    std::cout << f;

    return 0;
}
于 2011-05-20T20:01:35.967 に答える
2

これらの数値エラーを呼び出すのに苦労しています。整数計算を要求し、整数計算の正しい数値を取得しました。これらの数値が受け入れられない場合は、浮動小数点計算を依頼してください。

int x = 3;
int y = 10;

int z = x / y;

// "1." is the same thing as "1.0", you may want to read up on
// "the usual arithmetic conversions."  You could add some
// parentheses here, but they aren't needed for this specific
// statement.
double zz = 1. * x / y;
于 2011-05-20T20:07:32.830 に答える
1

gcc-Wconversionコメント:

浮動小数点変数の型を から に変更floatするdoubleと、警告が消えます。

$ cat 'file.cpp'

#include <iostream>

int main()
{
   int a = 2;
   int b = 3;
   double f = a / b;

   std::cout << f;
}

でコンパイルすると$ g++-4.7 -Wconversion 'file.cpp'、警告は返されません (as $ clang++ -Weverything 'file.cpp')。

説明:

float完全に有効な整数演算のため、タイプを使用するときの警告は返されませんが、floatの可能なすべての値を格納できないためですint(より大きな値は でしかキャプチャできませんfloat) double。そのため、RHS をffloat の場合に割り当てると値が変更される可能性がありますが、double の場合は変更されません。明確にするために、警告は返されませんint/intが、代入が原因ですfloat = int

これについては、次の質問を参照してください: Javaでサイズが同じ場合の浮動小数点データ型と整数データ型の違いは何ですか? int を float として格納し、int -> float -> int 往復変換に使用する丸め

ただし、使用float -Wconversionは、影響を受ける可能性のある行を特定するのに依然として役立ちますが、包括的ではなく、実際にはそのためのものではありません。docs/gcc/Warning-Options.htmlとここgcc.gnu.org/wiki/NewWconversion-Wconversion参照してください。

おそらく興味深いのは、 「C++で浮動小数点数への暗黙のキャスト整数計算」の議論にも続くことです。

于 2013-02-24T20:11:43.100 に答える
0

このようなエラーを見つける最善の方法は、本当に優れた単体テストを行うことです。すべての代替手段は十分ではありません。

于 2011-05-20T20:13:21.083 に答える