如何解决 C/C++ 编译器优化导致的编译BUG(程序崩溃)支援VC++/CLANG/GCC

news2024/11/17 13:46:58

本文仅适用于,有愿意、爱捣鼓的童靴。

因编译器优化导致编译BUG,即DEBUG下面无故障稳定工作,但RELESE下程序会在特定函数位置上崩溃。

这要求 C/C++ 开发人员拥有最基本的素质,需要能够承受,逐行审视编译器输出的目标平台汇编代码、从函数崩溃点往上(及整个汇编函数段内)逐行审视分析的苦逼。

大多数简单的 C/C++ 开发的程序,并不需要这样的捣鼓,但当 C/C++ 大量的应用宏、模板元编程的时候,遭遇类似的编译器BUG,将无法避免。

我们既无法要求、或寄托开发编译器的人们,能够解决这个问题,因为这个事情,遥遥无期,所以,这需要童靴们,要有自己动手折腾的能力。

看汇编是为了知道,C/C++ 在把代码翻译为汇编代码的时候,到底出现了什么问题,

例如:

1、常数100,变成250

2、汇编调用了错误地址

3、汇编之中,对于 C/C++ 结构内存对齐不正确

4、错误的优化导致的崩溃,如内链接代码错误(inline BUG)

5、寄存器优化BUG(寄存器被复用,致程序读写值错误)

根据审视这些汇编代码,来推论属于哪一类的情况,但通常,我们并不需要这么复杂的具体分析,这么分析是为了最高效能,极致 C/C++ 代码性能吞吐优化,所以需要细微入致,谨慎分析、代码调效。

如果你不能通过汇编定位到,优化导致BUG的位置,你将无法通过控制 C/C++ 编译器指令禁止优化,或者减少优化级别来解决这个问题。

所以,本文说的很明白,不适合没有这种精气神,跟捣鼓的童靴,如果只是会点 C/C++ 语法,写点 C/C++ 程序,那么你并不懂 C/C++,不愿意折腾研究换语言,C语言或许更好一点。

我也只不过是熟悉、了解 C/C++ 这门语言的一个水平,谈不上精通,毕竟又有谁轻言精通?可能只有造假、骗子才会轻言精通把。

C 语言一般不需要这么深入的研究,因为 C语言编译出现BUG的可能性很低,但放到 C/C++ 就不一样了,这也是为什么 C++ 对人的综合素质,要求很高的缘故。

否则怎会有只有玩 C++ 的人,才是一名真正的开发人员的典故,不是。

OK,当我们确认了,因为 C/C++  编译器优化导致的编译器BUG问题函数点时:

我们就需要编写下述的编译器指令,要求编译器来禁用优化,或者调整优化级别。

但这需要评估是否可以通过减少优化级别来解决该问题,某些情况下并不需要减少优化级别,只需要调整该函数、及关联调用方、被调用方函数来解决。【取决于人们是否需要极致调效】

例如:(下述)

1、在CLANG之中禁用优化

2、在GCC 7.5 <= 编译器版本之中,使用 /O1优化

3、在GCC 7.5 > 编译器版本之中,禁用优化

4、在VC++ 之中使用/O1优化(gsyb2为/O1优化级别编译器参数)

所以只需要在找到被编译器优化函数会导致崩溃BUG的真正元凶(问题点函数):

在函数头声明:

#if _WIN32
#pragma optimize("", off)
#pragma optimize("gsyb2", on) /* /O1 = /Og /Os /Oy /Ob2 /GF /Gy */
#else
#pragma GCC push_options
// TRANSMISSIONO1 compiler macros are defined to perform O1 optimizations, 
// Otherwise gcc compiler version If <= 7.5.X, 
// The O1 optimization will also be applied, 
// And the other cases will not be optimized, 
// Because this will cause the program to crash, 
// Which is a fatal BUG caused by the gcc compiler optimization. 
// Higher-version compilers should not optimize the code for gcc compiling this section.
#if __clang__
#pragma clang optimize off
#elif (TRANSMISSION_O1) || (__GNUC__ < 7) || (__GNUC__ == 7 && __GNUC_MINOR__ <= 5) /* __GNUC_PATCHLEVEL__ */
#pragma GCC optimize("O1")
#else
#pragma GCC optimize("O0")
#endif
#endif

 在函数尾声明:

#if _WIN32
#pragma optimize("", on)
#else
#if __clang__
#pragma clang optimize on
#else
#pragma GCC pop_options
#endif
#endif

即可解决编译器优化导致的程序致命性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1479424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov9,使用自定义的数据训练推理

