0

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 が返された後、2103 行目のdbgheap.cにコントロールが移動します。

4

1 に答える 1

4

問題はここにあります:

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

strEntryValueサイズ 0 (に初期化されている)のバッファを渡しますが、""そのサイズはiMaxEntryLenです。そのGetPrivateProfileStringため、実際に取得したよりもはるかに大きなバッファーを持っていると考え、その境界を超えて書き込みます。

アップグレード後にこのエラーが発生する理由は、推定では、境界検証の改善です。このバグは VC6 にもありましたが、検出されませんでした。

于 2012-07-12T06:14:17.703 に答える