【发布时间】:2011-06-07 05:24:02
【问题描述】:
与 Java 不同,在 C/C++ 中,允许:
int* foo ()
{
if(x)
return p;
// what if control reaches here
}
这通常会导致崩溃和难以调试的问题。为什么标准不强制对非void函数进行最终返回? (编译器会为错误的return 值生成错误)
gcc/msvc 中是否有任何标志来强制执行此操作? (类似于-Wunused-result)
【问题讨论】:
-
下面的要点是:如果您想要这些类型的检查,请在 gcc 上使用
-Wall,并在 Visual Studio 中使用高警告级别(3 或 4)。 -
我一直希望有一个编译器标志,它会导致所有函数的末尾都有
throw "LOL Y U HERE??";。行为是未定义的,所以任何事情都可能发生,并且抛出异常当然可以作为任何事情。仅用于测试目的;我会同意他们在发布时得到优化。 -
如果
x被声明为const bool x = true;,则不是未定义的。 -
@Dennis:IIRC,在函数末尾运行不是 UB,除非调用者尝试使用返回值。
-
风格差和UB是有区别的。
标签: c++ c return-value language-lawyer compiler-flags