【问题标题】:C++ Inline Function Throwing Exception: Run-Time Check Failure #0 - The value of ESP was not properlyC++ 内联函数抛出异常:运行时检查失败 #0 - ESP 的值不正确
【发布时间】:2011-11-13 22:56:02
【问题描述】:

我写一些内联函数是为了好玩,它会抛出一个我以前从未遇到过的异常。有趣的是,如果我继续,在异常停止了我的程序的执行流程之后,它将返回两个整数的和。

__declspec(dllexport) int addintegers(int one, int two)
{
    int answer = 0;
    __asm
    {
        mov eax, 0
        push two
        push one
        call add
        mov answer, eax
    }
    return answer;

} // Debugger stops here with exception message

异常消息:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是用一个调用约定声明的函数和一个用不同调用约定声明的函数指针调用的结果。

// add function definition

int add(int one, int two)
{
    return one + two;
}

【问题讨论】:

  • 给微软买一支雪茄,让你远离麻烦。你要么必须让你的 add() 函数 __stdcall 要么你必须在调用后自己清理堆栈,两次弹出。
  • 我确实有add的定义

标签: c++ visual-studio-2010 inline inline-assembly


【解决方案1】:

我对汇编程序了解不多,您也没有向我们展示add() 的声明,但是如果它符合C 的调用约定,则必须在调用返回给调用者后从堆栈中弹出参数.

要求调用者而不是被调用者清理堆栈是允许 C 具有可变数量参数的函数的原因,例如 printf()

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 2012-04-22
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多