web-dev-qa-db-ja.com

警告C26451:算術オーバーフロー

これらの警告を解決するにはどうすればよいですか?

// midiNote is a double as it is used in floating point equation
// v is int because that's informative that the function wants whole numbers
void setMidiNote(int v) { midiNote = v-48;  }

警告C26451算術オーバーフロー:4バイト値で演算子 '-'を使用してから、結果を8バイト値にキャストしています。オーバーフローを回避するために、演算子 '-'を呼び出す前に、値をより広い型にキャストしてください(io.2)。

// input should be 0 to 10 integer, and dank will be odd integers only
// dank is a double, it is ultimately used in a floating point equation
void setDarkIntensity(int v) { dank = v * 2 + 1; }

警告C26451算術オーバーフロー:4バイト値で演算子 '*'を使用し、結果を8バイト値にキャストしています。オーバーフローを回避するために、演算子 '*'を呼び出す前に、値をより広い型にキャストしてください(io.2)。

警告C26451算術オーバーフロー:4バイト値で演算子 '+'を使用してから、結果を8バイト値にキャストしています。オーバーフローを回避するために、演算子 '+'を呼び出す前に、値をより広い型にキャストしてください(io.2)。

9
Elan Hickler

これはVS2019のバグだと思います

たとえば、これは警告を生成します

double test2(int n)
{
     return 4.0 * (n - 1);
}

しかし、これはしません

int test2a(int n)
{
    return 4 * (n - 1);
}

ただし、未定義の動作のリスクは後者の方がはるかに大きくなります。 nのはるかに大きなセットがUBを生成するため、4を掛けるとUBのリスクが大幅に増加します

間違いなく、intでのほとんどすべての算術演算が警告されることになる警告が設定されます。

この回答は、VS 2019のコード分析ルールセットエディターでこの警告を無効にする方法を示しています。

警告C26454:算術オーバーフロー: '-'演算はコンパイル時に負の符号なし結果を生成します(io.5)

8
doug

警告は、結果が(大きい)型に変換される前に、計算が元の(小さい)型をオーバーフローする可能性があることを示しています。最初のケースでは、vがMIN_INT(-231)、減算がアンダーフローし、未定義の動作(大きな正の数である可能性が高い)になり、midiNoteに格納されます。警告を回避するには、まず大きなタイプに変換します。

midiNote = double(v) - 48;

2番目の例も同様です。

setMidiNoteはこの問題が発生する値で呼び出されないことがわかっていますが、compilerはこの警告を出さず、問題の可能性を警告します。

3

私はいくつかの Microsoft Docs を見て問題を解決しましたが、変数をlong long型に変更することもできます(上にあります)。それは私のためにエラーを取り除きました。うまくいけば、彼らはすぐにこれに対処します。

0
KoalaZub