4

Xcode 7 允许使用地址清理程序来查找 C/C++ 中的内存问题。

https://github.com/google/sanitizers/wiki/AddressSanitizer

打开地址清理程序会传递编译和链接器标志-fsanitize=address,并定义_LIBCPP_HAS_NO_ASAN.

从命令行构建我的库并在未定义的情况下在经过清理的构建上运行测试时,_LIBCPP_HAS_NO_ASAN我看到了不可重复的地址清理器报告的内存访问问题。正如 Xcode 所做的那样,定义_LIBCPP_HAS_NO_ASAN消除了消毒剂问题,但我很好奇它为什么需要这样做。

为什么我需要_LIBCPP_HAS_NO_ASAN用 AppleClang7 定义以避免在 libcxx 中出现内存访问问题?

4

1 回答 1

3

根据与 Sean McBride(不在 StackOverflow 上)的讨论,在混合插桩代码和非插桩代码时存在虚假内存越界错误的已知问题:

来自http://lists.apple.com/archives/xcode-users/2016/Jan/msg00077.html上的 Anna Zaks :

“一般来说,不需要重建任何链接到净化代码的代码。”

“但是,在 C++ 容器溢出检查中存在一个极端情况,这可能并不总是成立。具体来说,如果 libc++ 容器从检测(使用 ASan 重建)代码交叉到非检测代码,Address Sanitizer 可能会报告容器溢出误报。(想象两个库,都使用相同的 std::vector,只有一个被检测。来自非检测模块的 Push_back 不会将新添加元素的内存标记为有效。从检测代码访问元素会触发误报。)”

我希望这个问题对其他人有帮助,因为这个问题占用了我大量的时间。Asan很棒,但很难找到这个信息。

于 2016-08-09T19:26:24.963 回答