“在函数调用中没有正确保存ESP的值。”问题

时间:2011-06-18 18:34:56

标签: c++ x86 stack

  

可能重复:
  Weird MSC 8.0 error: “The value of ESP was not properly saved across a function call…”

我有一个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返回时,我得到“ESP的值未在函数调用中正确保存。”在Visual Studio 2010调试器中。但是,我知道FileCompares(obj文件中的函数)可以完成它的工作。当我发表评论时,一切正常。我过去使用过这个OBJ文件没有任何问题。考虑到我没有obj文件的来源,我可以做些什么试图“修补”这个问题吗?

非常感谢

更多细节:我怀疑代码使用不带RET的CALL(用汇编语言编写)。

编辑:我不知道我所说的内容是否合理,但由于函数会破坏esp,无论如何都要保存并在函数返回后恢复它?

2 个答案:

答案 0 :(得分:4)

这可能是由于FileCompare()中的错误或myFunction()和/或FileCompare()的声明和实施之间的调用惯例不匹配。

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

确定没有FileCompare()源的确切错误可能需要在调试器中逐步完成程序集。

答案 1 :(得分:4)

当我在针对旧头文件编译一个项目时,我遇到了类似的问题,该文件与最新的一个虚拟函数不同。