c++ 警告C26454:算术溢位:'-'作业在编译时期产生负数的无负数号结果(io.5)

nhhxz33t  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(572)

代码分析:

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)

我不知道我还能做什么!

h7appiyu

h7appiyu1#

//windows header file:
#define TCN_FIRST (0U-550U)
#define TCN_SELCHANGE           (TCN_FIRST - 1)

//user file:
...
unsigned int i = TCN_SELCHANGE;

上面的代码在C++中是有效的,编译时应该没有任何警告。没有溢出,这只是意味着-550U。如果他们把它写为#define TCN_FIRST 0xFFFFFDDA0xFFFFFFFFU-549U会更清楚
代码分析似乎使用了不同的方法,并发现了溢出。
可能的解决方案:
禁用代码中的警告:

#pragma warning( push )
#pragma warning( disable : 26454 )

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnTcnSelchangeTabHistoryType)
END_MESSAGE_MAP()

#pragma warning( pop )

或者,禁用代码分析规则中的警告
Use the code analysis rule set editor

06odsfpq

06odsfpq2#

您试图从一个较小的无符号值中减去一个较大的无符号值,这会导致结果超出零。在您的示例中,我假设TCN_FIRST定义为0,因此将TCN_SELCHANGE设置为1将解决此问题。
您还应该使用constexprconst而不是defines。
根据MSDN:
Arithmetic overflow checks in C++ Core Check
C26451 RESULT_OF_ARITHMETIC_OPERATION_CAST_TO_LARGER_SIZE:[operator] operation会在0之后换行,并在编译时期产生大型的不带负数号的数字。这个警告表示减法运算会产生负数的结果,而该结果是在不带负数号的内容中评估的。这会导致结果在0之后换行,并产生非常大的不带负数号的数字,而这可能会造成意外的溢位。
在校正源中,将正值赋给无符号结果。

相关问题