通常制造一个空指针引起的panic的方法是向0地址处去写入一个值。就像以下函数。


void my_panic(void)

{

* (int *) 0 = 0;  //这条语句会先把0强制转换为一个整型指针,然后对这个地址为0的内存单元进行赋值操作,从而引起空指针错误。

return;

}

解释: * (int *) 0 = 0;   这条语句换成这样会更清晰: *((int *)0) = 0; 

//=====================================================================

以下是我自己搞panic的方法。

因为学习system dump和crash工具的愿意,打算制造一个panic分析一把。原以为制造一个空指针很容易,但是当你刻意想犯错的时候,却发现,原来这个也很难。


结论是两中情况可以触发panic:

1. 让PC指针为NULL时可以触发panic。

2. 对一个形参为指针类型的函数而言,如果调用时,传入其形参的指针为空时,会panic。


第一种情况举例:

void test(void)
{
    int* (*func) (void) = NULL;     //定义了一个名为func的函数指针。其返回值类型为 int * ,其形参为 void

    func = NULL;                         //让该函数指针指向NULL
    PRINT_ERR("func test\n");
    func();                                   //调用该函数,此处会引发panic。 “  PC is at 0x0 ”
    PRINT_ERR("func test\n");
}


panic信息:

[   25.271484] c0 Unable to handle kernel NULL pointer dereference at virtual address 00000000
[   25.279846] c0 pgd = d7708000
[   25.282775] [00000000] *pgd=00000000
[   25.286346] c0 Internal error: Oops: 80000005 [#1] PREEMPT SMP ARM
[   25.292480] Modules linked in: focaltech_ts[start=0xbf077000,size=22835] trout_fm[start=0xbf06f000,size=15733] mali(O)[start=0xbf000000,size=355684]
[   25.305786] c0 CPU: 0 PID: 645 Comm: sh Tainted: G        W  O 3.10.17-00068-g5e43853-dirty #13
[   25.314483] c0 task: d76d3900 ti: d76cc000 task.ti: d76cc000
[   25.320129] c0 PC is at 0x0
[   25.322906] c0 LR is at test+0xd0/0x124


第二种情况举例:


int* null_pointer_3(int* p)
{
    PRINT_ERR("\n %s p = %d\n", __func__, *p);
    return p;
}

void test(void)
{
    int *p = NULL;

    p = null_pointer_3(NULL);                //调用该函数,此处会引发panic。 “  PC is at null_pointer_3+0x10/0x40 ”
    PRINT_ERR("\n %s p = %d\n", __func__, *p);
}


panic信息:

[   27.378540] c2 Unable to handle kernel NULL pointer dereference at virtual address 00000000
[   27.386871] c2 pgd = d7b4c000
[   27.389770] [00000000] *pgd=00000000
[   27.393341] c2 Internal error: Oops: 5 [#1] PREEMPT SMP ARM
[   27.398895] Modules linked in: focaltech_ts[start=0xbf077000,size=22835] trout_fm[start=0xbf06f000,size=15733] mali(O)[start=0xbf000000,size=355684]
[   27.412200] c2 CPU: 2 PID: 656 Comm: sh Tainted: G        W  O 3.10.17-00068-g5e43853-dirty #12
[   27.420898] c2 task: d7b0ce40 ti: d7b22000 task.ti: d7b22000
[   27.426544] c2 PC is at null_pointer_3+0x10/0x40
[   27.431152] c2 LR is at test+0x90/0xc4


参考:关于函数指针和指针函数的区别请参考:http://baike.baidu.com/view/1604730.htm


Logo

更多推荐