0

LLVM 项目 MemorySanitizer 有一个难以满足的约束,即所有系统库也必须使用 MemorySanitizer 构建。

我一直在考虑一些方法来为我正在处理的项目(它已经使用 ASAN 和 UBSAN)启用 MSAN,特别是关于这个约束。我一直在考虑的一种可能的解决方案会导致这样一种情况,即当项目编译时-fsanitize=memory,它会链接到动态系统库的非仪器版本,例如libc,和libstdc++,并且,说libcrypto(添加一个不是真正的一部分的“工具链”)。但是在运行时,检测的二进制文件将在一个特殊的环境(基本上是不同的用户空间)中运行,其中所有系统动态库都是用-fsanitize=memory.

这样的方案可行吗?在我看来,这取决于构建一个库是否-fsanitize=memory会改变其 ABI,因为如果库 ABI 在检测版本和非检测版本之间存在差异,那么针对非检测系统动态库构建的图像将在在带有已检测系统库的环境中启动时的运行时。

4

1 回答 1

1

如果库 ABI 在插桩和非插桩版本之间存在差异,则针对非插桩系统动态库构建的映像将在运行时灾难性地失败

首先,编译-fsanitize=memory 确实会改变 ABI,例如通过向函数调用添加额外的(影子)操作数。这意味着在运行时组合已清理和未清理的代码可能会崩溃。

另一方面,Msan 不会更改链接时库 ABI,即它不会更改符号大小或名称,因此编译的库的外部接口(即它的 ELF 符号表的内容)-fsanitize=memory不会更改。

这意味着链接到未清理的版本并稍后使用已清理的版本运行是可以的。

于 2019-11-23T06:21:10.043 回答