C++ 当函数中没有返回非void的return语句时检测到堆栈崩溃

C++ 当函数中没有返回非void的return语句时检测到堆栈崩溃,c++,gcc,gcc8,C++,Gcc,Gcc8,我一直在调试一个程序中的一个崩溃,该程序在检测到堆栈崩溃错误时中止。我已将崩溃范围缩小为一个功能,即: static ssize_t a (const char *x, const char *y, size_t z) { #ifdef SOME_FLAG return b(x, y, z); #endif } 由于我没有在任何地方定义某个_标志,因此该函数基本上不执行任何操作,并且在没有返回语句的情况下退出 我观察到,如果我只是在ifdef endif块之外添加一个返回0,程序不会因

我一直在调试一个程序中的一个崩溃,该程序在检测到堆栈崩溃错误时中止。我已将崩溃范围缩小为一个功能,即:

static ssize_t a (const char *x, const char *y, size_t z) {
#ifdef SOME_FLAG
    return b(x, y, z);
#endif
}
由于我没有在任何地方定义某个_标志,因此该函数基本上不执行任何操作,并且在没有返回语句的情况下退出

我观察到,如果我只是在ifdef endif块之外添加一个返回0,程序不会因为堆栈崩溃而中止。如果我将函数定义为static void而不是static ssize\t,也不会看到中止

缺少return语句会导致堆栈保护器触发中止吗?

关于C++:

如果除main之外的函数声明返回非void值而不返回或抛出,则程序的行为是未定义的

缺少return语句会导致堆栈保护器触发中止吗

对。这种行为没有定义。任何事情都可能发生。

关于C++:

如果除main之外的函数声明返回非void值而不返回或抛出,则程序的行为是未定义的

缺少return语句会导致堆栈保护器触发中止吗


对。这种行为没有定义。任何事情都有可能发生。

当然。当函数应该返回时,不返回是未定义的行为。未定义的行为UB允许编译器执行任何操作。@NathanOliver:在C中,如果调用方从未观察到未返回的值,则声明为返回值的函数被定义为等同于返回任意值。对于接受模式参数以在各种操作中进行选择的函数来说,这有时非常有用,因为只有一些操作可以返回任何有意义的内容。如果调用someFunc2的调用方不应该查看返回值,则someFunc加载返回值所花费的任何努力都将被浪费。@sg1993请选择一种语言。C和C++是不同的语言。此外,为了澄清,我没有在任何地方使用返回值。对于C++来说,这并不重要。看纳撒诺利弗的链接,当然。当函数应该返回时,不返回是未定义的行为。未定义的行为UB允许编译器执行任何操作。@NathanOliver:在C中,如果调用方从未观察到未返回的值,则声明为返回值的函数被定义为等同于返回任意值。对于接受模式参数以在各种操作中进行选择的函数来说,这有时非常有用,因为只有一些操作可以返回任何有意义的内容。如果调用someFunc2的调用方不应该查看返回值,则someFunc加载返回值所花费的任何努力都将被浪费。@sg1993请选择一种语言。C和C++是不同的语言。此外,为了澄清,我没有在任何地方使用返回值。对于C++来说,这并不重要。请参阅纳撒诺利弗的链接。在最坏的情况下,它有时甚至可能会起作用。@JesperJuhl,这是一个糟糕的情况。据我所知,UB的最坏情况实际上发生了:学究注:我不确定在汇编上下文中调用竞赛条件UB在技术上是否正确。在最坏情况下,它有时甚至可能看起来有效。@JesperJuhl这是一个糟糕的情况。据我所知,最糟糕的情况是UB:迂腐的注:我不确定在组装上下文中调用竞争条件UB在技术上是否正确