【问题标题】:Function with missing return value, behavior at runtime缺少返回值的函数,运行时的行为
【发布时间】:2010-04-08 06:54:02
【问题描述】:

正如所料,编译器(VisualStudio 2008)会给出警告

警告 C4715: 'doSomethingWith' : 不是 所有控制路径都返回一个值

编译以下代码时:

int doSomethingWith(int value)
{
    int returnValue = 3;
    bool condition = false;

    if(condition)
        // returnValue += value; // DOH

    return returnValue;
}

int main(int argc, char* argv[])
{
    int foo = 10;
    int result = doSomethingWith(foo);
    return 0;
}

但是程序运行得很好。 doSomethingWith()函数的返回值为0。

只是未定义的行为,或者是否有特定的规则如何在运行时创建/计算结果值。非 POD 数据类型作为返回值会发生什么?

【问题讨论】:

标签: c++


【解决方案1】:

这是 ISO C++ 标准第 6.6.3 节中指定的未定义行为:

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

【讨论】:

  • 具体措辞:——从函数的末尾流出相当于没有值的return;这会在返回值的函数中导致未定义的行为。
  • 'main' 函数是该规则的一个例外。在 nabulke 代码中,最后一个 'main' 函数行是多余的。
  • 作为此答案的一个重要补充,3.6.1/5 声明:“如果控制到达main 的末尾而没有遇到return 语句,则效果是执行return 0;"。
  • @LightnessRacesinOrbit:即使在 main 函数中省略它仍然是一种奇怪的做法,尤其是在不清楚是否有意省略的情况下。
  • @lpapp:我明白你为什么会这样说,尽管我不同意:从main 中省略return 0 是非常常见的,而且通常很明显不是错误。在main 的最外层范围的最后返回任何 0 将是奇怪的做法!
【解决方案2】:

对于 x86 处理器,标准调用约定将返回值放入 EAX 寄存器。实际上,这意味着对于大多数编译器,如果我们到达函数的末尾而不返回,则将返回最后一次数学运算的结果。但是,你不能依赖它,它也不便携。

http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

【讨论】:

  • 有兴趣知道!我们实际上有一个函数缺少返回值,因为这个原因正在通过测试。
【解决方案3】:

更新@piotr 答案。

来自C++17 Standard 第 9.6.3 节

从构造函数、析构函数或函数的末尾流出 cv void 返回类型等效于没有操作数的返回。 否则,从除 main (6.6.1) 之外的函数的末尾流出 导致未定义的行为。

【讨论】:

    【解决方案4】:

    不从返回值的函数返回值会导致未定义的行为。

    【讨论】:

      猜你喜欢
      • 2020-04-20
      • 2022-09-27
      • 2016-10-24
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2018-07-22
      相关资源
      最近更新 更多