bug是怎样炼成的

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

一条导致程序崩溃的代码:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值