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

C26451 Arithmetic overflow accessing items in a CStringArray

得到这个代码:

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 行代码,我收到代码分析警告:

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).

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

的字面值

变量m_aryDateTrans定义为:

CStringArray m_aryDateTrans[NUM_DATE_TRANS];

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

我正在 32 位和 64 位环境中编译。

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

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

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