为什么不能打开所有消毒剂?

Tre*_*key 18 c++ clang compiler-flags sanitizer clang++

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'
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

fra*_*sie 8

将 Address Sanitizer 和 Memory Sanitizer 分开是一项设计决策,与 MemCheck 和 Dr. Memory 等工具相比,可以减少整体运行时间,这些工具同时针对可寻址性问题和未初始化内存的使用。根据开发人员的说法,同时处理这两类问题比依次运行 ASan 和 MSan 会产生更多的开销。

  • 与高票数的答案不同,它引用了一个很好的来源,而不是猜测。 (2认同)

Jon*_*ely 7

我认为问题是Asan和Msan都希望控制堆,并且都希望保留大量内存用作"影子内存",它跟踪程序使用的内存的分配和使用情况.

它们不能同时处于活动状态,因为它们会试图跟踪其他消毒剂使用的内存(根据消毒剂检查的规则,它可能看起来并不"安全").

它还会导致疯狂的内存使用,因为两个清理程序都会分配额外的内存来跟踪程序使用的每个字节.

也许从理论上讲,它们可以重新设计以共享一个共同的框架,这样它们就可以合作而不会发生冲突,但可能有很好的实际原因可能会导致难以实现或损害性能.