假设我有一个名为 put.bc 的文件。它没有字符串“asan_report”和“ubsan_handles”。 如果我直接使用命令
clang -fsanitize=address -emit-llvm -o put-asan.bc -c put.bc
,“asan_report”将不会出现在put-asan.bc中。
所以,我写了一个pass1.cpp:
for (Function &F : M)
{
F.addFnAttr(Attribute::SanitizeAddress);
}
编译为pass1.so。 我使用命令
clang -Xclang -load -Xclang pass1.so -emit-llvm -o put-tem.bc -c put.bc
。
还有命令 clang -fsanitize=address -emit-llvm -o put-asan.bc -c put-tem.bc
。
因此,put-asan.bc 有字符串“asan_report”或其他内容。这意味着asan仪器在其上使用成功。我不知道如何使用 ubsan 来检测 put.bc。因为没有像asan那样的F.addFnAttr(Attribute::SanitizeUndefined);
。
有没有办法从 put.bc 获取 put-ubsan.bc?我该怎么办?
我使用 llvm 12.0.1。
与 ASan TSan 和 MSan 不同,它们是可以在任何 LLVM IR 上运行的 LLVM 通行证,UBSan 是 clang 的一项功能,它更改了从原始 C++ 源代码生成的 LLVM IR。这是 UBSan 工作方式的重要组成部分,因为 UBSan 会检测 C++ 语言标准中未定义行为的事物,即使等效的 LLVM IR 具有明确定义的行为也是如此。