用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行。
答案 0 :(得分:4)
问题在于:
dwRetCode = GetPrivateProfileString(cszVariables,
strEntryName,
"",
strEntryValue.GetBufferSetLength(strEntryValue.GetLength()),
iMaxEntryLen,
strFilename);
您传递大小为0的缓冲区(strEntryValue
已初始化为""
),但请说明其大小为iMaxEntryLen
。所以GetPrivateProfileString
认为它有一个比它实际得到的更大的缓冲区,并且超出了它的范围。
升级后出现此错误的原因是猜测,边界验证的改进。 VC6中也存在错误,它没有被检测到。