首页 > 解决方案 > c++代码在返回值缺失时表现异常

问题描述

GCC 9.2.1 给出了一个警告,即“在返回非 void 的函数中没有返回语句”,但是,代码确实可以编译(我使用标志 -O3 和 -finline-functions 编译)。

我希望程序没有输出,因为 while 循环的条件应该评估为假。但是,我从程序中得到了以下输出(在 while 循环中打印):

“它!= mMap.end():0”

输出特别奇怪,因为打印的值(即 0 或“假”)也是 while 循环的条件。

打印后,程序会出现段错误,因为迭代器变得无效(通过it++在永远不应该执行的 while 循环中)。

我想这都可以归结为缺少的返回值。但是,令我惊讶的是,代码表现得如此病态只是因为没有提供返回值。我很感激能深入了解正在发生的事情。

#include <iostream>
#include <tr1/unordered_map>

struct Test
{
  int Dummy (void) const
  {
    std::tr1::unordered_map<int, int>::const_iterator it = mMap.begin();
    while (it != mMap.end())
    {   
      std::cout << "it != mMap.end(): " << (it != mMap.end()) << std::endl;
      it++;
    }   
  }
  std::tr1::unordered_map<int, int> mMap;
};

int main (void)
{
  Test test;
  test.Dummy();
  return 0;
}

标签: c++

解决方案


从非void函数返回而不提供返回值是欠精细的行为,因此编译器可以做任何它想做的事情。

特别是在这种情况下,编译器所做的似乎是它发现跳过循环会触发 UB,因此假设循环至少进入一次。因此它假设它可以安全地进入循环而不检查条件,因为编译器相信程序的作者没有调用任何未定义的行为。

这当然是我的猜测。


推荐阅读