1

我一直在调试因错误而中止的程序中的崩溃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 语句会导致堆栈保护器触发中止吗?

4

1 回答 1

4

关于 C++:

如果声明返回非 void 值的函数(除了main)没有返回或抛出,则程序的行为是未定义的。

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

是的。行为未定义。任何事情都有可能发生。

于 2019-02-26T17:36:42.280 回答