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

Posted

技术标签:

【中文标题】C26451 算术溢出访问 CStringArray 中的项目【英文标题】:C26451 Arithmetic overflow accessing items in a CStringArray 【发布时间】:2019-09-18 07:27:55 【问题描述】:

得到这个代码:

CString CMeetingScheduleAssistantApp::UpdateDateFormatString(COleDateTime& rDate, CString strDateFormatString)

    CString     strDayNumber, strNewDateFormatString = strDateFormatString;

    if (theApp.UseTranslationINI())
    
        strNewDateFormatString.Replace(_T("%B"),
            m_aryDateTrans[DATE_TRANS_MONTH][rDate.GetMonth() - 1]);
        strNewDateFormatString.Replace(_T("%A"),
            m_aryDateTrans[DATE_TRANS_DAY][rDate.GetDayOfWeek() - 1]);
        strNewDateFormatString.Replace(_T("%b"),
            m_aryDateTrans[DATE_TRANS_MONTH_SHORT][rDate.GetMonth() - 1]);
        strNewDateFormatString.Replace(_T("%a"),
            m_aryDateTrans[DATE_TRANS_DAY_SHORT][rDate.GetDayOfWeek() - 1]);

        strDayNumber = rDate.Format(_T("%d"));
        strNewDateFormatString.Replace(_T("%d"), strDayNumber);
        strDayNumber = rDate.Format(_T("%#d"));
        strNewDateFormatString.Replace(_T("%#d"), strDayNumber);
    

    return strNewDateFormatString;

对于四行 Replace 代码,我收到代码分析警告:

警告 C26451

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

[] 括号内的第一个值是int 类型,但第二个是1 的字面值:

变量m_aryDateTrans定义为:

CStringArray m_aryDateTrans[NUM_DATE_TRANS];

所以我不确定我需要在此处进行什么强制转换来抑制此警告。

我在 32 位和 64 位环境下编译。

【问题讨论】:

【参考方案1】:

CStringArray[] operator 采用 INT_PTR 参数,在 x64 构建中为 64 位,在 x86 中为 32 位。所以,你应该使用如下所示的(相当笨拙的)代码:

strNewDateFormatString.Replace(_T("%B"),
            m_aryDateTrans[DATE_TRANS_MONTH][INT_PTR(rDate.GetMonth()) - INT_PTR(1)]);

(你也许可以在没有第二次演员的情况下逃脱 - 试试看!)

【讨论】:

谢谢。我不得不在rDate 值周围使用INT_PTR,这样就停止了警告。

以上是关于C26451 算术溢出访问 CStringArray 中的项目的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

整数算术溢出问题的分析

javascript算术溢出

货币类型的算术溢出错误