0

我正在使用 Clang & MemorySanitizer 并且由于内联汇编而得到了一些误报。内联汇编代码初始化一些随后使用的内存,但 MemorySanitizer 将其视为未初始化值的使用。

我正在尝试编写一个小的 GDB 脚本来过滤误报。我在 __msan_warning_noreturn 上放置了一个断点,它是在 MemorySanitizer 中打印错误和保释的函数。但是,我找不到一种简单的方法来检索触发错误的地址。

如何找到触发错误的地址?

我正在研究 X64 架构、linux、clang-3.8

谢谢你。

4

1 回答 1

0

内联汇编代码初始化一些随后使用的内存,但 MemorySanitizer 将其视为未初始化值的使用。

Memory Sanitizer 通过检测 C 和 C++ 源代码来工作。它不能(也不会)检测内联汇编,所以这个初始化对它是不可见的。

我正在尝试编写一个小的 GDB 脚本来过滤误报。

这很可能是错误的方法。

相反,您应该使用 Memory Sanitizer blacklist,或者更好的是,调用__msan_unpoison告诉它某个特定的内存位置已被初始化。

于 2016-12-11T18:41:45.350 回答