第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

3 回答

?
慕慕森

TA貢獻1856條經(jīng)驗 獲得超17個贊

正如上面所述,不要拿出一個指向一個結(jié)構(gòu)的成員的指針。這只是玩火而已。當(dāng)你說__attribute__((__packed__))#pragma pack(1)你真正說的是“GCC,我真的知道我在做什么?!碑?dāng)事實證明你沒有,你不能責(zé)怪編譯器。

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

考慮以下幾點:

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


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

TA貢獻1829條經(jīng)驗 獲得超6個贊

只要您始終通過結(jié)構(gòu)通過.(點)或->符號。

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

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


查看完整回答
反對 回復(fù) 2019-06-25
  • 3 回答
  • 0 關(guān)注
  • 1709 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號