将项目从vc6升级到vc9后检测到HEAP CORRUPTION

时间:2012-07-12 05:48:17

标签: visual-c++ mfc vc6

用vc6编写的函数。

bool CProductionTestDlg::GetVariables(CString strFilename, CMapStringToOb *cVariableMap)
{
    int     iMaxEntryLen   = 1000;
    //char    rgbEntryNames[1000];                //previous
    char  *rgbEntryNames = (char*)malloc(iMaxEntryLen * sizeof(int)); //Now
    CString strEntryName   = "";
    CString strEntryValue  = "";
    UINT    uiSeperator    = 0;
    ULONG   dwRetCode, dwSizeOfReturn;

    dwSizeOfReturn = GetPrivateProfileString(cszVariables,
                                            NULL,
                                            "",
                                            rgbEntryNames,
                                            iMaxEntryLen,
                                            strFilename);

    while ( uiSeperator < dwSizeOfReturn )
    {
        strEntryName.Format("%s", &rgbEntryNames[uiSeperator]);
        uiSeperator += strEntryName.GetLength() + 1;

        CString *strValue = new CString();
        dwRetCode = GetPrivateProfileString(cszVariables,
                                            strEntryName,
                                            "",
                                            strEntryValue.GetBufferSetLength(strEntryValue.GetLength()),
                                            iMaxEntryLen,
                                            strFilename);
        strValue->Format("%s", strEntryValue);        
        cVariableMap->SetAt(strEntryName, (CObject*)strValue);

    }

    return true;
}

现在我在vs08上升级它。项目构建正确,但是当我打开exe时会抛出异常

* HEAP CORRUPTION DETECTED * CRT检测到应用程序在堆缓冲区结束后写入内存。

当我调试我的应用程序时,控件在返回true后返回 dbgheap.c 第2103行。

1 个答案:

答案 0 :(得分:4)

问题在于:

dwRetCode = GetPrivateProfileString(cszVariables, 
    strEntryName, 
    "", 
    strEntryValue.GetBufferSetLength(strEntryValue.GetLength()), 
    iMaxEntryLen, 
    strFilename);

您传递大小为0的缓冲区(strEntryValue已初始化为""),但请说明其大小为iMaxEntryLen。所以GetPrivateProfileString认为它有一个比它实际得到的更大的缓冲区,并且超出了它的范围。

升级后出现此错误的原因是猜测,边界验证的改进。 VC6中也存在错误,它没有被检测到。