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位)进行读取。

相关推荐
Tisfy12 小时前
iOS:压缩和解压live图(.livp)——百度一刻相册+百度网盘识别支持
ios·百度网盘·livp·live图·一刻相册
唐诺16 小时前
Objective-C 之 KVC 详解
ios·objective-c·kvc
00后程序员张18 小时前
iOS 打包方式汇总 从 Xcode Archive 到轻量级工具链的 IPA 构建
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
CHB1 天前
uni-app x 蒸汽模式 iOS版 性能测试基准报告 Benchmark
ios·uni-app·swiftui
美狐美颜SDK开放平台1 天前
Android/iOS直播APP平台开发中的视频美颜SDK优化技巧
android·ios·音视频·美颜sdk·第三方美颜sdk
唐诺1 天前
Objective-C 之 Foundation框架 详解
ios·objective-c·foundation
专一的黑猫1 天前
写一个iPhone应用程序,要求可以输入名字,点击按钮后,会显示一段文字向输入的名字打招呼,例如输入“宝玉”,显示“你好,宝玉!”
ios·iphone
_瑞3 天前
深入理解灵动岛
前端·ios·app
黑科技iOS上架3 天前
分享一个开源的iOS应用AppIcon生成器
经验分享·ios
wabil4 天前
【LVGL】滑动切换页面的界面优化实践
开发语言·ios·swift