我应该默认使用三个相互排斥的 Clang 消毒剂中的哪一个?

Max*_*xpm 5 clang sanitizer clang++ address-sanitizer

Clang 有许多消毒剂,可以在运行时检查可疑行为。不幸的是,它们不能同时启用。

不能在同一程序中组合多个-fsanitize=address, -fsanitize=thread, 和-fsanitize=memory检查器。

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

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

换句话说,鉴于我没有特别寻找任何东西,默认情况下我应该使用哪种消毒剂进行编译? 我是不是只需要编译和测试整个程序三遍,每个消毒剂一次?

yug*_*ugr 5

正如您所指出的,消毒剂通常是相互排斥的(您只能组合 Asan+UBsan+Lsan, via -fsanitize=address,undefined,leak-fsanitize=...,integer如果您的程序不包含有意的无符号溢出,也可以添加 Isan via ),因此确保完整覆盖的唯一方法是单独QA 与它们中的每一个一起运行(这意味着为每次运行重建 SW)。顺便说一句,还建议再运行一次 Valgrind。

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

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

[**] 有关使 AddressSanitizer 更严格的方法,请参阅Asan 常见问题解答(寻找“积极诊断”)

  • 请张贴包含 A、UB、L 消毒剂的旗帜吗?是“-fsanitize=地址,未定义,泄漏”吗? (2认同)