为何GCC无法识别无限循环不终止?需__builtin_unreachable()的原因
问题解答
为什么移除__builtin_unreachable()会触发警告?
GCC 5.4.0的-Wreturn-type警告逻辑比较直接:它会检查返回非void类型的函数是否存在显式的return语句,不会深度分析代码路径是否真的能到达函数末尾。哪怕写了while(1);这种看似明显的无限循环,旧版本GCC的警告检查模块也不会将这种情况判定为“函数永远不会返回”,所以依然会抛出“无返回语句”的警告。
__builtin_unreachable()的作用是什么?
这个内置函数是给编译器的明确提示:程序执行到此处是完全不可能的。添加它之后,编译器就会明确知道函数H的末尾永远不会被执行到,自然就不会再检查是否需要return语句,警告也就消失了。
为什么GCC无法识别无限循环不会终止?
主要有两点原因:
- 旧版本GCC的静态分析能力有限,警告检查模块没有实现“识别无限循环并判定函数不会返回”的逻辑;
- 从C标准的角度出发,编译器允许对没有副作用的循环进行优化(比如空循环可能被直接删除),所以编译器不会默认假设
while(1);一定永远不会终止,也就不能以此为依据跳过返回语句的检查。
内容的提问来源于stack exchange,提问作者personal_cloud
相关产品推荐
相关产品推荐

