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

时间:2016-05-01 21:02:26

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

也许在理论上他们可以重新设计以共享一个共同的框架,这样他们就可以合作而不会发生冲突,但可能有非常好的实际原因,为什么这会很难,或者会影响性能。