LLVM 项目 MemorySanitizer 有一个难以满足的约束,即所有系统库也必须使用 MemorySanitizer 构建。
我一直在考虑一些方法来为我正在处理的项目(它已经使用 ASAN 和 UBSAN)启用 MSAN,特别是关于这个约束。我一直在考虑的一种可能的解决方案会导致这样一种情况,即当项目编译时-fsanitize=memory
,它会链接到动态系统库的非仪器版本,例如libc
,和libstdc++
,并且,说libcrypto
(添加一个不是真正的一部分的“工具链”)。但是在运行时,检测的二进制文件将在一个特殊的环境(基本上是不同的用户空间)中运行,其中所有系统动态库都是用-fsanitize=memory
.
这样的方案可行吗?在我看来,这取决于构建一个库是否-fsanitize=memory
会改变其 ABI,因为如果库 ABI 在检测版本和非检测版本之间存在差异,那么针对非检测系统动态库构建的图像将在在带有已检测系统库的环境中启动时的运行时。