为什么我的 C++ 程序会在我忘记 return 语句时崩溃,而不仅仅是返回垃圾?

NXT*_*NXT -6 c++ freebsd llvm clang llvm-clang

我最近开始使用 CLang 来编译嵌入式 C++ ARM 程序。

在此之前,我使用 GCC 和 C,几乎专门用于嵌入式工作。

我注意到当我有一个返回值的方法时,我忘记了 return 语句,程序核心转储。除了来自我的设备驱动程序之一的“msleep error -1”之外,没有打印任何错误。这是在 FreeBSD 上。

我希望忘记 return 语句只会导致函数返回垃圾,而不是核心转储。

编辑:我要返回一个布尔值,而不是指针或对象或任何复杂的东西。即使返回值无关紧要,程序也会崩溃。

到底是怎么回事?

例如:

bool MyClass::DummyFunc() {
  <do some stuff and forget the return value>     
}
Run Code Online (Sandbox Code Playgroud)

别处:

if(pMyObj->DummyFunc()) {
  print ("Hey, it's true!\n");
} else {
  print ("Darn, it's false!\n");
}
Run Code Online (Sandbox Code Playgroud)

无论返回值如何,该代码都不应崩溃。

Tre*_*eld 5

来自二手资源,因为我不想为 C++ 标准付费,它显然说:

从函数的末尾流出相当于没有值的返回;这会导致值返回函数中的未定义行为。

这是 C++,当你做一些未定义的事情时,你应该预料到它会导致你的计算机崩溃并吃掉你的衣服,除非实现另有说明。

  • @NXT 从那句话中,我不确定您是否否认未定义行为的含义,或者您是否只是好奇是什么让 Clang 内部发生这种情况。如果是后者,您可能会更幸运地提出一个新问题,以明确这一意图,并提供在我们自己的系统上重现行为的步骤。 (2认同)