反汇编看指令重排

背景:

这也是一个真实客户案例,但我不能透露代码及问题细节,只讲思想。

问题:

客户说他们现场经常打印一句warning,我们对应源码查看了代码。伪代码如下:

void pin()
{
        while (!flag){ sleep(1);}
        if (hold > 0) {
                printf("warning: holder already set\n");
                exit(-1);
        }
}

void unpin()
{
        hold = -1; //没人持有
        flag = 0;  //无锁
}

pin 和unpin分数不同的进程,正如函数名所暗示分别用来上自旋锁和放自旋锁。这部分代码是不知名的前辈写的,开始只有flag的判断没有hold, 我猜测后来为了好查看自选锁到底被谁持有了才加了关于hold的代码,但是就是这暗藏BUG。

这个BUG隐藏的比较深

看到代码后我们过了好久才意识到可能有指令重排,而且是经过查看汇编代码才确认的。

主要是hold与flag的赋值的顺序在unpin中被交换了:本来我们想先hold=-1, 再flag=0,但是实际编译器却给优化成了flag=0, then hold=-1, 从而导致pin中报warning。

汇编代码大概是(注意:没与上面代码匹配)(两种办法获得汇编代码

1. gdb中disass unpin

2. objdump -d ./a.out |grep unpin)

相关推荐

  1. 汇编指令重排

    2023-12-06 11:26:03       38 阅读
  2. 汇编LOG怎么

    2023-12-06 11:26:03       20 阅读
  3. 汇编指令学习

    2023-12-06 11:26:03       37 阅读
  4. 常见汇编指令

    2023-12-06 11:26:03       11 阅读
  5. 【嵌入式-汇编】常用汇编指令

    2023-12-06 11:26:03       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 11:26:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 11:26:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 11:26:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 11:26:03       20 阅读

热门阅读

  1. 无状态登录和有状态登录

    2023-12-06 11:26:03       37 阅读
  2. vue3 学习

    2023-12-06 11:26:03       32 阅读
  3. import后加不加{}的区别(es6引用)

    2023-12-06 11:26:03       37 阅读
  4. 对Vue中mixin的理解

    2023-12-06 11:26:03       25 阅读
  5. 如何在 vue 项目中创建 svg 组件

    2023-12-06 11:26:03       33 阅读
  6. linux 僵尸进程 关闭看不见的进程

    2023-12-06 11:26:03       30 阅读
  7. threejs WebGLRenderer 像素比对画布大小的影响

    2023-12-06 11:26:03       43 阅读
  8. 力扣:196. 删除重复的电子邮箱(Python3)

    2023-12-06 11:26:03       44 阅读
  9. QT基础教程(QPalette和QIcon)

    2023-12-06 11:26:03       32 阅读
  10. mysql中的case when then else end用法

    2023-12-06 11:26:03       40 阅读
  11. (C++20) consteval立即函数

    2023-12-06 11:26:03       42 阅读