如何解决这些警告?
// 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)。
发布于 2019-05-05 20:07:17
我相信这是VS2019中的一个bug。它不再在VS2022中被标记。
例如,这会产生警告。
double test2(int n)
{
return 4.0 * (n - 1);
}但这不是
int test2a(int n)
{
return 4 * (n - 1);
}然而,对于后者来说,出现未定义行为的风险要大得多。乘以4大大增加了UB的风险,因为一个非常大的n集将产生UB。有多棒?在第一个溢出的例子中,在大约40亿个可能值中,只有一个可能的n值。在第二阶段,大约有30亿n将超过/低于流量。为什么?因为如果每一个比添加0或乘1更复杂的表达式都被标记为可能溢出,则整数算术是不可能实现的。
可以说,要将警告设置为这么高,几乎所有对ints的算术操作都会受到警告。
这个答案显示了在VS 2019代码分析规则集编辑器中禁用此警告的一种方法。
警告C26454:算术溢出:'-‘操作在编译时产生负的无符号结果(io.5)
然而,微软( Microsoft ),从VS2022开始,不再对此生成C26451警告。它也没有出现在-Wall下。很明显他们看到光了。
发布于 2020-01-02 13:30:57
我通过查看一些Microsoft解决了这个问题,但您也可以将变量转换为long long类型(我知道,在顶部)。它帮我消除了错误。希望他们能尽快解决这个问题。
发布于 2020-05-02 16:57:42
通过将变量的类型更改为“无符号__int64”,消除了警告。这就是微软开发者社区的建议!
https://stackoverflow.com/questions/55995817
复制相似问题