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

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在x86和x64的同一頁面中讀取緩沖區(qū)的末尾是否安全?

在x86和x64的同一頁面中讀取緩沖區(qū)的末尾是否安全?

浮云間 2019-10-11 14:14:19
如果允許高性能算法中發(fā)現(xiàn)的許多方法在輸入緩沖區(qū)的末尾讀取少量內(nèi)容,則可以簡化這些方法。在此,“少量”通常表示W(wǎng) - 1末尾最多字節(jié),其中W的字長是算法字節(jié)數(shù)(例如,對于以64位塊為單位的輸入處理算法,最多為7個(gè)字節(jié))。顯然,一般來說,從輸入緩沖區(qū)的末尾寫入數(shù)據(jù)永遠(yuǎn)都不安全,因?yàn)槟赡軙?huì)破壞緩沖區(qū)1之外的數(shù)據(jù)。還很清楚,由于緩沖區(qū)的末尾可能無法讀取,因此將超出緩沖區(qū)末尾的內(nèi)容讀入另一頁可能會(huì)觸發(fā)分段錯(cuò)誤/訪問沖突。但是,在讀取對齊值的特殊情況下,至少在x86上似乎無法出現(xiàn)頁面錯(cuò)誤。在該平臺(tái)上,頁面(以及因此的內(nèi)存保護(hù)標(biāo)志)具有4K的粒度(可以使用更大的頁面,例如2MiB或1GiB,但它們是4K的倍數(shù)),因此對齊的讀取操作將僅訪問同一頁面中的字節(jié)作為有效字節(jié)緩沖區(qū)的一部分。這是一些循環(huán)的規(guī)范示例,該循環(huán)對齊其輸入并從緩沖區(qū)末尾讀取最多7個(gè)字節(jié):int processBytes(uint8_t *input, size_t size) {    uint64_t *input64 = (uint64_t *)input, end64 = (uint64_t *)(input + size);    int res;    if (size < 8) {        // special case for short inputs that we aren't concerned with here        return shortMethod();    }    // check the first 8 bytes    if ((res = match(*input)) >= 0) {        return input + res;    }    // align pointer to the next 8-byte boundary    input64 = (ptrdiff_t)(input64 + 1) & ~0x7;    for (; input64 < end64; input64++) {        if ((res = match(*input64)) > 0) {            return input + res < input + size ? input + res : -1;        }    }    return -1;}內(nèi)部函數(shù)int match(uint64_t bytes)未顯示,但是它是尋找與特定模式匹配的字節(jié)的東西,如果找到則返回最低位置(0-7),否則返回-1。首先,為了簡化說明,將大小小于8的案例當(dāng)成了另一個(gè)函數(shù)。然后對前8個(gè)(未對齊的字節(jié))進(jìn)行一次檢查。然后,對剩余floor((size - 7) / 8)的8個(gè)字節(jié)2的塊進(jìn)行循環(huán)。該循環(huán)最多可以讀取緩沖區(qū)末尾的7個(gè)字節(jié)(當(dāng)時(shí)為7字節(jié)input & 0xF == 1)。但是,返回調(diào)用有一個(gè)檢查,該檢查排除了超出緩沖區(qū)末尾的任何虛假匹配。實(shí)際上,這樣的功能在x86和x86-64上安全嗎?這些類型的過度讀取在高性能代碼中很常見。避免這種過度讀取的特殊尾碼也很常見。有時(shí),您會(huì)看到后者取代了前者,從而使valgrind等工具靜音。有時(shí)您會(huì)看到進(jìn)行此類替換的建議,但由于成語安全且工具錯(cuò)誤(或過于保守)而被拒絕3。
查看完整描述

3 回答

?
呼喚遠(yuǎn)方

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

如果您允許考慮使用非CPU設(shè)備,那么一個(gè)潛在的不安全操作示例就是訪問PCI映射的內(nèi)存頁的越界區(qū)域。不能保證目標(biāo)設(shè)備使用與主內(nèi)存子系統(tǒng)相同的頁面大小或?qū)R方式。例如,[cpu page base]+0x800如果設(shè)備處于2KiB頁面模式,則嘗試訪問地址可能會(huì)觸發(fā)設(shè)備頁面錯(cuò)誤。這通常會(huì)導(dǎo)致系統(tǒng)錯(cuò)誤檢查。


查看完整回答
反對 回復(fù) 2019-10-11
?
嗶嗶one

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊

uint32_t foo = *(uint32_t*)aligned_pointer將編譯為32位負(fù)載。一次只測試一個(gè)字節(jié)并不重要foo。如果代碼的行為取決于終止之后字節(jié)中的內(nèi)容0,那是一個(gè)錯(cuò)誤,但是完全加載它們可能會(huì)導(dǎo)致問題。訪問檢查在加載/存儲(chǔ)上進(jìn)行;寄存器無法跟蹤有關(guān)數(shù)據(jù)來源的信息。glibc的出色實(shí)現(xiàn)甚至通過ALU饋入整個(gè)64B,從而將其組合成可以分支的一件事。

查看完整回答
反對 回復(fù) 2019-10-11
  • 3 回答
  • 0 關(guān)注
  • 660 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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