警告C26451:算术溢出

时间:2019-05-05 19:51:44

标签: c++ visual-c++ warnings

如何解决这些警告?

// 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)。

5 个答案:

答案 0 :(得分:2)

警告告诉您,在转换为结果(较大)类型之前,您的计算可能会溢出原始(较小)类型。在第一种情况下,如果v为MIN_INT(-2 31 ),则减法将下溢,从而导致未定义的行为(可能有很大的正数),然后将其存储在{{ 1}}。为避免警告,请先将其转换为较大的类型:

midiNote

同样地,您的第二个示例。

虽然您可以知道不会使用会出现此问题的值调用midiNote = double(v) - 48; ,但编译器却不知道并发出此警告来提醒您潜在的问题。

答案 1 :(得分:2)

我相信这是VS2019中的错误

例如,这会产生警告

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

但这不是

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

但是,未定义行为的风险更大。乘以4会大大增加UB的风险,因为大量n会产生UB

可以说,要设置警告,实际上会警告对int进行任何算术运算。

此答案显示了一种在VS 2019中的代码分析规则集编辑器中禁用此警告的方法。

Warning C26454: Arithmetic overflow: '-' operation produces a negative unsigned result at compile time (io.5)

答案 2 :(得分:1)

我通过查看一些Microsoft Docs来解决了这个问题,但是您也可以将变量更改为long long类型(在顶部,我知道)。它为我摆脱了错误。希望他们能尽快解决这个问题。

答案 3 :(得分:1)

通过将变量的类型更改为“ unsigned __int64”,我摆脱了警告。这就是Microsoft开发者社区的建议!

答案 4 :(得分:0)

要解决您的问题,请将参数 v 转换为 64 位类型:

void setMidiNote(int v) { midiNote = static_cast<int64_t>(v) - 48; }

void setDarkIntensity(int v) { dank = static_cast<int64_t>(v) * 2 + 1; }

在 VS 2019 16.9.6 上测试

来源:https://developercommunity.visualstudio.com/t/invalid-error-c26451/279594#T-N404080 https://docs.microsoft.com/en-us/cpp/code-quality/C26451