6

代码分析:

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)

我看不出我还能做什么!

4

2 回答 2

6
//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 0xFFFFFDDA或会更清楚0xFFFFFFFFU-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 )

或者,禁用代码分析规则中的警告
使用代码分析规则集编辑器

在此处输入图像描述

于 2018-07-02T19:18:50.280 回答
2

您试图从一个较小的无符号值中减去一个较大的无符号值,这会导致结果超过零。在您的情况下,我假设 TCN_FIRST 被定义为 0,因此将 TCN_SELCHANGE 设置为 1 将解决问题。

无论如何,您也应该使用constexprorconst而不是定义。

根据 MSDN:

C++ 核心检查中的算术溢出检查

C26451 RESULT_OF_ARITHMETIC_OPERATION_CAST_TO_LARGER_SIZE:[operator] 操作超过 0 并在编译时产生一个大的无符号数。此警告表明减法运算产生了在无符号上下文中评估的否定结果。这会导致结果超过 0 并产生一个非常大的无符号数,这可能导致意外溢出。

1 // Example source:
2 unsigned int negativeunsigned() {
3    const unsigned int x = 1u - 2u; // C26454 reported here
4    return x;
5 }

1 // Corrected source:
2 unsigned int negativeunsigned() {
3     const unsigned int x = 4294967295; // OK
4     return x;
5 }

在更正后的源中,为无符号结果分配了一个正值。

于 2018-07-02T15:45:07.767 回答