[C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异
2023-03-20 15:31:25 时间
最近做一个C++开源项目发现一个奇怪问题,通过clang编译链接执行程序每到有一个就崩溃了,gcc下则没有此问题。
后来通过调试,发现原因是bool返回的方法是没有return语句!问题是为啥还能通过编译呢?
列子如下:
#include <iostream> class Test { public: bool yes(); }; bool Test::yes() { std::cout << "yes" << std::endl; // return false; }; int main() { Test *t = new Test; bool r = t->yes(); std::cout << "yes->" << r << std::endl; return 0; }
用g++编译得到警告但是通过了,并且执行得到正确预期(但是值为啥是64?没有找到原因!)。
1 gaojie@root-host:~$ g++ bool.cpp 2 bool.cpp: In member function ‘bool Test::yes()’: 3 bool.cpp:11:1: warning: no return statement in function returning non-void [-Wreturn-type] 4 11 | }; 5 | ^ 6 gaojie@root-host:~$ ./a.out 7 yes 8 yes->64
用clang++编译同样类似警告也通过了,但执行出现异常指令。
gaojie@root-host:~$ clang++ bool.cpp bool.cpp:12:1: warning: non-void function does not return a value [-Wreturn-type] }; ^ 1 warning generated. gaojie@root-host:~$ ./a.out yes 非法指令 (核心已转储)
本着好奇的心理,就想知其原因为啥会有不一样的结果呢?就想通过汇编语法查询差异。
通过 https://godbolt.org/得到如下:
g++汇编指令如下:
clang++汇编指令如下:
通过yes方法发现差异了,
gcc汇编有return指令可以正常返回。
而clang就ud2指令结束了,查阅相关资料得到,UD2是一种让CPU产生invalid opcode exception的软件指令. 内核发现CPU出现这个异常, 会立即停止运行.
问题原因找到了就是gcc和llvm对编译申明返回值方法而没有返回语句的处理结果是不一样的,g++保证通过而clang则认为无法处理(给了异常指令)退出程序。
相关文章
- Github 的系统内部都在用什么开源软件?
- 12个ggplot2拓展程序助你强化R可视化
- Google首席决策师告诉你AI和数据科学团队需要哪10种角色?
- 【Kaggle入门级竞赛top5%排名经验分享】— 分析篇
- 在 Linux下编译及调试 C 代码的简易指南
- 12 个让项目经理比程序员更痛苦的问题
- 从三个方向去预测大数据发展的未来趋势
- Web端PHP代码函数覆盖率测试解决方案
- 扫盲:Hadoop分布式文件系统(HDFS)基础概念讲解!
- 斯坦福开源Weld:高效实现数据分析的端到端优化
- Java Executor 框架学习总结
- 掌握这五类数据科学项目,找到一份好工作
- 程序员大神Anders首次访华 畅聊编程语言趋势
- 耗时两个月,国内传统企业对Hadoop到底什么态度?
- 你的程序员是一种什么样的怪物?
- 浅谈 PHP 中的多种加密技术及代码示例
- NBA球星是如何投篮的?把詹姆斯、库里的投篮数据图3D打印出来
- 实时数据平台设计:解决从OLTP到OLAP实时流转缺失
- 美团R语言数据运营实战
- 最新版本PHP 7与HHVM 多角度比较