C 编译器 - 被遗忘的返回语句

C++ compiler - forgotten return statement

本文关键字:返回 语句 被遗忘的 编译器      更新时间:2023-10-16

我写了一个简单的功能,以返回一个字符串供我显示在屏幕上。

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 stream.str();

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

之类的消息
Aborted(core dumped)

我吓坏了,我搜索我堆叠并安装了Valgrind等。然后我检查代码,我意识到我只是忘记包括返回语句!我希望编译器会注意到这类错误。

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

在非void函数的所有控制路径上没有return值的代码行为是 nest 。(C 具有大量未定义的结构;也许是由于最大程度地表现性能和可移植性而不是对开发人员的仁慈。(

一个好的编译器会警告您,甚至会为您提供设置,以将警告(以及其他(升级为错误。咨询您的编译器文档。

,因为在一般情况下,编译器不可能证明您的函数不会返回。相反,如果它总是引发异常,但是该异常来自另一个翻译单元中定义的函数,例如链接的库?

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

然而,在这样的简单示例中,编译器 can 都会告诉您,它会警告您。如果您打开警告。您现在应该做。

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