主题:最近看到的笑话之三 -- 钛豌豆
VC runtime debug version会把stack初始化成0xcc,unicode中0xcccc(双字节)就是中文的烫。如果你开了个char[],然后最后一个字符忘了设置成0x00,然后去printf这个字符,那么整个stack从这个局部字符数组开始都输出到console,就变成了“烫烫烫烫烫”。
为啥把stack初始化成0xcc而不是0x00呢?是因为0xcc在intel x86芯片指令集中代表int 3,也就是debug中断,该指令会自动把程序停在单步调试状态,然后去寻找系统中注册的调试器,如果找不到调试器,那么就会终止程序。这一开始是为了调试栈缓冲溢出错误的。如果出现溢出,并且代码尝试执行缓冲中的指令,就会进入单步调试状态。
这是debug version, 那么release verion呢?发布版会把栈初始化成0xcd,这个就是imm8,就是立即中断退出的意思。这时候因为运行在用户机器上,没有调试器,也不希望用户来调试你的程序。0xcdcd就是中文的“屯”字。你会看见一些写的超烂的程序经常会出现“屯屯屯屯屯屯”。的确挺屯的,。
在今天这个芯片DEP,操作系统NX锁定双保险的时代,这种初始化已经没有啥必要了,这个烫屯还存在纯粹是历史原因。
所以在俺们那个电脑还比较古早的年代,说人人品不好,那叫非奸即盗。说程序写的烂,那叫非烫即屯。
- 相关回复 上下关系8
😄你在大学经历过的最难忘的一课——“烫烫烫烫烫” 56 李根 字452 2014-06-09 11:07:41
🙂哈哈,这个让我想起我刚入大学接触电脑的事了 11 流浪天使 字296 2014-06-12 09:13:13
🙂感谢:作者获得通宝一枚。这个Unplugged够行为艺术 wage 字0 2014-06-10 08:47:44
🙂Visual C++ runtime的特征
🙂int 3的代码是CD 03 路人丙 字0 2014-06-13 17:09:12
🙂0xcc,0xcd我是经常见到的。 土泡泡 字42 2014-06-12 03:07:06
🙂没见过 烫 但的确见过有软件出 屯 的,原来如此 铁手 字0 2014-06-11 10:43:00
🙂解惑了,以前经常看到屯屯屯 山鹰 字26 2014-06-10 01:01:44