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 中的项目的主要内容,如果未能解决你的问题,请参考以下文章