C ++编译器 - 忘记了返回语句

时间:2017-04-21 16:49:00

标签: c++ compiler-errors

我写了一个简单的函数来返回一个字符串让我在屏幕上显示。

static std::string  myFun(int myId){
  std::ostringstream stream;
  int myStatus;
  if(get_status(&myStatus)) stream << get_error();
  else{
    stream << "my status:" << myStatus;
  }
    return stream.str();
}

代码本身可能并不重要。但我把它包含在以防万一。我遇到的问题是因为在我最初的尝试中,我忘了包含return语句

return stream.str();

编译器编译时没有错误,但是当我运行它时。该程序不断收到像

这样的消息
Aborted(core dumped)

我吓坏了,我搜索了stackoverflow并安装了valgrind和所有东西。然后我检查代码,我意识到我只是忘记包含return语句!我希望编译器能够注意到这些错误。

有人可以向我解释为什么编译器无法检测到错误吗?

2 个答案:

答案 0 :(得分:7)

在非return函数的所有控制路径上没有void值的代码行为是 undefined 。 (C ++有很多未定义的构造;可能是对开发人员有利于最大性能和可移植性的结果。)

一个好的编译器会警告你这一点,甚至会提供设置来将警告(以及其他警告)升级为错误。请参阅编译器文档。

答案 1 :(得分:2)

因为,在一般情况下,编译器无法证明您的函数没有返回。如果它总是抛出异常会发生异常,但该异常来自另一个翻译单元中定义的函数,例如链接库?

因此语言标准不能要求编译器出错;因此,他们不会打扰。

但是,在这样的简单示例中,编译器可以告诉,并且当它可以时,它会警告您。如果你打开警告。你现在该做什么。

但最终,在C ++中,发现这种事情是程序员的责任。如果您的视力不足,静态分析工具可以帮助您避免此类错误。 :)