我一直在调试程序崩溃,该崩溃因错误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语句会导致堆栈保护器触发中止吗?
答案 0 :(得分:4)
关于C ++:
如果声明有返回非空值的函数(main
除外)而没有返回或抛出,则程序的行为是不确定的。
缺少return语句会导致堆栈保护器触发中止吗?
是的。该行为是不确定的。任何事情都会发生。