【问题标题】:Why can't clang enable all sanitizers?为什么clang不能启用所有的消毒剂?
【发布时间】:2016-08-26 14:18:28
【问题描述】:

Clang 有各种消毒剂,可以打开以在运行时发现问题。
但是,有些消毒剂我不能一起使用。这是为什么?

clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=address -o main main.cpp                                                                                   1
clang: error: invalid argument '-fsanitize=address' not allowed with '-fsanitize=memory'

这没什么大不了的,但是当我运行我的单元测试时,它需要的时间比它应该的要长,因为我为相同的测试创建了多个二进制文件,并分别运行它们中的每一个。

clang++-3.9 -std=c++1z -g -fsanitize=address -o test1 test.cpp
clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=undefined  -o test2 test.cpp

【问题讨论】:

  • 我的猜测是,某些仪器不兼容 - 例如。一种消毒剂的检测会导致另一种消毒剂出现误报或误报。但我也会对技术细节非常感兴趣。
  • “当我运行我的单元测试时,它花费的时间比它应该的长” -> 看起来你没有使用-O-O1 可以安全地与内存清理器一起使用,并且不会破坏堆栈跟踪(除了尾调用)
  • @viraptor 谢谢,这是一个很好的观点。我指的是实际的编译时间。构建多个二进制文件来测试相同的软件组件。

标签: c++ clang clang++ compiler-flags sanitizer


【解决方案1】:

我认为问题在于 Asan 和 Msan 都想控制堆,并且都想保留大量内存用作“影子内存”,以跟踪程序使用的内存的分配和使用情况。

它们不能同时处于活动状态,因为它们会尝试跟踪其他清理程序正在使用的内存(根据清理程序检查的规则,这可能看起来不“安全”)。

这也会导致内存使用异常,因为两个清理程序都会分配额外的内存来跟踪程序使用的每个字节。

也许理论上它们可以被重新设计以共享一个共同的框架,这样它们就可以合作而不是发生冲突,但可能有很好的实际原因说明这样做会很困难,或者会损害性能。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多