STL 库中的陷阱----一个难以察觉的 bug
来源:互联网 发布:网络排名优化方案 编辑:程序博客网 时间:2024/05/16 00:25
请找出下面程序的 bug?
int maxProfit2(vector<int> &prices){ int local[3] = {0}; int global[3] = {0}; for(int i=0; i<prices.size()-1; ++i) { int diff = prices[i+1] - prices[i]; for(int j=2; j>=1; --j) { local[j] = max(global[j-1]+max(diff, 0), local[j]+diff); global[j] = max(global[j], local[j]); } } return global[2];}
当 prices 为空的时候,程序出现 segmentation fault.
分析:
本以为 prices为空时,for循环内部就不会运行,没想到,竟然运行了!!!
问题出在了 i < prices.size() -1
prices.size() 返回的类型是 size_t, 其实是一个无符号数,
无符号数与 - 1 运算时,将有符号数 - 1 隐式转化为无符号数,大家知道 -1 的补码表示是 0xffff ffff ffff ffff,
所以当 prices为空时, 0 + 0xffff ffff ffff ffff = 0xffff ffff ffff ffff ffff = 2^64 -1
因此,i < prices.size() -1 (无符号数比较)满足;
怎么办呢?
可以这样
int n = prices.size(); // 先把 prices.size() 赋给 有符号数 n。
不知道有没有其他的好方法,欢迎留言。。。
5 0
- STL 库中的陷阱----一个难以察觉的 bug
- 难以察觉的形象
- NodeJS研究笔记:异步编程导致难以察觉的bug
- 【Python】闭包中一个不易察觉的陷阱
- 难以察觉的环形include问题
- 微软STL的一个bug
- MyEclipse部署Web Project时,一个不易察觉的问题
- 案例:如何解决难以重现的BUG
- 案例:如何解决难以重现的BUG
- 使用checkpoint解决难以复现的Bug
- 如何重现难以重现的bug
- 如何重现难以重现的bug
- 如何重现难以重现的bug
- 如何应对难以重现的偶发性bug?
- 如何应对难以重现的Bug?
- 一个难以实现的想法
- vector<bool>STL中的陷阱
- 转型操作的中的一个陷阱
- 为SSD编程(1):简介和目录
- Linux中的MACH定义之MACHINE_START / MACHINE_END
- Android中bootchart的使用
- 我这个if else 语句怎么运行不正确啊
- Linux下安装与配置Mysql 5
- STL 库中的陷阱----一个难以察觉的 bug
- Request body二次取得的问题
- static小结
- Scala 的 yield
- UML类图新手入门级介绍
- Linux / Unix Command: bzip2
- JNI java.lang.UnsatisfiedLinkError
- Android高效加载大图、多图解决方案,有效避免程序OOM
- ubuntu上面编译并使用OpenCV