tcc 的一个 bug
tcc 是个好东西,我们的粒子系统把它当作可选模块,用于动态生成粒子控制代码。较之 lua 的版本,性能可以提高一个数量级(另外一个 gcc 版本的可选模块,会失去动态性)。为了引入这个库,我还好好研究了一下 LGPL 。
前段时间我还在抱怨 tcc 不能跑在 64 bit 环境下,结果今天因为查 bug ,去关心了一下新版本,发现 0.9.25 已经开始支持 64bit 了。
表扬到此为止,现在开始抱怨。
最近两天,我们有两个人陷入了一个诡异的 bug 中,把手头许多工作都停了下来。由于问题过于诡异,引发了许多猜想都一直未能确认。bug 似乎不是特定某段代码引起的,又牵扯进一大段复杂的 3d 渲染模块,稍稍改变一点上下文状态,就会在另一个不相关的代码中出问题。
所以我常说,单元测试或是面向测试的开发绝不是万能药。甚至有时候就是鬼扯。前段看到公司某项目写的大坨的所谓单元测试代码,我就觉得好笑。纯粹是浪费人力。用 1000 行测试 100 行的模块,不如肉眼去看。真正出了问题还找不出来。能起的作用无非也就是找出点拼写错误而已。
有那个时间写这么多测试代码,还不如多写点实际程序,提高点水平,减少 bug 产出。
闲话到此。说说最后定位出来的 bug 。
tcc 动态编译出来的函数,如果使用了浮点寄存器,有时候会在浮点栈上留下一个数字。即占用了 st(0) 。
而 gcc/msvc 通常在编译代码时,认为每次函数调用前后,浮点栈都是干净的,即有 8 个栈空间可用。
所以,在某些边界情况下,编译器生成的代码会企图用满 8 个浮点寄存器。如果中途调用了 tcc 生成的函数,会造成浮点栈溢出。浮点运算的结果不正常。
结论如此简单,但是两三个人耗在里面的时间真是让人心痛阿。我们这几天做的诸多猜测,和各种实验就不详细写了。
末了,我研究了一晚上 tcc 的 source ,打算打个补丁,不过太晚了,暂时还没有头绪。本来想先写封 email 报告一下 bug 。打开了源码包里的 TODO 文件。感觉脑袋后面都是竖线,最前面赫然写着:
Bugs:
- FPU st(0) is left unclean (kwisatz haderach). Incompatible with optimized gcc/msc code
教训:用开源代码前,一定要熟读 bug list 。
Comments
Posted by: kaka | (26) February 8, 2012 09:47 AM
Posted by: mike | (25) November 23, 2009 02:47 PM
Posted by: soloist | (24) July 13, 2009 10:38 AM
Posted by: shy | (23) June 22, 2009 02:32 PM
Posted by: xys | (22) June 22, 2009 01:32 PM
Posted by: solidus | (21) June 14, 2009 11:50 PM
Posted by: 眼界 | (20) June 12, 2009 07:54 AM
Posted by: 皇冠投注 | (19) June 10, 2009 04:25 PM
Posted by: Anonymous | (18) June 10, 2009 01:18 PM
Posted by: zelor | (17) June 8, 2009 07:27 PM
Posted by: skillzero | (16) June 7, 2009 11:02 PM
Posted by: 小x | (15) June 7, 2009 02:02 PM
Posted by: rich | (14) June 7, 2009 01:48 PM
Posted by: lei | (13) June 7, 2009 01:04 AM
Posted by: Googol | (12) June 5, 2009 05:14 PM
Posted by: sjinny | (11) June 5, 2009 02:20 PM
Posted by: abia | (10) June 5, 2009 12:37 PM
Posted by: analyst | (9) June 5, 2009 11:41 AM
Posted by: asking | (8) June 5, 2009 11:21 AM
Posted by: Cloud | (7) June 5, 2009 11:13 AM
Posted by: asking | (6) June 5, 2009 10:07 AM
Posted by: zu | (5) June 5, 2009 09:59 AM
Posted by: zu | (4) June 5, 2009 09:53 AM
Posted by: asking | (3) June 5, 2009 09:09 AM
Posted by: cat | (2) June 5, 2009 08:28 AM
Posted by: pbhy | (1) June 5, 2009 07:30 AM