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)行讀取。

