我在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错误还是一个特例?
答案 0 :(得分:5)
您的代码在没有return
任何内容的情况下到达函数的末尾。
这是未定义的行为,因此编译器完全正确。
答案 1 :(得分:2)
在C ++中,如果函数的执行结束而该函数没有调用return
语句(并且它不是void
函数),那么行为是未定义的。
顾名思义,undefined意味着几乎任何事情都可能发生。在缺少return语句的情况下,最常见的行为是:
然而,还有很多其他的可能性。值得注意的是,一个经过检测的构建可能会决定挂起或崩溃(对原因有或多或少的解释),或者编译器可能会对你发挥“诡计”,假设你支持你的结尾“我永远不会编写展示未定义的代码行为“(您在不知情的情况下接受的隐式合同),因此该代码永远不会被执行,并且可以完全剔除。
悬挂是可能的。
现在,真正的问题是你没有得到编译器的任何警告吗?这些不是“健谈”的消息,它们通常指向真正的问题!