警告 C26451 算术溢出:使用运算符“-”

Warning C26451 Arithmetic overflow: Using operator '-'

我不明白为什么要标记此问题:

InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));

该方法的定义是:

InitAssignmentCell(int iRow, CString strAssignment, int iCheckState, LPARAM lParam)

所以最后一个参数是LPARAM。但是我看到了一些曲线:

Warning C26451 Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2).

我不明白,因为 iNumRowsint 类型。

我看到了类似的答案 ,我的直觉是这是一个错误的警告。

来自 MSVC 静态分析器的 C26451 警告非常迂腐。它警告您可能假设升级是在 之前 自动执行的(事实并非如此)。

要消除警告,请在算术之前进行转换。所以,而不是:

InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));

使用:

InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows) - 1L);

您并不真的需要 L(或 LL 对于 64 位版本)后缀,但它让未来的读者清楚地知道您知道自己在做什么。常量的更 精确 (但丑陋)的规范是 static_cast<LPARAM>(1).