iOS開啟 Address?Sanitizer,讀取 section data 報(bào) global-buffer-overflow 錯(cuò)誤

Address Sanitizer 是什么?

Google 發(fā)明了 Address Sanitizer, 是一種地址錯(cuò)誤檢查器. 這個(gè)東西在編譯時(shí)和運(yùn)行時(shí)發(fā)揮作用. 它被集成進(jìn)了各大編譯器之中,網(wǎng)絡(luò)上有比較多的教程,可自行搜索。

主要可以排查野指針問題,Xcode開啟也很簡單,打個(gè)鉤就行了。

Xcode 開啟后,App啟動(dòng)就報(bào)錯(cuò)了

我們的App啟動(dòng)流程,依賴 section data 注入的結(jié)構(gòu)體,但是在讀取的時(shí)候就報(bào)了 全局堆棧溢出 這個(gè)錯(cuò)誤。

section用法可以參考:
https://juejin.cn/post/6980545001126101005

這個(gè)錯(cuò)誤在 google、stackoverflow、apple 上搜了很久 都有沒有一個(gè)正確的答案。。。

原則上調(diào)用 getsectiondata() 返回的數(shù)據(jù)段都是可以訪問的,不應(yīng)該出現(xiàn)越界。

其中我嘗試過 進(jìn)行自己寫 for 循環(huán)進(jìn)行內(nèi)存復(fù)制、跳段讀取、換各種API嘗試 全部都是出錯(cuò)

最后查看 MachO 里面的數(shù)據(jù)結(jié)構(gòu),發(fā)現(xiàn) ASAN 幫忙注入了越界保護(hù)區(qū),導(dǎo)致一條數(shù)據(jù)有64位(我們實(shí)際只用32位)。

使用宏判斷,開啟 ASAN 的情況下,使用64位進(jìn)行讀取

后面發(fā)現(xiàn)靜態(tài)庫已經(jīng)編譯好的 section data 是不會(huì)注入越界保護(hù)區(qū)的( 在 MachO 還是保持32位 )

解決方案:用 區(qū)分 是否開啟 Address Sanitizer 的 section key,這樣編譯出來的 section data 就是兩個(gè)區(qū)間,讀取時(shí) 開啟 ASAN 的編譯區(qū)間使用 64位進(jìn)行遍歷,沒開啟的使用原結(jié)構(gòu)大?。ㄎ疫@邊是32位)進(jìn)行讀取。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容