linux如何定义一个非空指针,制造一个空指针,来触发linux的panic

通常制造一个空指针引起的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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值