Chinaunix

标题: 不要滥用赋值语句! [打印本页]

作者: flw    时间: 2008-01-22 18:28
标题: 不要滥用赋值语句!
一个bug,同事查了快一个星期,毫无进展,都要疯掉了。我也帮忙看了一天多,也没有头绪。后来,同事非常高兴的过来告诉我,找到了bug,就是那些为了调试方便临时添加的几条赋值语句。

原因是这样的:

本来有一个循环,只需要循环不多的几次,不妨姑且假设它是这样写的:
  1. for( i=0; i<10; i++ ){   .............. }
复制代码

层次很浅,耗时很短。其实写得很不错。而且性能上也可以满足要求。同事为了调试新开发的一部分代码方便,在这个循环的末尾加了一句赋值语句,便于在运行当中模拟某种情况。可是,加了之后。整个程序就“假死”在这个循环之中了,不停地死循环。后来有一次离开座位,任由其跑了20多分钟,回来看,发现还在死循环。

其实,程序并没有问题。但是,由于关键部位的赋值语句改变了程序的流程,使原来几纳秒就可以出结果的程序拖慢到了几十个小时仍然不能出结果!

这个现象也很容易观察的,随便写个程序,写个循环,gdb 单步执行一下,就能看到赋值语句影响程序流程的例子。上学的时候也发现过。不过大家都不容易注意罢了。















哦,刚才忘了说了,
这个赋值语句就是:
  1. i=0;
复制代码



请不要在技术区发这种回复才能查看的帖子.(--by converse).

[ 本帖最后由 converse 于 2008-1-23 14:22 编辑 ]
作者: Missex    时间: 2008-01-22 18:33
没想到我是传说中的沙发,第一次在这么高的沙发上啊

[ 本帖最后由 Missex 于 2008-1-23 20:37 编辑 ]
作者: aero    时间: 2008-01-22 18:42

作者: scutan    时间: 2008-01-22 18:47
flw老大好像是在本版第一个使用 需要回复才能看到内容 的吧.
作者: ssffzz1    时间: 2008-01-22 18:48
呵呵,书本上经常说。
技巧就是在该语句前加一个DEBUG代码预处理标记。
作者: ly5066113    时间: 2008-01-22 18:49

作者: galaxywar    时间: 2008-01-22 18:56
我以前的习惯是在debug语句前都加同一行特殊的注释, 调完了搜索一下就可以全删掉了
作者: baohuaihuai    时间: 2008-01-22 18:58
回复看贴......
作者: caijimin    时间: 2008-01-22 18:59

作者: gothicane    时间: 2008-01-22 19:01
WC
作者: kaoruamene    时间: 2008-01-22 19:02
这个赋值语句是什么呢?
作者: agaric    时间: 2008-01-22 19:13
貌似离奇的bug,原因往往都是很简单的。
作者: cugb_cat    时间: 2008-01-22 19:16
晕,克隆了~~~
作者: nipusa00100    时间: 2008-01-22 19:29

作者: 一岁就很坏    时间: 2008-01-22 19:33

作者: cofish    时间: 2008-01-22 19:54
wok
作者: i_torrent    时间: 2008-01-22 19:54
莫非是在搞笑?
作者: realmon    时间: 2008-01-22 20:05

作者: lotcor    时间: 2008-01-22 20:07
开心果?
作者: Solidus    时间: 2008-01-22 20:15
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
作者: qaz0925    时间: 2008-01-22 20:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: qaz0925    时间: 2008-01-22 20:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: flw    时间: 2008-01-22 20:40
原帖由 qaz0925 于 2008-1-22 20:36 发表
nmlgd8z, 买关子呢.

cnmlgd8z
作者: 守住每一天    时间: 2008-01-22 20:42

作者: 想飞的蜗牛    时间: 2008-01-22 20:44
晕....
作者: bluesgone    时间: 2008-01-22 20:49
标题: 回复 #1 flw 的帖子
ms灌水嫌疑...
作者: shiner    时间: 2008-01-22 20:51

作者: gosapphire    时间: 2008-01-22 20:51
我KAO
作者: angelanpan    时间: 2008-01-22 21:09
一个死循环,需要查一个星期?
作者: mik    时间: 2008-01-22 21:13
好,建议加精
作者: GodPig    时间: 2008-01-22 21:14

作者: xxldc    时间: 2008-01-22 21:15
flw
作者: lysde    时间: 2008-01-22 21:32

作者: mouse2000    时间: 2008-01-22 21:39
这样的错误真郁闷~!
作者: demon060    时间: 2008-01-22 21:42
看看
作者: okmmno1    时间: 2008-01-22 21:50
要是骗人 把小JJ切了。
作者: okmmno1    时间: 2008-01-22 21:51
PS: 这个问题需要查一个星期么?
作者: antonym55    时间: 2008-01-22 21:52
i=0?
作者: lostiger    时间: 2008-01-22 22:02
sesee
作者: 小i    时间: 2008-01-22 22:07

作者: isnowran    时间: 2008-01-22 22:10

作者: ericz    时间: 2008-01-22 22:14
瞧一瞧 ???????
作者: FinalBSD    时间: 2008-01-22 22:22
我还是菜鸟,等我长大再犯这种错吧。
作者: ilex    时间: 2008-01-22 22:23
囧rz

