数据类型不一致时,a=b=c表达式引起的bug
来源:互联网 发布:费曼feynman知乎 编辑:程序博客网 时间:2024/05/16 01:07
从网上找的wu_manber算法源代码,运行的时候发现,一旦我要匹配的模式多的时候,就coredump了,core提示"unable to handle kernel paging request at 0xxxxxx",栈指针指向wmprepHashedPatternGroups函数。
开始以为问题出在这个函数中的kmalloc调用上,因为前面已经kmalloc了大量内存,很可能在这里需要分配125KB内存时失败了。为了验证猜想,在这个kmalloc函数前后添加了打印语句,再次运行后,发现这两条语句都打印出来了,随后内核挂掉了。
在函数开始处,直接返回,发现即使其它函数依旧有kmalloc调用,内核不会挂掉。说明问题出在wmprepHashedPatternGroups函数,但不在kmalloc上。
一定是这个函数访问了非法指针。
检查发现“sindex=ps->msHash[hindex]=i"引起我的注意。sindex类型为unsigned int,msHash为short,i为int,a=b=c表达式的赋值顺序为b=c,a=b。这样当i大于32768时,sindex将由msHash得到一个负值。后面使用sindex做数值索引时,就引用国非法地址。
将msHash类型改为unsigned int后,问题得到解决。
总结:
使用a=b=c表达式时,尽量使数据类型一致,如果不一致,就要保证左边的数据类型的表示范围大于右边。
0 0
- 数据类型不一致时,a=b=c表达式引起的bug
- Java表达式y=a<b?c:d>a?b:c的运算解释
- a^=b^=a^=b的Bug?
- 逗号表达式 c = a,b; d = (a,b);
- a= b?c:d 问号表达式
- 数据类型不匹配引起的bug
- 当a=1,b=2,c=3时,if(a>c)b=a;a=c;c=b;的执行结果详解
- c = ( (++a) + (b++) );
- A=B+C
- a^=b^(b^=a^b)——连续赋值表达式的陷阱
- 表达式 a*(b+c)-d 的后缀表达式?
- 条件表达式C?A:B
- 问号表达式 a?b:c
- $a && $b = $c的问题
- 基本数据类型double和封装类型Double引起的bug
- 中缀表达式X=A+B*(C-(D+F))/E转后缀表达式之后是什么?
- 找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}。
- a=a+++b;c=a+++b;
- MongoDB 导入数据(CSV文件)
- 14. Longest Common Prefix
- 一个基于MD风格的android对话框,代码兼容性很好,样式也非常简洁
- HTTP协议详解
- pushViewController卡顿的解决
- 数据类型不一致时,a=b=c表达式引起的bug
- 查看应用当前activity名称
- java数据结构学习之旅-简单排序总结
- svn使用心得
- 重拾编程之路--Linked List Cycle II
- 2015人工智能重大突破
- Activiti工作流(二)——入门Demo及数据库
- S盒的变换
- NPOI导入,导出数据库