当函数中没有return语句返回非空时,检测到堆栈崩溃

时间:2019-02-26 17:31:18

标签: c++ gcc gcc8

我一直在调试程序崩溃,该崩溃因错误stack smashing detected而中止。我已将崩溃范围缩小为一个函数,即:

static ssize_t a (const char *x, const char *y, size_t z) {
#ifdef SOME_FLAG
    return b(x, y, z);
#endif
}

由于我没有在任何地方定义SOME_FLAG,因此该函数实际上什么也不做,并退出而没有返回语句。

我观察到,如果我只是在return 0块外添加#ifdef #endif,则程序不会中止(由于堆栈粉碎)。如果将函数定义为static void而不是static ssize_t

,也看不到中止

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

1 个答案:

答案 0 :(得分:4)

关于C ++:

如果声明有返回非空值的函数(main除外)而没有返回或抛出,则程序的行为是不确定的。

  

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

是的。该行为是不确定的。任何事情都会发生。