Windows SEH&;x64调用约定,编译器错误?还是解开虫子?

Windows SEH&;x64调用约定,编译器错误?还是解开虫子?,windows,exception,visual-c++,Windows,Exception,Visual C++,我的代码如下: int bar() { int st = XXX_OK; __try { ... //exception occurs here } __except (filter()) //filter returns EXCEPTION_EXECUTE_HANDLER and doesn't change rbp { // `rbp` is changed when run here st =

我的代码如下:

int bar()
{
    int st = XXX_OK;
    __try {
        ...     //exception occurs here
    }
    __except (filter()) //filter returns EXCEPTION_EXECUTE_HANDLER and doesn't change rbp
    { 
        // `rbp` is changed when run here
        st = XXX_EXCEPTION;
    }

    return st;
}

int foo()
{
    int x = 0;  //Here rbp approximately equals rsp.
    int y = bar(); // bar changes the value of rbp.
    x = 1       // mov [rbp+0x10], 1; To access a stack-var. Since rbp is changed, crash here
}
根据。rbp是非政治性的,
bar
不会改变它的值

此外,SEH并不总是更改rbp:假设我的代码在\uuuu try中调用如下函数:

static int my_glcp_run(PLUGIN_CONTROL_BLOCK *pcb, void *data)
{

    string s;
    s += "-----\n";
    pcb->chkcode = 1024;
    const char *msgx = get_arg_as_string(data, 0);
    MessageBoxA(HWND_DESKTOP, msgx, "(Warning From xxx)", MB_OK);
    __readcr0();     //this line is to raise an exception
    s += "-----\n";  //**try to remove this line**
    sendmessage(s.c_str(), s.length());
    return 0;
}
如果我删除
s+=“----\n”
则rbp不会更改,否则rbp会更改。事实上,这一行永远不会执行,但它改变了SEH平仓的行为。我想知道为什么

我的问题是:
bar
为什么打破了他不改变rbp的惯例


顺便说一句,我的开发是VS2013。

VS2013不是一个非常幸运的版本。很明显,你也有VS2019,那么告诉我们它的功能。嗯,我试过vs2017,问题已经解决了。我认为这是vs2013的一个缺陷