gpt4 book ai didi

clang - 我应该默认使用三个相互排斥的 Clang sanitizer 中的哪一个?

转载 作者:行者123 更新时间:2023-12-01 09:45:21 24 4
gpt4 key购买 nike

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

It is not possible to combine more than one of the -fsanitize=address, -fsanitize=thread, and -fsanitize=memory checkers in the same program.



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

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

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

最佳答案

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

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

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

[**] 见 Asan FAQ使 AddressSanitizer 更严格的方法(寻找“积极的诊断”)

关于clang - 我应该默认使用三个相互排斥的 Clang sanitizer 中的哪一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50364533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com