繁体   English   中英

为什么clang不能启用所有的消毒剂?

[英]Why can't clang enable all sanitizers?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM