c++ - 为什么clang不能启用所有的 sanitizer ?

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

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

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

最佳答案

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

它们不能同时处于事件状态,因为它们会尝试跟踪另一个 sanitizer 正在使用的内存(根据 sanitizer 检查的规则,这可能看起来不“安全”)。

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

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

关于c++ - 为什么clang不能启用所有的 sanitizer ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36971902/

相关文章:

c++ - 如何使用 C++ WinAPI 在 Windows 机器上可靠地将本地时间转换为 UTC

c++ - 是否有编译器警告会在函数返回后捕获代码?

c++ - 为什么我的代码在终端中没有输出任何内容。开始新行没有错误

c++ - 围绕自身旋转物体

c++ - Cocoa 对应于 Windows 的 SetTimer

c++ - 如何使用缓存技术提高性能

Clang AST 解释

objective-c - 是否有等同于 __attribute__((ns_returns_retained)) 的 malloc 指针?

c++ - enable_shared_from_this 不适用于 xcode 5

c++ - 选择替代实现和前向声明