数据类型不一致时,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