内存越界引起的bug汇总

    技术2022-05-20  48

    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)