【问题标题】:C++ Crash on a non-void function doesn't have return statement非 void 函数上的 C++ 崩溃没有返回语句
【发布时间】:2019-07-23 11:20:35
【问题描述】:

当像这样的非 void 函数没有返回任何内容时,我遇到了崩溃:

bool ClassA::foo() {
    //---do something---
}

void ClassA::foo2() {
   foo();
}

请注意,这个函数的返回值没有被使用。并且崩溃是 100% 可重现的。它每次都崩溃。理想情况下它应该产生一个警告,如果我不使用返回值,它不应该崩溃。

此 C++ 代码在 Android NDK 版本 r19 上编译。

同样的代码在 NDK-r15c 上也能正常工作。

最近有什么变化吗?

【问题讨论】:

  • 所以你有一个崩溃,通常这是由你的代码中的错误引起的。为什么你认为是这个问题造成的,你有什么证据?
  • 您需要向我们展示a Minimal, Reproducible Example
  • @john 因为当我输入返回语句时,崩溃就消失了。我已经尝试在很多地方更改代码。所以它不应该是悬空指针等的情况
  • @user18853 正如链接所解释的(不知道它是否准确),这是 C 的规则,而不是 C++。
  • “我认为如果你使用返回值,那么它就是一个未定义的行为。”不正确。即使不使用返回值也是未定义的行为。

标签: c++ c++11 android-ndk


【解决方案1】:

当像这样的非 void 函数没有返回任何内容时,我遇到了崩溃:

因为这是未定义的行为。

C++20 标准草案第 8.6.3 节:

从除 main 之外的 [non-void] 函数的末尾流出 导致未定义的行为。

请注意,这与函数的实际调用方式无关。因此,即使忽略返回值(如 OP 的情况),导致 UB 的也是“从末端流出”。

【讨论】:

  • 非常正确。这里有更多信息:gcc.gnu.org/bugzilla/show_bug.cgi?id=43943
  • 正确。在目前的草案中,但自 1998 年以来的所有标准都相同。
  • 您能否在回答中指出,不仅使用返回值是未定义的行为。但是什么也不返回也会导致未定义的行为。虽然 §8.6.3 中的上述陈述已经足够,但再次提及会更加强调这一点。这是最初的困惑。
【解决方案2】:

你是invoking Undefined Behavior:

如果一个函数被声明为返回一个值,但没有这样做,结果是未定义的行为(在 C++ 中)。一种可能的结果似乎有效,这与您在这里看到的差不多。

【讨论】:

    【解决方案3】:

    你的程序总是出错。

    函数必须有一个return,你的编译器应该已经警告你了。

    在 C++ 中,是否在调用点使用结果值是无关紧要的(尽管在 C 中不是这种情况)。

    只是你对以前的工具链不太走运,碰巧生成的代码碰巧不会导致崩溃作为其症状。这很不走运,因为它会提示您当时纠正错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-03
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 2011-10-26
      相关资源
      最近更新 更多