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真的有非常多精妙的地方。