5

Clang 有许多清理程序,可以在运行时检查可疑行为。不幸的是,它们不能一次全部启用。

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

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

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

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

4

1 回答 1

5

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

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

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

[**] 请参阅Asan 常见问题以了解使 AddressSanitizer 更严格的方法(查找“积极诊断”)

于 2018-05-16T10:04:36.753 回答