[源码 &#x1f40b;]( GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information) [论文 &#x1f4d8;](arxiv.org/pdf/2402.13616.pdf) 论文摘要&#xff1a;本文介绍了一种新的目标检测…

【 JS 进阶 】正则表达式

“生命是一幅抽象画&#xff0c;每一笔都是独特的经历。在色彩的交织中&#xff0c;用坚定的画笔勾勒出自己的轨迹&#xff0c;让每一幅画作都成为奋斗的印记。” - 亚历山大斯密斯 正则表达式 正则表达式&#xff08;Regular Expression&#xff09;是一种字符串匹配的模式&a…

二、TensorFlow结构分析(2)

目录 1、会话 1.1 __init__(target,graphNone,configNone) 1.2 会话的run() 1.3 feed操作 TF数据流图图与TensorBoard会话张量变量OP高级API 1、会话 1.1 __init__(target,graphNone,configNone) def session_demo():# 会话的演示# Tensorflow实现加法运算a_t tf.constan…

LNMP 架构

搭建 LNMP 架构需要安装 nginx mysql php 软件 linux nginx mysql php结合 在一台主机上搭建LNMP架构 一、编译安装 nginx 安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 创建nginx程序用户 &#xff08;Nginx 服务程序默认以 nobody 身份运…

基于java Springboot实现课程评分系统设计和实现

基于java Springboot实现课程评分系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

MySQL(基础篇)——事务

一.事务简介 事务是一组操作的集合&#xff0c;他是一个不可分割的单位&#xff0c;事务会把所有的操作作色一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 默认MySQL的事务是自动提交的&#xff0c;也就是说&#xff0c…

QML中动态增加表格数据

1.QML中的表格实现 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableModel{id:table_modelTabl…

STM32 IIC协议基础概念

文章目录 前言一、IIC协议介绍二、IIC硬件框图和程序层次三、IIC协议1.IIC协议通信流程2.IIC的引脚为什么需要加入上拉电阻3.IIC的引脚为什么需要配置为开漏输出 四、STM32 IIC硬件结构总结 前言 本篇文章将带大家学习IIC通信协议的一些基础概念和使用。 一、IIC协议介绍 I2…

【iOS ARKit】RealityKit 同步机制

协作 Session 可以很方便地实现多用户之间的AR体验实时共享&#xff0c;但开发者需要自行负责并确保AR场景的完整性&#xff0c;自行负责虚拟物体的创建与销毁。为简化同步操作&#xff0c;RealityKit 内建了同步机制&#xff0c;RealityKit 同步机制基于 Multipeer Connectivi…

RISC-V特权架构 - CSR寄存器

RV32/64 特权架构 - CSR寄存器 1 CSR地址空间2 CSR定义2.1 用户级2.2 监管级2.3 超级监管级2.4 机器级 3 CSR访问3.1 CSRRW3.2 CSRRS3.3 CSRRC3.4 CSRRWI3.5 CSRRSI3.6 CSRRCI 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 CSR地址空间 RISC&…

从 Flask 切到 FastAPI 后,起飞了!

我这几天上手体验 FastAPI&#xff0c;感受到这个框架易用和方便。之前也使用过 Python 中的 Django 和 Flask 作为项目的框架。Django 说实话上手也方便&#xff0c;但是学习起来有点重量级框架的感觉&#xff0c;FastAPI 带给我的直观体验还是很轻便的&#xff0c;本文就会着…

基于Python的电商评论数据采集与分析|电商API接口数据采集

引言 在电商竞争日益激烈的情况下&#xff0c;商家既要提高产品质量&#xff0c;又要洞悉客户的想法和需求&#xff0c;关注客户购买商品后的评论&#xff0c;而第三方商家获取商品评价主要依赖于人工收集&#xff0c;不但效率低&#xff0c;而且准确度得不到保障。通过使用Py…

经典DP-最大子数组

连续子数组的最大和 代码 //定义一个名为"连续子数组的最大和"的公共类 public class 连续子数组的最大和 { // 定义一个静态变量maxn&#xff0c;并赋值为100010 static int maxn100010; // 定义一个静态的整数数组dp&#xff0c;大小为maxn static int[] dp…

Java毕业设计-基于springboot开发的Web社区医院管理服务系统-毕业论文+答辩PPT(有源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、用户功能模块4、医生功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发…

官网万词霸屏推广+关键词排名优化源码系统 带完整的安装代码包以及搭建教程

随着搜索引擎算法的不断更新和市场竞争的加剧&#xff0c;传统的SEO方法已经难以满足企业对于快速、高效推广的需求。罗峰结合多年的互联网营销经验和最新的搜索引擎优化技术&#xff0c;给大家推荐一款集网站搭建、关键词优化、数据分析于一体的源码系统。 以下是部分代码示例…

如何使用Spring Boot轻松实现国际化和本地化

文章目录 什么是国际化SpringBoot 国际化实践出真知新建Properties文件修改配置文件测试获取所有国际化资源 总结 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 什么是国际化 国际化&…

opencv--使用直方图找谷底进行确定分割阈值

直方图原理就不说了&#xff0c;大家自行百度 直方图可以帮助分析图像中的灰度变化&#xff0c;进而帮助确定最优二值化的灰度阈值&#xff08;threshold level&#xff09;。如果物体与背景的灰度值对比明显&#xff0c;此时灰度直方图就会包含双峰&#xff08;bimodal histo…

Java核心API-多线程

多线程 文章目录 多线程前言一、多线程1、多线程的概念2、多线程的好处 二、主线程1、Thread类2、主线程 三、线程的创建和启动1、创建线程的两种方式2、使用线程的步骤 四、继承Thread类创建线程五、实现Runnable接口创建线程六、比较两种创建线程的方式1、继承Thread类2、实现…

Python爬取网站视频资源

思路&#xff1a; 在界面找到视频对应的html元素位置&#xff0c;观察发现视频的url为https://www.pearvideo.com/video_视频的id&#xff0c;而这个id在html中的href中&#xff0c;所以第一步需要通过xpath捕获到所需要的id 在https://www.pearvideo.com/video_id的页面&…

C语言while 语句的基本格式是什么?

一、问题 C语⾔中有三种循环语句&#xff0c;while 语句是其中的⼀个&#xff0c;它的基本格式是怎样的呢&#xff1f; 二、解答 while 语句的⼀般形式为&#xff1a; while(表达式) 语句; 其中&#xff0c;表达式是循环条件&#xff0c;语句为循环体。 注意&#xff1a; …