如何通过Bazel抑制MSan报错?求简便方案及参考项目
在Bazel中简便抑制MSan第三方库报错的方案
核心方案:利用Clang环境变量传递忽略列表
无需修改所有目标或编写复杂工具链,通过Clang原生支持的CLANG_SANITIZER_IGNORELIST环境变量,可快速将忽略列表应用到所有编译动作中:
- 创建MSan忽略列表文件
在项目根目录下新建msan_ignorelist.txt,根据需要添加忽略规则,示例:
# 忽略Google Protobuf相关错误 src:*protobuf* # 忽略GTest相关错误 src:*gtest* # 可按符号/路径细化规则,比如忽略特定函数 fun:*protobuf::Internal*
规则可通过通配符匹配第三方库的路径、符号或函数,语法遵循Clang Sanitizer忽略列表规范。
- 修改bazelrc配置
在已有的MSan配置块中添加环境变量设置:
build:msan --copt=-fsanitize=memory build:msan --copt=-fno-omit-frame-pointer build:msan --copt=-g build:msan --linkopt=-fsanitize=memory build:msan --linkopt=-g test:msan --test_env=MSAN_SYMBOLIZER_PATH=/path/to/llvm-symbolizer # 传递忽略列表路径给Clang build:msan --action_env=CLANG_SANITIZER_IGNORELIST=$(pwd)/msan_ignorelist.txt
--action_env会将环境变量注入所有Bazel编译动作中,Clang会自动读取该变量并应用-fsanitize-ignorelist参数,无需手动为每个目标添加依赖。
补充说明
如果项目涉及远程构建或路径动态变化,可将msan_ignorelist.txt作为data依赖添加到项目顶层的cc_library或test_suite目标中,确保Bazel能追踪到文件路径:
cc_library( name = "project_root", data = ["msan_ignorelist.txt"], visibility = ["//visibility:public"], )
此时bazelrc中的路径可改为$(BAZEL_WORKSPACE)/msan_ignorelist.txt。
参考项目实践
不少基于Bazel的大型项目(如TensorFlow、LLVM)均采用环境变量方式配置Sanitizer忽略列表,避免了修改大量目标或编写复杂工具链的成本,与OpenXLA生态的构建模式兼容。
内容的提问来源于stack exchange,提问作者zsrkmyn
相关产品推荐
相关产品推荐

