如何在运行时临时调整AddressSanitizer(ASAN)功能并恢复原有状态?
临时调整AddressSanitizer(ASAN)功能的正确方法
你用setenv修改环境变量没用的原因很直接:ASAN的配置参数是在程序启动初始化阶段就读取完毕的,运行时修改环境变量根本不会触发ASAN重新加载配置,自然无效。
要实现临时开启allocator_may_return_null的需求,得用ASAN提供的运行时配置API——__asan_set_option,它能在程序运行期间动态调整ASAN的各项参数。
下面是可用的代码示例:
#include <assert.h> #include <stdlib.h> #include <stdint.h> // 临时启用allocator_may_return_null __asan_set_option("allocator_may_return_null=1"); // 执行你的测试逻辑 void *ptr = malloc(SIZE_MAX); assert(ptr == NULL); // 此时malloc会返回NULL,不会触发ASAN错误 // 恢复默认设置 __asan_set_option("allocator_may_return_null=0");
额外注意事项
- 这个API需要编译器支持(clang 3.4+、gcc 4.8+都没问题),编译时记得带上ASAN的编译选项(
-fsanitize=address) - 如果只是想临时屏蔽所有ASAN检查,也可以用
__asan_disable()和__asan_enable(),但这种方式会全局禁用ASAN,不如精准设置单个选项来得稳妥 - 调用
__asan_set_option时,参数格式和环境变量完全一致,都是"键=值"的字符串格式
内容的提问来源于stack exchange,提问作者ideasman42
相关产品推荐
相关产品推荐

