天天看点

"在已损坏了程序内部状态的XXX.exe 中发生了缓冲区溢出"的一种可能原因

今天软件突然出现崩溃的bug:

在release模式下,总是崩溃在一个函数A的结束处,打印输出调试,发现如果注释该函数A中的某个函数B的调用,崩溃不会发生;除此之外,注释函数B中的任何代码都不起作用。

崩溃时弹出的对话框为:"在已损坏了程序内部状态的 BREW_Simulator.exe 中发生了缓冲区溢出。按“中断”以调试程序,或按“继续”以终止程序。”;

刚开始以为是strcpy/sprintf等函数越界或线程不同步,但是对所有线程、相关函数排查后,无果。

最后发现,原来是函数A调用函数B所用的dll头文件与函数B所在库的实际头文件不匹配。

A所包含的头文件中,B函数声明如下:void FunB(bool b);

而函数B的实际声明为:void FunB(void);

所以调用时就总是会报告栈已破坏。