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)]);
(你也许可以在没有第二次施法的情况下逃脱 - 试试看!)
得到这个代码:
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)]);
(你也许可以在没有第二次施法的情况下逃脱 - 试试看!)