Clang拥有a number of sanitizers,可以对可疑行为进行运行时检查。不幸的是,they can't all be enabled at once.
在同一个程序中无法合并多个
-fsanitize=address,
-fsanitize=thread
和-fsanitize=memory
检查器。
更糟糕的是,这三者中的每一件似乎都太有用了。 AddressSanitizer检查内存错误,ThreadSanitizer检查竞争条件,MemorySanitizer检查未初始化的读取。 我担心所有这些事情!
显然,如果我对虫子的位置有预感,我可以根据这个选择一个消毒剂。但是,如果我不这样做呢?更进一步,如果我想使用消毒剂作为预防工具而不是诊断工具,指出我甚至不知道的错误?
换句话说,鉴于我没有特别寻找任何东西,我应该默认编译哪个消毒剂?我只是希望编译并测试整个程序三次,每个消毒剂一次?
答案 0 :(得分:1)
正如您所指出的,消毒剂通常是互斥的(您只能组合Asan + UBsan + Lsan),因此确保完全覆盖的唯一方法是对每个人进行单独的QA运行(这意味着每次运行都要重建SW) )。
在生产中使用Asan有两个方面。一方面常见的经验是,在生产中只能 检测到某些错误,因此您 希望偶尔在那里运行已清理的构建,以增加测试覆盖率[*]。另一方面,据报道Asan在某些情况下增加攻击面(参见例如this oss-security report),因此不鼓励使用它作为硬化解决方案(以防止错误而不是检测它们)。
<子> [*]作为旁注,Asan开发人员还强烈建议使用模糊测试来增加覆盖范围(例如,参见Cppcon15和CppCon17会谈)。 子>