【问题标题】:Which of the three mutually exclusive Clang sanitizers should I default to?我应该默认使用三种互斥的 Clang 消毒剂中的哪一种?
【发布时间】:2018-05-16 07:14:17
【问题描述】:

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

不能在同一个程序中组合多个 -fsanitize=address, -fsanitize=thread-fsanitize=memory 跳棋。

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

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

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

【问题讨论】:

    标签: clang clang++ address-sanitizer sanitizer


    【解决方案1】:

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

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

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

    [**] 请参阅Asan FAQ 了解使 AddressSanitizer 更加严格的方法(查找“积极诊断”)

    【讨论】:

    • 能否贴出结合 A、UB 和 L 消毒剂的标志?是-fsanitize=address,undefined,leak吗?
    • @shuhalo 是的,你是对的。我已将此添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多