您的位置:首页 > 其它

bug是怎样炼成的

2008-10-24 10:44 148 查看
我很遗憾,做软件做了这么多年,思想还是停留在代码层次上,从来没有去提高自己。
近期的代码维护工作中碰到的问题,记录。

一条导致程序崩溃的代码:
unsigned long lFeedbacktype_id;

语句本身没有问题,关键是它出现在哪。
昨天开始,A系统的C后台程序忽然崩溃,怎么也启动不了,错误提示是:

SQL Error! SQLSTATE = 07006 Native err = 0 msg = [Oracle][ODBC]Restricted data type attribute violation.
百思不得其解,过去好好的怎么今天忽然不行了,后来尝试了删除所有相关表中的数据,程序正常了,插入了今天的数据,还是出错,导出数据查看,似乎看不出异常。试验了一下,发现如果把其中两个值为-1的字段改为0,程序就正常了。
查看对应的DTL类,发现这些出错的字段都是unsigned long类型的,按说unsigned long和long是同样长度的,用哪个都不会出错,肯定是DTL库的内部对绑定的类型做了很严格的处理,如果声明的类型和数据库中的值不符合则会抛出异常。尝试把类型修改为:
long lFeedbacktype_id;
问题解决。看来数据库中中的number类型,在DTL中应该使用long类型来绑定。这就是C程序员喜欢使用unsigned long来声明所有的整形变量所带来的恶果。
我目前维护这个项目的代码很有意思,其腐烂程度在我的工作历史中至少可以排名第二,我会慢慢把这些有意思的事情都记录下来。目前程序中所有绑定number字段的类成员都是使用的unsigned long,也就是说,所有的这些字段只要有负数出现,都会导致程序崩溃,真懒得去改。
环境:Oracle9i、ODBC、VC6、DTL
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: