linux核心中platform架構中的一個小技巧

來源:互聯網
上載者:User

先給出函數原型:

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.