博主这段时间一方面非常忙,另一方面有个关乎自身重大问题没有确认,因此博客停更了一段时间,前2天终于将那个问题确认了,谢天谢地,虚惊一场。今天终于有点时间写写代码,做了一个统计函数,执行时却报错:
报错信息为:
Run-Time Check Failure #2 - Stack around the variable 'staticsResult' was corrupted.
引发错误的代码为:
int loop, ruleLoop;
mModN* pMod;
int staticsResult[80];
int modCountPerRec;
//分析取模数据情况
for (ruleLoop = 0; ruleLoop < nModN10Count; ruleLoop++)
{
memset(&staticsResult[0], 0, 80 * sizeof(int));
pMod = &mModN10Set[ruleLoop];
for (loop = startRec; loop < gHistRecCount; loop++)
{
modCountPerRec = 0;
for (auto number : hisRec[loop].data.number)
{
if ((number % pMod->div) == pMod->rem)modCountPerRec++;
}
staticsResult[modCountPerRec - 1]++;
}
logMessage("在统计的%d记录中除%d余%d的数据个数及记录数对应关系如下:", gHistRecCount - startRec, pMod->div, pMod->rem);
for (loop = 0; loop < 80; loop++)
if (staticsResult[loop])
logMessage("%d个%d条 ", loop + 1, staticsResult[loop]);
logMessage("\n");
}
该错误很显然是变量staticsResult导致堆栈崩溃了,才开始以为时memset的问题,但不是。而错误是在函数退出时报错,debug找不到具体引发错误的代码,仔细检视了一下代码也没找到问题。没办法,只好祭出大杀器,就是围绕staticsResult所有访问代码进行技巧性的注释处理,终于确认了问题所在,就是staticsResult[modCountPerRec - 1]++访问时,由于modCountPerRec 可能为0导致下标错误导致的。
因此碰到这种问题,就是针对报错信息中给出的变量,将其访问语句逐一检视甚至注释来确认问题。之所以说进行技巧性的注释,是因为有些注释可能导致后面代码直接报错,不会出现堆栈问题。
以前用过一个BOUNDCHECK的工具,对这种内存越界访问能精确定位,不知道VC++现在的版本有没有类似的工具。