最近做一个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则认为无法处理(给了异常指令)退出程序。

[C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异的更多相关文章

  1. 转:GCC,LLVM,Clang编译器对比

    GCC,LLVM,Clang编译器对比   转自: http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html 在XCode中, ...

  2. GCC,LLVM,Clang编译器对比

    http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html   在XCode中,我们经常会看到这些编译选项(如下图),有些人可能 ...

  3. linux系统下,警告:warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration] 和 warning: the `gets' function is dangerous and should not be used. 的由来和解决方法。

    字符数组 的英文名字是 char [] gets()函数的基本用法为:char *gets(char *s); 该函数的参数是一个字符数组,该函数的返回值也是一个字符数组. linux下的代码如下: ...

  4. warning: the `gets' function is dangerous and should not be used.(转)

    今天在LINUX下编译C程序时,出现了:warning: the `gets' function is dangerous and should not be used. 这个warning. 百度之 ...

  5. warning: Unexpected unnamed function (func-names)

    warning: Unexpected unnamed function (func-names) 看到这个提示基本是就是说你的函数不能是匿名函数,最好可以起一个名字,然后你增加一个函数名称就好了 R ...

  6. Apple LLVM 6.0 Warning: profile data may be out of date

    I have no clue what this meant, so I googled the problem. I only ended up with some search results s ...

  7. 编译器:gcc, clang, llvm

    clang Clang是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言.传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd) ...

  8. 38.利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) 此方法要求能够:1.用传递过来的对象调用comp

    //接口Compute package jieKou; public interface Compute { int Computer(int n,int m); } //加 package jieK ...

  9. 【Flask】报错解决方法:AssertionError: View function mapping is overwriting an existing endpoint function: main.user

    运行Flask时出现了一个错误, AssertionError: View function mapping is overwriting an existing endpoint function: ...

随机推荐

  1. [HDU1812] Count the Tetris - polya定理

    题面 Problem Description 话说就是因为这个游戏,Lele已经变成一个名人,每当他一出现在公共场合,就有无数人找他签名,挑战. 为了防止引起社会的骚动,Lele决定还是乖乖呆在家里. ...

  2. 关于stm32f10xRB系列的PB5和PB12外设冲突问题

      上周在公司做了一个项目,调试一个mcu,本以为很简单的调试一下裸机驱动,但是调试过程中遇到了一些问题让我觉得比较有意思,记录一下. 1.关于stm32的SMBUS功能的介绍   由于笔者也没有玩过 ...

  3. 「题解报告」P3354

    P3354 题解 题目传送门 一道很恶心的树形dp 但是我喜欢 题目大意: 一片海旁边有一条树状的河,入海口有一个大伐木场,每条河的分叉处都有村庄.建了伐木场的村庄可以直接处理木料,否则要往下游的伐木 ...

  4. 巧用 transition 实现短视频 APP 点赞动画

    在各种短视频界面上,我们经常会看到类似这样的点赞动画: 非常的有意思,有意思的交互会让用户更愿意进行互动. 那么,这么有趣的点赞动画,有没有可能使用纯 CSS 实现呢?那当然是必须的,本文,就将巧妙的 ...

  5. Java基础——01

    今日学习 2020-2-27 Java多态 多态性格式 /* 代码中体现多态性 其实就是一句话:父类指向子类对象 格式: 父类名称 对象名= new 子类名称(): 或者 接口名称 对象名 = new ...

  6. [Python]-pdb模块-单步调试

    使用pdb模块辅助python调试. import pdb 断点模式 在需要调试的语句前设置断点,加入这行代码: pdb.set_trace() 程序运行到这就会进入断点调试模式. 输入 作用 n 运 ...

  7. 使用mysql5.7版本的mysqldump备份mysql8.0版本的数据库报错解决办法

    使用mysql5.7版本的mysqldump命令执行备份mysql8.0版本的数据库时会报错: mysqldump: Couldn't execute 'SET SQL_QUOTE_SHOW_CREA ...

  8. Secret概述

    Secret 概述 Kubernetes Secret 对象可以用来储存敏感信息,例如:密码.OAuth token.ssh 密钥等.如果不使用 Secret,此类信息可能被放置在 Pod 定义中或者 ...

  9. CSS-part1

    一. CSS选择器 1.css引入方式 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  10. proxy解决跨域问题

    首先我们在本地开发,域名都是localhost,当我们需要请求后台数据时,就会出现跨域的问题 下面就是在vue.config.js配置文件里: devServer: {     proxy: {    ...