ASAN部署

博客介绍了ASAN相关内容,包括可通过readelf、objdump等命令查看ASAN是否编译生效,还详细说明了运行环境变量ASAN_OPTIONS的配置,如halt_on_error控制检测内存错误后是否继续运行,detect_leaks使能内存泄露检测等。

背景

插件

编译选项

-fsanitize=address

用户态内存错误检测,可以被环境变量ASAN_OPTIONS控制具体行为


-fsanitize=kernel-address

内核态内存错误检测器


-fsanitize=thread

使能ThreadSanitizer,快速数据竞争检测。


-fsanitize=leak

使能LeakSanitizer,内存泄露检测,作用于链接阶段。只有当-fsanitize=address和-fsanitize=thread均不使能时才有效。没有-fsanitize=address功能全面,只做内存泄露检测,但是速度比-fsanitize=address要快。

内存泄露检查-fsanitize=leak只有在GCC版本≥4.9时才有效。



-fsanitize=undefined

运行时快速未定义行为检测器。包括如下6~22共17个子选项。



-fsanitize=shift

移位操作符的移位大小超过了位宽或者小于零,或者左边是负值。 对于有符号数移位, 检查C中的有符号溢出,在C++中检查无符号溢出。



-fsanitize=integer-divide-by-zero

整数除零。


-fsanitize=unreachable

如果控制流到达 __builtin_unreachable.


-fsanitize=vla-bound

可变长数组边界值非正。


-fsanitize=null

使用一个空指针或者创建一个空引用


-fsanitize=return

仅C++有效,对函数返回值进行检查,定义了返回值为非空的函数如果未返回有效值将会报错。


-fsanitize=signed-integer-overflow

有符号整数溢出, 包含所有通过 -ftrapv 添加的检查, 并且检查有符号除法溢出 (INT_MIN / -1)。


-fsanitize=bounds

数组索引越界, 以防数组边界可以静态检测。


-fsanitize=alignment

使用一个未对齐的指针或者引用。


-fsanitize=object-size

尝试使用优化器可以探测到不属于访问对象的字节。 对象的大小使用 __builtin_object_size 检测, 并且结果可能会探测到多个问题在高层次的优化。


-fsanitize=float-divide-by-zero

浮点除零。不能被-fsanitize=undefined使能。


-fsanitize=float-cast-overflow

浮点到整形转换的检查,不能被-fsanitize=undefined使能。


-fsanitize=nonnull-attribute

对使用__attribute__ nonnull限定参数非空的函数进行检查。


-fsanitize=returns-nonnull-attribute

对使用__attribute__((returns_nonnull))限定返回为非空指针的函数进行检测。


-fsanitize=bool

加载一个既不是真也不是假的bool值。


-fsanitize=enum

加载一个枚举类型的值,但是值不在那个枚举类型范围内。


-fsanitize=vptr

使用一个vptr预示着具有错误动态类型的对象,或者它的生命长度还未开始或者已经结束。与 -fno-rtti 兼容。


-fno-sanitize=all

禁止之前所有的子选项,-fsanitize=all是不能使用的,因某些子选项是不兼容的


-fasan-shadow-offset=number

自定义AddressSanitizer检查中的shadow偏移。


-fsanitize-recover[=opts]

使用逗号分隔的列表控制错误恢复模式。如:-fsanitize-recover=undefined,float-cast-overflow,float-divide-by-zero

-fno-sanitize-recover等同于

-fno-sanitize-recover=undefined,float-cast-overflow,float-divide-by-zero


-fsanitize-undefined-trap-on-error

 

ASAN是否编译生效

可以使用readelf、objdump等命令来查看:

readelf -a libxx.so | grep asan

运行环境变量ASAN_OPTIONS配置

# halt_on_error=0:检测内存错误后继续运行

# detect_leaks=1:使能内存泄露检测

# malloc_context_size=15:内存错误发生时,显示的调用栈层数为15

# log_path=/system/lib/asan.log: 内存检查问题日志存放文件路径(需考虑是否有写权限)

# suppressions=$SUPP_FILE:屏蔽打印某些内存错误

export ASAN_OPTIONS=halt_on_error=0:use_sigaltstack=0:detect_leaks=1:malloc_context_size=15:log_path=/system/lib/asan.log:suppressions=$SUPP_FILE

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值