2011-11-14

遇到Bug就像踩了地雷

大约是八月份的时候,应公司的要求,设计了一个给各产品线通用的日志模块。简单而言,也就是做一个导出C函数的DLL,实现通用的日志读写和管理功能。设计是我做的,实现就交给了另一个同事。然而这个同事没过多久就离职了,因此交接时把草草地写完的代码又回到了我这里来。

平心而论,这段代码写得不怎么样。估计这位同事当时已经心不在焉了,只想早早结束了事吧。代码中充满了他此前做过的一个BCB项目的风格,主要的功能是用C风格的代码来实现(例如文件读写等),而工程又是一个VC6的Win32 DLL,里面写了自己的类等等。我看了之后第一感觉就是想推了重写,好不容易才压制住这种想法。
当时我给自己安排了两天来接收并改造这些代码,后来拖长到了三四天。其实现在想想还不如重构。给我的代码功能测试都通不过,里面Bug一大堆。我这人又是有一点代码洁癖的家伙,遇到空格缩进什么的都忍不住花时间去调。最后终于弄好了,真有点不想再去碰了,虽然我知道值得改进的地方还很多。

结果今天就碰到了一个藏在其中的Bug。

这个日志模块被设计为保存加密日志,目的嘛……是为了防止用户抵赖。加密就不能全文加密,否则每来一条日志都得解密再加密,量稍微一大就死翘翘了。差分加密是必须的。设计的时候是对每一条日志的内容进行加密,只留下必要的信息放在每一条的头部以便索引。从性能和安全性方面权衡,当时选择了AES算法。
代码交到我手上时,之前那个同事大概已经从网上找了一段AES算法封装好了。既然能实现加密解密的功能,我也就没往里面细看。谁知道这玩意儿是线程不安全的。今天专拣双核机器报错,从fseek到fopen查了一圈,终于怀疑到这个AES算法上。浪费了约两个小时时间。

我估计我有时间可能真得把它给重写了,里面指不定还有什么问题。

没有评论:

发表评论