代码分析:
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_HISTORY_TYPE,
&CAssignHistoryDlg::OnTcnSelchangeTabHistoryType)
警告C26454:
算术溢位:"-"操作在编译时产生负的无符号结果(io.5)。TCN_SELCHANGE
的定义为:
#define TCN_FIRST (0U-550U)
#define TCN_SELCHANGE (TCN_FIRST - 1)
我不知道我还能做什么!
2条答案
按热度按时间h7appiyu1#
上面的代码在C++中是有效的,编译时应该没有任何警告。没有溢出,这只是意味着
-550U
。如果他们把它写为#define TCN_FIRST 0xFFFFFDDA
或0xFFFFFFFFU-549U
会更清楚代码分析似乎使用了不同的方法,并发现了溢出。
可能的解决方案:
禁用代码中的警告:
或者,禁用代码分析规则中的警告
Use the code analysis rule set editor
06odsfpq2#
您试图从一个较小的无符号值中减去一个较大的无符号值,这会导致结果超出零。在您的示例中,我假设
TCN_FIRST
定义为0,因此将TCN_SELCHANGE
设置为1将解决此问题。您还应该使用
constexpr
或const
而不是defines。根据MSDN:
Arithmetic overflow checks in C++ Core Check
C26451 RESULT_OF_ARITHMETIC_OPERATION_CAST_TO_LARGER_SIZE:[operator] operation会在0之后换行,并在编译时期产生大型的不带负数号的数字。这个警告表示减法运算会产生负数的结果,而该结果是在不带负数号的内容中评估的。这会导致结果在0之后换行,并产生非常大的不带负数号的数字,而这可能会造成意外的溢位。
在校正源中,将正值赋给无符号结果。