制造一个空指针,来触发linux的panic
因为学习system dump和crash工具的愿意,打算制造一个panic分析一把。原以为制造一个空指针很容易,但是当你刻意想犯错的时候,却发现,原来这个也很难。结论是两中情况可以触发panic:1. 让PC指针为NULL时可以触发panic。2. 对一个形参为指针类型的函数而言,如果调用时,传入其形参的指针为空时,会panic。第一种情况举例:void te
通常制造一个空指针引起的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
更多推荐
所有评论(0)