您的位置:首页 > 编程语言 > C语言/C++

程序猿的日常151126

2015-11-26 15:31 357 查看

2015年11月26日 星期四 晴

这几天各大龙王做空天气指数,温度骤然跳水。你在北方的大雪里享受着暖气,我在南方的艳阳里冻成狗。

最近一段时间,我投身某公交卡项目,工作大半年来第一次如此密集地从事编码和debug的工作。写代码跟游泳一样,以前都在河岸上看大家在水里扑腾,以为游泳很容易,等到自己下水的时候,才发现其实全然不像表面看起来那么简单。且不谈技能习得之艰辛,在水中无法预知的暗流、泥沼、浅礁才是真正危险的隐秘敌人。

在向外提供iOS程序的SDK后,我便投入了后续的支持工作。果不其然,每天都有问题反馈,每天都会掉到各种坑里。明处的敌人并不可怕,最可怕的是那种时不时出来摆你一道,当你转过身想找他算账时却死活找不着他人的混蛋家伙。比如说,同一套代码在不同版本的iOS设备上,有的能work,有的却不能。比如说,同一套代码同一台设备,这时候能work,到了下一刻,明明感觉一切前置条件都一样,但就是挂给你看。这种无法一直重现的偶发性bug,最令人无语了。

俗话说吃一堑长一智,最近在被坑惨之后,总算对这类诡异事件有了一些认识。SDK的底层是用C和C++实现的,如果对C的了解不够深刻,很容易就被坑惨。我们在阅读C系列语言指导书的时候,总会看到一些负责任的作者一遍又一遍不厌其烦地跟我们讲“不确定行为”所造成的危害性,而“不确定行为”往往来自于未初始化。和Java定义即初始化不同,C系语言在你定义的时候,初始化值需要你来指定,否则就是“不确定值”。当然,大多数情况下,如果你没有指定初始化值,它分配完内存后,内存里的值可能恰好是你要的那个值,这时候一切都很完美,看似一切正常。但真正到了某些内存原来就有数据存储,被回收后又被你用到,你却未经初始化就拿来用,这种感觉就跟去厕所不检查下马桶里还有没有前人存货(有些同志经常忘记冲洗)就直接用一样令人感到不适。

我遇到的某个bug就跟未初始变量有关。很遗憾某个分支判断依赖了这个变量,大多数情况下这个分支判断是有效的,但是如果未初始内存块里残余了前人存货,那么程序就傲娇地另寻他路,从而最终导致不确定性和预期不符的后果。

另外一个非常隐秘的坑是跟有符号数、无符号数有关。当我们在使用有符号数的时候,哥们儿就得小心了,我们真的能够确定自己要表示的所有正数值能够落在这个符号数的正数区间里吗?毕竟你要知道同样字节长度的有符号数只能表示无符号数一半的正整数值。一旦你要表达的值大于这个限制,它就变成负数了!惊天巨变啊,比股票跳水还吓人!这真的是你期待的行为吗?

在我们遇到的坑中,某程序媛用long来表示一个4字节正整数。在iOS7和iOS8中,系统是64位的,long是8字节的,一切ok。但是再老一点的iOS系统是32位的啊,long只有4字节,正整数只能表示一半,超出的那一半就会变成负数。这时候我们的老朋友“未初始化”君又来凑热闹,程序媛偏偏用了一个long值>0的判断来对某个未初始化数组进行赋值。如果<0,这些数组就又陷入了未初始化的危险境地。于是,依靠这些数组计算出来的结果会让人摸不着头脑,因为未初始化内存本就让人摸不着头脑。

吐槽完毕,希望以后自己编程的时候能够注意这些坑,做一个谨慎的程序猿。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C-C++ 编码