clang ++ bug还是我不明白的东西?

时间:2014-10-19 14:21:28

标签: c++ clang

我在g ++中编译了以下代码并且它有效。

bool keyExists(Obj key){
    findIn(key,true,false,false,nullptr,nullptr,1,0,0);
}

我使用clang ++编译它,当程序运行时冻结。

我将行改为:

bool keyExists(Obj key){
    return findIn(key,true,false,false,nullptr,nullptr,1,0,0);
    //findIn(key,true,false,false,nullptr,nullptr,1,0,0);
}

现在可行。

我想它不应该那样。这是一个已知的Clang错误还是一个特例?

2 个答案:

答案 0 :(得分:5)

您的代码在没有return任何内容的情况下到达函数的末尾。

这是未定义的行为,因此编译器完全正确。

答案 1 :(得分:2)

在C ++中,如果函数的执行结束而该函数没有调用return语句(并且它不是void函数),那么行为是未定义的。

顾名思义,undefined意味着几乎任何事情都可能发生。在缺少return语句的情况下,最常见的行为是:

  • 获取垃圾值,其效果取决于您如何使用它
  • 获得“报废”值,这是出于某种原因,你最终得到了函数的最新表达式的值,这通常是你想要的

然而,还有很多其他的可能性。值得注意的是,一个经过检测的构建可能会决定挂起或崩溃(对原因有或多或少的解释),或者编译器可能会对你发挥“诡计”,假设你支持你的结尾“我永远不会编写展示未定义的代码行为“(您在不知情的情况下接受的隐式合同),因此该代码永远不会被执行,并且可以完全剔除。

悬挂是可能的。


现在,真正的问题是你没有得到编译器的任何警告吗?这些不是“健谈”的消息,它们通常指向真正的问题!