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

Posted

技术标签:

【中文标题】警告 C26451 算术溢出:使用运算符“-”【英文标题】:Warning C26451 Arithmetic overflow: Using operator '-' 【发布时间】:2020-11-10 19:40:04 【问题描述】:

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

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

该方法的定义是:

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

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

警告 C26451 算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值。在调用运算符 '-' 之前将值转换为更广泛的类型以避免溢出 (io.2)。

我不明白这一点,因为 iNumRows 的类型是 int

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

【问题讨论】:

【参考方案1】:

来自 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&lt;LPARAM&gt;(1)

【讨论】:

uLunsigned long 的简码吗?那基本上就是LPARAM 吗? 我们现在要删除过时的 cmets 吗?

以上是关于警告 C26451 算术溢出:使用运算符“-”的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 Microsoft C26451(算术溢出)警告

C ++中的算术溢出添加2个DWORD

C++ 指针警告:算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值

C26451 算术溢出访问 CStringArray 中的项目

算术运算导致溢出

算术溢出:对 4 字节值使用运算符“*”,然后将结果转换为 8 字节值