内存越界引起的bug汇总

来源:互联网 发布:张大奕的淘宝店链接 编辑:程序博客网 时间:2024/06/05 07:09

转载自: http://blog.csdn.net/guogaofeng1219/article/details/6208287

1

一个比较隐蔽的死锁bug

 

在测试代码的过程中,发现有大概百分之一的概率会出现一个死锁bug。进过仔细检查,发现加锁,解锁的地方是没有问题的。实在找不到问题的原因了,一狠心在每次加锁和解锁之后,将rwlock_t中的lock值打印出来。 每次write_unlock之后,那个值本应该是0的,但在出现问题的时候,发现那个值一个乱码。于是怀疑是锁占的那块内存被写掉了(内存越界)。后来调试发现, 由于在结构体中 rwlock_t 是放在最后的位置上的,它前面还有个字符数组,由于往字符数组里写东西的时候,没有强制长度(写的随机数)。因此发生由于内存越界导致的死锁。

 

2

内核栈溢出引起的bug 

现象:

在内核schedule函数里面发生panic,提示schedule处于原子上下文中(in_atomic()为1 ,即当前thread_info的preempt_count不为0)。进过加log调试发现,preempt_count是突然变成一个很大的数的。 


这种现象比较容易重复,提示的panic信息也相同。


猜测:

是内核栈溢出。 因为内核栈和thread_info共用8k的内存,因为内核栈溢出,把thread_info中的preempt_count值冲掉了,所以出现了奇怪的panic。

 

验证:

在函数内部申请一个局部变量,如果该局部变量的地址,小于thread_info里面preempt_count的地址,则猜想成立。

这是因为栈是向低地址增长的。

 

注意:

在内核编程中一定要防止递归调用和分配局部大数组,因为它们都有可能引发内核栈溢出

 

3

由于进行强转了结构,导致对结构里面的指针进行错误操作。引起的vfree()bad address.

 

现象:

提示vfree()bad address.  (引起这个问题的另外一个原因是,kmalloc分配的内存,用vfree来释放)

 

注意:

进行结构强转时,一定要注意,会不会对强转后的结构里面的成员,做特殊操作。

 

 

关于cache pool Cann't free all objects

以前碰到这种情况 都是由于slab_cache 中有块没有被释放,但是今天碰到了由于某个指针所在的结构没有被初始化,导致多被mempool_free了一次, 最终导致了这种情况。


5

今天调一个bug,始终找不到问题的原因。最后发现 是因为变量越界的问题。

将一个int型的变量 左移 64位,就会出现意想不到的错误。

0 0
原创粉丝点击