"The value of ESP was not properly saved across a function call."问题

"The value of ESP was not properly saved across a function call." problem

本文关键字:across function 问题 call saved not value The of ESP was      更新时间:2023-10-16

可能重复:
奇怪的MSC 8.0错误:“ESP的值未通过函数调用…正确保存”

我有一个OBJ文件,我没有任何源代码。我在另一个项目中使用过它,没有任何问题。现在我正试图在另一个项目中使用它。这是我申报的方式:

extern "C" bool FileCompare(char* file1, char* file2);

我把它用在这样的函数中:

void myFunction() {
    //some code
    FileCompare(file1, file2); // file1 and 2 are char arrays
}

然后在我的主代码中,我调用myFunction:

int main() {
    ... some code
    myFunction()
}

当myFunction返回时,我在Visual Studio 2010调试器中得到"ESP的值未在函数调用中正确保存。"。然而,我知道FileCompares(obj文件中的函数)完成了它的工作。当我评论出来的时候,一切都很好。我过去使用过这个OBJ文件,没有遇到任何问题。考虑到我没有obj文件的来源,我能做些什么来尝试"修补"这个问题吗?

非常感谢

更多细节:我怀疑代码使用了不带RET的CALL(它是在程序集中编写的)。

编辑:我不知道我说的话对事情的工作方式是否有意义,但既然函数损坏了,esp无论如何都可以保存它,并在函数返回后恢复它?

这可能是由于FileCompare()中的错误,或者myFunction()和/或FileCompare()的声明和实现之间的调用约定不匹配。

您可以在FileCompare()的原型上使用适当的说明符(比如__cdecl)来解决这个问题。或者,您可能需要为FileCompare()函数创建一个汇编语言包装器来修复问题(因为您说您不再拥有FileCompare()的源代码)。

要想在没有FileCompare()源代码的情况下准确地找出问题所在,可能需要在调试器中逐步完成程序集。

有一次,当我用旧的头文件编译一个项目时,我遇到了类似的问题,这个头文件与最新的头文件相差一个虚拟函数。