我应该默认哪三种互斥的Clang消毒剂?

时间:2018-05-16 07:14:18

标签: clang clang++ address-sanitizer sanitizer

Clang拥有a number of sanitizers,可以对可疑行为进行运行时检查。不幸的是,they can't all be enabled at once.

  

在同一个程序中无法合并多个-fsanitize=address, -fsanitize=thread-fsanitize=memory检查器。

更糟糕的是,这三者中的每一件似乎都太有用了。 AddressSanitizer检查内存错误,ThreadSanitizer检查竞争条件,MemorySanitizer检查未初始化的读取。 我担心所有这些事情!

显然,如果我对虫子的位置有预感,我可以根据这个选择一个消毒剂。但是,如果我不这样做呢?更进一步,如果我想使用消毒剂作为预防工具而不是诊断工具,指出我甚至不知道的错误?

换句话说,鉴于我没有特别寻找任何东西,我应该默认编译哪个消毒剂?我只是希望编译并测试整个程序三次,每个消毒剂一次?

1 个答案:

答案 0 :(得分:1)

正如您所指出的,消毒剂通常是互斥的(您只能组合Asan + UBsan + Lsan),因此确保完全覆盖的唯一方法是对每个人进行单独的QA运行(这意味着每次运行都要重建SW) )。

在生产中使用Asan有两个方面。一方面常见的经验是,在生产中只能 检测到某些错误,因此您 希望偶尔在那里运行已清理的构建,以增加测试覆盖率[*]。另一方面,据报道Asan在某些情况下增加攻击面(参见例如this oss-security report),因此不鼓励使用它作为硬化解决方案(以防止错误而不是检测它们)。

<子> [*]作为旁注,Asan开发人员还强烈建议使用模糊测试来增加覆盖范围(例如,参见Cppcon15CppCon17会谈)。