【发布时间】:2021-11-30 00:11:26
【问题描述】:
我正在尝试解决以下方法中出现的代码分析警告:
CStringArray* CCreateReportDlg::BuildCustomAssignArray(ROW_DATA_S &rsRowData)
{
INT_PTR iAssign, iNumAssigns, iUsedAssign;
CStringArray *pAryStrCustom = nullptr;
CUSTOM_ASSIGN_S *psAssign = nullptr;
if (rsRowData.uNumCustomToFill > 0)
{
pAryStrCustom = new CStringArray[rsRowData.uNumCustomToFill];
iNumAssigns = m_aryPtrAssign.GetSize();
for (iAssign = 0, iUsedAssign = 0; iAssign < iNumAssigns; iAssign++)
{
psAssign = (CUSTOM_ASSIGN_S*)m_aryPtrAssign.GetAt(iAssign);
if (psAssign != nullptr)
{
if (!psAssign->bExcluded)
{
pAryStrCustom[iUsedAssign].Copy(psAssign->aryStrBrothersAll);
iUsedAssign++;
}
}
}
}
return pAryStrCustom;
}
有问题的代码行是:
pAryStrCustom[iUsedAssign].Copy(psAssign->aryStrBrothersAll);
我为 32 位和 64 位编译此代码。发出的警告是:
警告 (C6385) 从
pAryStrCustom读取无效数据:可读大小为(size_t)*40+8字节,但可以读取80字节。
不知道是否相关,但CUSTOM_ASSIGN_S结构定义为:
typedef struct tagCustomAssignment
{
int iIndex;
CString strDescription;
CString strHeading;
BOOL bExcluded;
CStringArray aryStrBrothersAll;
CStringArray aryStrBrothersWT;
CStringArray aryStrBrothersSM;
BOOL bIncludeWT;
BOOL bIncludeTMS;
BOOL bFixed;
int iFixedType;
} CUSTOM_ASSIGN_S;
我的代码可以正常工作(多年来),但我可以通过改进代码来解决这个问题吗?我已阅读链接的文章,但我不清楚。我也看到过类似的问题(Reading Invalid Data c6385)。但在我的代码中,我看不出它是如何应用的。
【问题讨论】:
-
我认为这是警告
iUsedAssign可能太大。试试改成if (!psAssign->bExcluded && iUsedAssign < rsRowData.uNumCustomToFill) { pAryStrCustom[iUsedAssign]... -
@BarmakShemirani 谢谢。这确实会阻止显示警告。
标签: c++ visual-c++ mfc code-analysis