找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2337|回复: 4

一个隐晦的死循环

[复制链接]

55

主题

275

回帖

9352

积分

用户组: 管理员

UID
77
精华
16
威望
237 点
宅币
8217 个
贡献
251 次
宅之契约
0 份
在线时间
254 小时
注册时间
2014-2-22
发表于 2017-6-20 09:49:37 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
  1. ULONG i,c=0;for(i=0;i<0xFFFFFFFF;i+=4096){c++;}printf("%ld\n",c);
复制代码
用来做代码混淆不错。
死循环的原因是溢出了。
回复

使用道具 举报

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24225 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2017-6-21 14:03:41 | 显示全部楼层
此处安利C语言关键词volatile
因为编译器似乎不认为你这个会导致死循环,觉得就是“循环N次却啥也不做”的“无用语句”,就擅自帮你优化掉了。
很多情况下,你只是给一个变量赋值,但其实这个变量(或者说是寄存器)可能会被其它线程或者外部设备读取,因此这些操作是不应该被优化掉的。
对于此类变量,你就需要使用volatile关键词来修饰。如上所述代码,你把ULONG i改成volatile ULONG i或者ULONG volatile i的话,编译器生成的指令就会真的给i不停地加上4096,然后造成死循环。
有的编译器就算被你关掉了优化,它也会优化掉这些指令。

此外还有volatile修饰指针,这里存在以下几种情况:
int *i; // int类型的指针
int volatile *i; // volatile int类型的指针
volatile int *i; // 同上
int *volatile i; // int类型的,volatile的指针(很少见,我能想到的场合,也只有多线程操作的时候拿N个线程一起修改一个指针或者使用一个指针)
volatile int *volatile i; // volatile int类型的volatile指针,这个会有人用?控制一个随时会变化的指针,读取一个随时会变化的数值。
int volatile *volatile i; // 同上。

带volatile特性的变量都具有不会被编译器轻易优化掉的特性。多线程开发的时候原子操作的时候非常依赖它。
回复 赞! 靠!

使用道具 举报

30

主题

210

回帖

2778

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2159 个
贡献
206 次
宅之契约
0 份
在线时间
480 小时
注册时间
2016-7-12
发表于 2017-6-21 15:58:49 | 显示全部楼层
上面的不是空循环,也是不会被优化掉的,除非输出函数被重定义为什么都不做
回复 赞! 靠!

使用道具 举报

30

主题

210

回帖

2778

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2159 个
贡献
206 次
宅之契约
0 份
在线时间
480 小时
注册时间
2016-7-12
发表于 2017-6-21 16:27:59 | 显示全部楼层
本帖最后由 Ayala 于 2017-6-21 17:03 编辑

其实上面几种的volatile 用法都是一致的
typename volatile name


多线程中用的很多的 操作系统中也一样 dma
比如gdt idt kpcr等等都属于可变的指针 而且指针可变内部数据大多可变!

为了方便安全直接申请内存设置数据重新修改指针就可以 如果直接修改数据需要多个lock或者屏蔽中断设置锁等等 但是改指针就方便多了
指针易变一般是这样



  1. //但是指针易变写起代码的时候会存在差异性问题
  2. typename * a = p;
  3. a->x1;
  4. a->x2;

  5. //与
  6. p->x1;
  7. p->x2;
  8. //两种情况在不同场合有不同的需要
复制代码
回复 赞! 靠!

使用道具 举报

0

主题

18

回帖

51

积分

用户组: 小·技术宅

UID
2933
精华
0
威望
2 点
宅币
29 个
贡献
0 次
宅之契约
0 份
在线时间
2 小时
注册时间
2017-10-9
发表于 2017-10-9 18:04:56 | 显示全部楼层
遇到过优化的问题,当时不知道这个,感觉很奇怪
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 16:54 , Processed in 0.036295 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表