先給出函數原型:
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真的有非常多精妙的地方。