【问题标题】:How to resolve this C6385 code analysis warning: Reading invalid data如何解决此 C6385 代码分析警告:读取无效数据
【发布时间】: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-&gt;bExcluded &amp;&amp; iUsedAssign &lt; rsRowData.uNumCustomToFill) { pAryStrCustom[iUsedAssign]...
  • @BarmakShemirani 谢谢。这确实会阻止显示警告。

标签: c++ visual-c++ mfc code-analysis


【解决方案1】:

警告...可读大小为 (size_t)*40+8 字节,但可以读取 80 字节。

此警告的措辞不准确,因为size_t 不是数字,而是数据类型。 (size_t)*40+8 没有意义。它可能意味着:

警告...可读大小为“40+8 字节”,但可以读取“80 字节”。

这个警告可以用下面的例子大致重现:

//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)
{
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多