别怕Linux编程

7个小时只为修改这一个BUG,血的教训

如果你不想用7个小时扫一个BUG,那么就请看完本文。

由于项目临近尾声,我的流量分析程序也要保证稳定运行。但,由于近期加入了一个新功能,导致了新BUG的产生。

BUG的现象是在屏幕输出莫名其妙的乱码。

我今天从早上9点到实验室,一直扫BUG到下午4点多,断断续续改进了其他的小BUG,但乱码BUG仍然没有头绪。

最后,决定一步一步gdb来查,三四千行的程序阿….

现在揭晓错误所在:

if(sched_socket=get_IP_sched()<0){…}

看出来了么?

优先级阿,关系运算符的优先级高于赋值运算符阿。就是因为偷懒耍酷,少写了“()”,导致程序先判断了get_IP_sched()<0的值,由于为假,所以返回0,所以sched_socket总是0。所以在后面的write时就会将一些二进制的东西输出到标准输出。也就出现了开篇所说的乱码现象。

正确的代码应该是:

if((sched_socket=get_IP_sched())<0){…}

OK!

你说值么,为了这么一行“为了偷懒”的代码,付出了7小时。

其实也值,吃一堑长一智,以后不敢耍帅了,老老实实加括号,踏踏实实编代码…

ps:劝解各位看我博客的兄弟,优先级不好玩,括号该加就加,7小时扫BUG,不是啥好玩的事….

over~

7条评论

  1. 一般我会这样写一行代码,赋值语句很少写在判断语句里面.这样可以避免= ==写错了
    sched_socket=get_IP_sched();
    if(sched_socket<0){…}

  2. ……偶还是习惯分行写。不过经典的写法就是这种装帅型,代码写到一行,最大的坏处就是你单步调试都不好跟。

  3. 呵呵,这就怪你偷懒了,我写程序一般都带括号的,即使是很明显的优先级高的都带括号.
    这永远是一个好的习惯…

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *