【发布时间】:2010-09-13 15:31:32
【问题描述】:
我们最近尝试将我们的一些 Visual Studio 项目拆分为库,并且在一个测试项目中似乎一切都可以正常编译和构建,其中一个库项目作为依赖项。但是,尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息:
运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用不同调用约定声明的函数指针的结果。
我们甚至从未为我们的函数指定调用约定(__cdecl 等),将所有编译器开关保留为默认值。我检查了项目设置对于跨库和测试项目的调用约定是一致的。
更新:我们的一位开发人员将“基本运行时检查”项目设置从“两者(/RTC1,等效于 /RTCsu)”更改为“默认”,运行时消失,程序运行明显正确。我完全不相信这一点。这是一个适当的解决方案,还是一个危险的黑客攻击?
【问题讨论】:
-
非常高兴运行时为您捕捉到了这一点。如果没有,计算机接下来要做的就是粉碎堆栈内容并以可怕的方式崩溃。 (调试堆栈损坏不适合胆小的人。)
-
RE 您的更新:不,这不是一个合适的解决方案。您所做的只是禁用检查。这就像把头埋在沙子里一样。问题仍然存在,而且毫无疑问会在以后出现在你面前,届时将更难追查。
标签: c++ visual-c++ x86 stack calling-convention