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

2969

被折叠的 条评论
为什么被折叠?



