2017-10-18 113 views
3

编译constexpr代码时编译以下代码(godbolt):“ERR:SEH:setup_exception堆栈溢出” 在MSVC

constexpr bool f(const char *&s) { 
    do { 
    ++s; 
    } while (*s); 
    return true; 
} 

constexpr bool g(const char *s) { 
    return f(s); 
} 

int main() { 
    static_assert(g("x"), ""); 
} 

给出MSVC此错误:

err:seh:setup_exception stack overflow 1552 bytes in thread 0058 eip 000000007b48dad8 esp 0000000000131000 stack 0x130000-0x131000-0x1130000 

而其他的编译器( GCC和Clang)高兴地接受它。

为什么不在MSVC上编译这个代码,我该如何解决它?

+0

我能想到的唯一的事实是,在执行空检查之前,您正在增加指针*。这将在空字符串上调用未定义的行为。我不知道为什么这是一个问题。在Godbolt中更改代码以检查增量之前似乎无法解决问题。 – Xirema

+0

很明显是一个错误。即使该代码无效,这也不是MSVC应该给你的信息。 –

回答

1

我能够得到它通过从函数签名参考预选赛(Godbolt)编译:

constexpr bool f(const char *s) {//No longer passes a pointer by reference 
    while(*s) { //This avoids undefined behavior when the passed string is empty 
    ++s; 
    } 
    return true; 
} 

constexpr bool g(const char *s) { 
    return f(s); 
} 

int main() { 
    static_assert(g("x"), ""); 
} 

我不知道为什么通过引用传递指针会导致这个错误,不过,我认为这可能是MSVC编译器中的一个错误。你应该将错误发布到他们的bug tracking forum