如何解决此 C6385 代码分析警告:读取无效数据
How to resolve this C6385 code analysis warning: Reading invalid data
我正在尝试解决出现在以下方法中的代码分析警告:
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 位编译此代码。发出的警告是:
Warning (C6385) Reading invalid data from pAryStrCustom
: the readable size is (size_t)*40+8
bytes, but 80
bytes may be read.
不知道有没有关系,不过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)。但是在我的代码中,我看不到它是如何应用的。
Warning... the readable size is (size_t)*40+8 bytes, but 80 bytes may be read.
此警告的措辞不准确,因为 size_t
不是数字,而是数据类型。 (size_t)*40+8
没有意义。它可能意味着:
Warning... the readable size is '40+8 bytes', but '80 bytes' may be read.
可以使用以下示例大致重现此警告:
//don't run this code, it's just for viewing the warning
size_t my_size = 1;
char* buf = new char[my_size];
buf[1];
//warning C6385: Reading invalid data from 'buf':
//the readable size is 'my_size*1' bytes, but '2' bytes may be read
警告正确且明显。 buf[1]
越界。编译器看到 buf
的分配大小是 my_size*1
,索引 1
正在访问 byte '2'
.我认为在其他地方编译器打印错误,但实际警告有效。
无论如何,只要确保iUsedAssign
在范围内
if (!psAssign->bExcluded && iUsedAssign < rsRowData.uNumCustomToFill)
{
...
}
我正在尝试解决出现在以下方法中的代码分析警告:
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 位编译此代码。发出的警告是:
Warning (C6385) Reading invalid data from
pAryStrCustom
: the readable size is(size_t)*40+8
bytes, but80
bytes may be read.
不知道有没有关系,不过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)。但是在我的代码中,我看不到它是如何应用的。
Warning... the readable size is (size_t)*40+8 bytes, but 80 bytes may be read.
此警告的措辞不准确,因为 size_t
不是数字,而是数据类型。 (size_t)*40+8
没有意义。它可能意味着:
Warning... the readable size is '40+8 bytes', but '80 bytes' may be read.
可以使用以下示例大致重现此警告:
//don't run this code, it's just for viewing the warning
size_t my_size = 1;
char* buf = new char[my_size];
buf[1];
//warning C6385: Reading invalid data from 'buf':
//the readable size is 'my_size*1' bytes, but '2' bytes may be read
警告正确且明显。 buf[1]
越界。编译器看到 buf
的分配大小是 my_size*1
,索引 1
正在访问 byte '2'
.我认为在其他地方编译器打印错误,但实际警告有效。
无论如何,只要确保iUsedAssign
在范围内
if (!psAssign->bExcluded && iUsedAssign < rsRowData.uNumCustomToFill)
{
...
}