memory - AccessSize 在 ASAN 检测代码中的重要性
问题描述
我最近一直在处理Address Sanitizer(ASAN)的内部,我开始了解 ASAN 的代码检测。
当检测 1,2,4 字节访问时,检测是:
ShadowAddr = (Addr >> 3) + Offset;
k = *ShadowAddr;
if (k != 0 && ((Addr & 7) + AccessSize > k))
ReportAndCrash(Addr);
我不明白 AccessSize 的line 3
作用以及为什么在那里使用它。
解决方案
正如AddressSanitizerAlgorithm wiki中所解释的,影子内存的每个字节都对相应的 7 个用户内存字节的状态进行编码:
- 0 表示所有 8 个字节都有效
- k=1..7 表示 k 字节有效
- (其他值也有含义,但为简洁起见我们省略了它们)
因此条件
if (k != 0 && ((Addr & 7) + AccessSize > k))
ReportAndCrash(Addr);
意味着如果少于 8 个字节是有效的 ( k != 0
) 并且访问的内存范围不适合有效字节 ( (Addr & 7) + AccessSize > k
) 访问是不正确的,应该报告。
推荐阅读
- url - 更改 cli 生成的 VueJS 项目的根路径
- javascript - Ember 发生错误:断言失败:在没有有效事件名称的情况下调用
- javascript - 为什么 '.attr("x", dx = d3.event.x)' 有效?
- c# - Azure 服务总线“分配的超时”异常
- php - Laravel 5.6 Passport oAuth2 无法使用 Guzzle 发出请求
- java - FlyWeight 设计模式
- php - 如何同时执行多个 MySql 查询?
- java - 检测到 Eclipse 插件但未加载
- java - 通过控制器方法上的注释的Spring aop不起作用
- .htaccess - Htaccess 重定向到 https 除了 ads.txt