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

问题描述 投票:0回答:1

得到这个代码:

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++ visual-studio mfc visual-studio-2019
1个回答
3
投票

[]
CStringArray
运算符
采用
INT_PTR
参数,该参数在
x64
构建中为64位,对于
x86
为32位。因此,您应该使用如下所示的(看起来相当笨拙的)代码:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.