一个用到Boost中time_duration类而产生的bug
2004-07-01 17:39
513 查看
测试小组提交在ClearQuest上的一个Defect引起了我的注意,当一个逻辑中输入日期为1940年以前的任何一个值时,会产生异常,程序逻辑不正常,直觉告诉我,这有可能是其中用到时间比较时出了错,果不其然,在经过仔细定位后发现一段程序:
而跟踪到这里时发现,计算出的这个diff居然是负值!
仔细查阅文档,发现我的boost date_time库在编译时选择了time_duration的ticks数据类型为__int64,此时发生了数据溢出:)
65*365*24*60*60*1000000000
boost::posix_time::time_duration diff = util::ptime_now() - util::oletime_to_boosttime(dateOfBirth);
if( diff.is_negative() || diff > boost::posix_time::hours(200*365*24) )
return E_INVALIDARG;
}
改成用DATE_DURATION来计算就没有问题了
boost::gregorian::date_duration diff = boost::gregorian::day_clock::local_day()- util::oledate_to_boostdate(dateOfBirth);
if( diff.is_negative() || diff > boost::gregorian::date_duration(200*365) )
return E_INVALIDARG;
}
而跟踪到这里时发现,计算出的这个diff居然是负值!
仔细查阅文档,发现我的boost date_time库在编译时选择了time_duration的ticks数据类型为__int64,此时发生了数据溢出:)
65*365*24*60*60*1000000000
boost::posix_time::time_duration diff = util::ptime_now() - util::oletime_to_boosttime(dateOfBirth);
if( diff.is_negative() || diff > boost::posix_time::hours(200*365*24) )
return E_INVALIDARG;
}
改成用DATE_DURATION来计算就没有问题了
boost::gregorian::date_duration diff = boost::gregorian::day_clock::local_day()- util::oledate_to_boostdate(dateOfBirth);
if( diff.is_negative() || diff > boost::gregorian::date_duration(200*365) )
return E_INVALIDARG;
}
相关文章推荐
- 文件传输协议(File Transfer Protocol, FTP)
- ASP.NET应用程序的安全方案(三)—安全通信
- 关于RowSet的使用(1)
- 学习高手源码的乐趣!
- 关于建立《文件格式、协议大全》共享版 的想法
- 最好的朋友
- 一个压缩及解压缩的类
- 看了一下午的遗传
- P2P 之 UDP穿透NAT的原理与实现(附源代码)
- 上传文件
- 把javascript,vbscript中得数组传递给COM组件(or Activex)
- [新功能]在个人Blog页面显示最新评论
- 调用WCE API
- 工作终于要搞好
- 读Inside the C++ Object Model有感
- 基类和子类的调用顺序(C#,java)
- 一个获取文件crc32校验码的简洁的java类
- 属性readyState的使用,做自动登陆器
- 一个实现MD5的简洁的java类
- [股市]股言