2007年9月6日星期四

Stack corruption

真是看不出来,下面的这段代码引起了栈异常(stack corruption detected)。

{

char cn[60];

memset(cn,0,sizeof(cn));

char defile[FILENAME_MAX+4]={0};

strcpy(defile,localFilename);

strcat(defile,".de");

if (getCommonNameFromFile(localFilename,cn))

{

char *certfile=Singleton<CertList>::instance()->getCertFile(cn);

if (certfile)

{

int nerr=DeFile(localFilename,defile,certfile);

if (nerr==0)

{

//文件验签也OK

//那么,检查E语言

if (pReader==NULL)

{

pReader=new Reader();

}

getLogger()->LogMessage("Session %3d 正在进行E语言检查",id);

ret=pReader->checkEPack(defile);

remove(defile);

return ret;

}

}

}

}

真的好奇怪,这个问题头一次碰到。不就是这么一个auto类型的cn变量,也能出错?真是神了。。。

我把这个cn换成new的堆类型,结果就是堆异常。。。

Google一下,看到这么一篇文章:一个不小心引发的Heap corruption ,还有他的 探索Heap Corruption
大意就是访问,写越界。这里访问到了超过cn[60]的位置,怎么会这样呢??

我仔细看了下代码,发现 原来cn传入的函数中,都认为cn的大小为64。。。

因为64是默认的CommonName的最大长度。这里面一时忘记,写成六十了,结果产生异常。

还好被调试器发现了,要不然还不知道会出现什么恶劣结果呢。


后记:这也告诫我们,最好定义一个大小常量或者宏,每个地方统一用这个产量来定义大小,就不会出错啦

没有评论: