linux内核中platform框架中的一个小技巧

先给出函数原型:

struct platform_device *platform_device_alloc(const char *name, int id)
{
 struct platform_object *pa;

 pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
 if (pa) {
  strcpy(pa->name, name);
  pa->pdev.name = pa->name;
  pa->pdev.id = id;
  device_initialize(&pa->pdev.dev);
  pa->pdev.dev.release = platform_device_release;
 }

 return pa ? &pa->pdev : NULL;
}

关键就在:

 pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);

我初一看,用strlen没有加1,那在刚好撞上结构体后面跟的不是'/0',那岂不是内存越界?

查看结构体定义:

struct platform_object {
 struct platform_device pdev;
 char name[1];
};

心中的疑惑解了!

关键就在 char name[1];
这样结构体在分配内存的时候就会以结构体对齐的方式增加一块内存(不一定是一个字节),如果是常规32位的编译器,以四字节方式对齐的话那就是4个字节了。

就算撞到一些没有'/0'概念的同志,数据也不会越界。以后一定要将这个技巧应用在实战中,这一招确实可以极大的加大项目的健壮性。

另外在拷贝的时候是:

 strcpy(pa->name, name);

把针指这四个字节都给省掉了,又省了四个字节的空间。

仔细体会,linux真的有非常多精妙的地方。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值