iOS开启 Address Sanitizer,读取 section data 报 global-buffer-overflow 错误

Address Sanitizer 是什么?

Google 发明了 Address Sanitizer, 是一种地址错误检查器. 这个东西在编译时和运行时发挥作用. 它被集成进了各大编译器之中,网络上有比较多的教程,可自行搜索。

主要可以排查野指针问题,Xcode开启也很简单,打个钩就行了。

Xcode 开启后,App启动就报错了

我们的App启动流程,依赖 section data 注入的结构体,但是在读取的时候就报了 全局堆栈溢出 这个错误。

section用法可以参考: juejin.cn/post/698054...

这个错误在 google、stackoverflow、apple 上搜了很久 都有没有一个正确的答案。。。

原则上调用 getsectiondata() 返回的数据段都是可以访问的,不应该出现越界。

其中我尝试过 进行自己写 for 循环进行内存复制、跳段读取、换各种API尝试 全部都是出错

最后查看 MachO 里面的数据结构,发现 ASAN 帮忙注入了越界保护区,导致一条数据有64位(我们实际只用32位)。

使用宏判断,开启 ASAN 的情况下,使用64位进行读取

后面发现静态库已经编译好的 section data 是不会注入越界保护区的( 在 MachO 还是保持32位 )

解决方案:用 区分 是否开启 Address Sanitizer 的 section key,这样编译出来的 section data 就是两个区间,读取时 开启 ASAN 的编译区间使用 64位进行遍历,没开启的使用原结构大小(我这边是32位)进行读取。

相关推荐
tangweiguo030519877 小时前
SwiftUI布局完全指南:从入门到精通
ios·swift
T1an-111 小时前
最右IOS岗一面
ios
坏小虎13 小时前
Expo 快速创建 Android/iOS 应用开发指南
android·ios·rn·expo
光影少年14 小时前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
北京自在科技15 小时前
Find My 修复定位 BUG,AirTag 安全再升级
ios·findmy·airtag
Digitally15 小时前
如何不用 USB 线将 iPhone 照片传到电脑?
ios·电脑·iphone
Sim14801 天前
iPhone将内置本地大模型,手机端AI实现0 token成本时代来临?
人工智能·ios·智能手机·iphone
Digitally1 天前
如何将 iPad 上的照片传输到 U 盘(4 种解决方案)
ios·ipad
报错小能手1 天前
ios开发方向——swift并发进阶核心 @MainActor 与 DispatchQueue.main 解析
开发语言·ios·swift
LcGero1 天前
Cocos Creator 业务与原生通信详解
android·ios·cocos creator·游戏开发·jsb