修改编译优化选项后导致bug的原因分析

有没有碰到过这样的情况,用-O0优化选项编译程序是正常的,换成-O2优化选项编译程序就有bug呢?或者反过来,-O2编译正常,-O0编译有bug。

mingdu.zheng at gmail dot com
https://blog.csdn.net/zoomdy/article/details/79397591

提高优化级别后可能引起的问题

例如从O0变更为O2。

  1. 编译乱序引起的问题,程序当中没有放置正确的内存屏障,编译优化引起的乱序执行导致程序出现bug。
  2. 时序引起的问题,优化后的代码执行速度要比优化前快得多,这可能引起时序不符合要求,最终导致bug。

降低优化级别后可能引起的问题

例如从 O2变更为O0。

  1. 可能引起堆栈溢出,O0使用的堆栈空间比O2要多,使用O2堆栈不会溢出,切换成O0可能会引起堆栈溢出。
  2. 时序引起的问题,变慢仍然可能会引起问题。

如何避免

  1. 不能假设执行次序和程序代码次序相一致,编译优化会打乱执行次序以减少数据相关性,如果要求程序按代码次序执行,那么应该在代码内插入内存屏障告知编译器不要打乱此处的执行次序。
  2. 和时序相关的操作要避免使用指令延时,应当使用定时器。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值