也许以后会碰上
作者: barbas    时间: 2008-01-22 22:23
为了看到
作者: xiexiexd    时间: 2008-01-22 22:40
本内容跟帖回复才可浏览
作者: 醉卧水云间    时间: 2008-01-22 22:42
i=5?
作者: 醉卧水云间    时间: 2008-01-22 22:44
果然, 我不喜欢犯这错.
作者: gaocheng    时间: 2008-01-22 22:44

作者: ShadowStar    时间: 2008-01-22 22:44
:em11: :em11: :em11: :em11: :em11: :em11: :em11:

喷了

[ 本帖最后由 ShadowStar 于 2008-1-22 22:45 编辑 ]
作者: sleetboy    时间: 2008-01-22 22:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: heavyrain44    时间: 2008-01-22 23:11
仅仅是好奇
作者: I/0    时间: 2008-01-22 23:24
...
作者: duke98    时间: 2008-01-22 23:29

作者: arron    时间: 2008-01-22 23:32

作者: 飞灰橙    时间: 2008-01-22 23:43

作者: 飞灰橙    时间: 2008-01-22 23:44
:em11: :em11: :em11: 有失水准,太有失水准了
作者: openyard    时间: 2008-01-22 23:45
:wink:
作者: liu1feng    时间: 2008-01-22 23:58
学习一下
作者: argum    时间: 2008-01-23 00:11
看看、。。。。
作者: G00GLE    时间: 2008-01-23 00:22
就是要我发这个才能看
作者: zyxxyz0001    时间: 2008-01-23 00:36
路过
作者: bdw    时间: 2008-01-23 00:46
..
作者: nashira    时间: 2008-01-23 00:58

作者: journ    时间: 2008-01-23 01:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: sejor    时间: 2008-01-23 01:46
赋值...
作者: yecheng_110    时间: 2008-01-23 08:24

作者: yang_crystal    时间: 2008-01-23 08:32

作者: ruoyisiyu    时间: 2008-01-23 08:39
原帖由 flw 于 2008-1-22 18:28 发表
一个bug,同事查了快一个星期,毫无进展,都要疯掉了。我也帮忙看了一天多,也没有头绪。后来,同事非常高兴的过来告诉我,找到了bug,就是那些为了调试方便临时添加的几条赋值语句。

原因是这样的:

本来 ...

碰到过,深有同感啊
作者: 熏红猴    时间: 2008-01-23 08:41
不要滥用 ,你们看cu都被 成什么样了
作者: foxpro7    时间: 2008-01-23 08:47
难道是i=0;?
作者: dglwx    时间: 2008-01-23 08:53
想看看!
作者: Cocal    时间: 2008-01-23 08:54

作者: dglwx    时间: 2008-01-23 08:56
顶起来看!
作者: andytodd    时间: 2008-01-23 08:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: shmilylxx    时间: 2008-01-23 08:57
haha
作者: flyiop    时间: 2008-01-23 08:59

作者: lookee    时间: 2008-01-23 09:02
看一下
作者: epegasus    时间: 2008-01-23 09:02
预料之中的恶搞

[ 本帖最后由 epegasus 于 2008-1-23 09:03 编辑 ]
作者: lookee    时间: 2008-01-23 09:08
果然是i=0
我遇到过在循环中数组操作越界,然后把这个i 的值改变的情况
作者: soul_of_moon    时间: 2008-01-23 09:09
标题: 回复 #1 flw 的帖子

作者: xiaochongs    时间: 2008-01-23 09:09

作者: bellavista    时间: 2008-01-23 09:11

作者: D4em0n    时间: 2008-01-23 09:11
不会是给I给了负值吧.... 看下....
作者: zicfy    时间: 2008-01-23 09:17
隐藏很yd啊
作者: zicfy    时间: 2008-01-23 09:18
实在不行,把测试代码放在 #if #endif里面,用一个开关来控制。
这样比较方便,但代码可读性可能会下降
作者: safedead    时间: 2008-01-23 09:20
for(i = 0; i < 10; i++) {
     if (i == 5) i = 0;
}

类似这样的
作者: yangyufeng507    时间: 2008-01-23 09:23
dd
作者: accelerator    时间: 2008-01-23 09:25

作者: nicolas.shen    时间: 2008-01-23 09:25
呵呵
作者: 封神    时间: 2008-01-23 09:27
竟然还有隐藏内容.....
作者: yjm0573    时间: 2008-01-23 09:29

作者: smartlinux    时间: 2008-01-23 09:36
这本身并不是赋值的问题,而是写代码的不清楚。

如果是调试代码,就应该由编译选项打开。
作者: sjh_311    时间: 2008-01-23 09:36
kk
作者: weedeater    时间: 2008-01-23 09:39
我印象中CU论坛没有这个功能。看看
作者: Hackingtruth    时间: 2008-01-23 09:40
看看先
作者: 塑料袋    时间: 2008-01-23 09:42
aefasdgdhgjghkljl;'k;l'lkjghjkg
作者: Sky-Burn    时间: 2008-01-23 09:42
have a look
作者: hewangping    时间: 2008-01-23 09:52

作者: pandorally    时间: 2008-01-23 09:54
look...:em11:




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2