【问题标题】:C26451 Arithmetic overflow accessing items in a CStringArrayC26451 算术溢出访问 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 位环境下编译。

【问题讨论】:

    标签: c++ mfc visual-studio-2019


    【解决方案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,这样就停止了警告。
    猜你喜欢
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多