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

本文主要是介绍如何解决 C/C++ 编译器优化导致的编译BUG(程序崩溃)支援VC++/CLANG/GCC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

因编译器优化导致编译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

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

这篇关于如何解决 C/C++ 编译器优化导致的编译BUG(程序崩溃)支援VC++/CLANG/GCC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761687

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis