亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GCC的_屬性_(包裝)/#語用包不安全嗎?

GCC的_屬性_(包裝)/#語用包不安全嗎?

C++ C
溫溫醬 2019-06-25 13:50:42
GCC的_屬性_(包裝)/#語用包不安全嗎?在C中,編譯器將按照聲明的順序排列結構的成員,在成員之間插入可能的填充字節,或者在最后一個成員之后插入字節,以確保每個成員正確地對齊。GCC提供了語言擴展,__attribute__((packed)),它告訴編譯器不要插入填充,從而允許結構成員對齊。例如,如果系統通常需要所有int對象具有4字節對齊,__attribute__((packed))能引起int將在奇數偏移量處分配的結構成員。引用GCC文獻:“打包”屬性指定變量或結構字段應該具有最小的對齊方式-變量為一個字節,字段為一個位,除非您用“對齊”屬性指定更大的值。顯然,使用這個擴展會導致較小的數據需求,但代碼會更慢,因為編譯器必須(在某些平臺上)生成代碼,以便一次訪問錯誤對齊的成員。但有什么不安全的情況嗎?編譯器是否總是生成正確(盡管速度較慢)代碼來訪問打包結構的錯誤對齊成員?它在所有情況下都有可能這樣做嗎?
查看完整描述

3 回答

?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

正如上面所述,不要拿出一個指向一個結構的成員的指針。這只是玩火而已。當你說__attribute__((__packed__))#pragma pack(1)你真正說的是“GCC,我真的知道我在做什么?!碑斒聦嵶C明你沒有,你不能責怪編譯器。

也許我們可以因為編譯器的自滿而責怪它。而GCC確實有-Wcast-align選項時,默認情況下不啟用該選項,也不使用-Wall-Wextra..這顯然是因為GCC的開發人員認為這類代碼是腦死亡的。“憎惡“不值得提及

考慮以下幾點:

struct  __attribute__((__packed__)) my_struct {
    char c;
    int i;};struct my_struct a = {'a', 123};struct my_struct *b = &a;int c = a.i;int d = b->i;int *e __attribute__((aligned(1))) = 
    &a.i;int *f = &a.i;

在這里,類型a是一個打包的結構(如上面所定義的)。同樣,b是指向打包結構的指針。表達式的類型a.i是(基本上)一個intL值1字節對齊。cd都是正常的int讀書時a.i編譯器生成未對齊訪問的代碼。當你讀到b->ib他的類型仍然知道它很擁擠,所以他們也沒問題。e是指向單字節對齊int的指針,因此編譯器也知道如何正確地取消引用。但是當你做這個任務的時候f = &a.i,您正在將未對齊int指針的值存儲在對齊int指針變量中-這就是您出錯的地方。我同意,GCC應該讓這個警告違約(甚至在-Wall-Wextra).


查看完整回答
反對 回復 2019-06-25
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

只要您始終通過結構通過.(點)或->符號。

什么Safe是將未對齊數據的指針取出來,然后訪問它,而不考慮這一點。

此外,即使已知結構中的每一項都是對齊的,但已知它是對齊的。以一種特殊的方式因此,結構作為一個整體必須按照編譯器的預期對齊,否則就會有麻煩(在某些平臺上,或者在將來,如果發明了一種優化未對齊訪問的新方法)。


查看完整回答
反對 回復 2019-06-25
  • 3 回答
  • 0 關注
  • 1720 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號