为什么Xcode在创建地址清理构建时定义_LIBCPP_HAS_NO_ASAN?

时间:2016-08-02 14:33:13

标签: c++ address-sanitizer

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摆脱了消毒剂的问题,但我很好奇它为什么需要这样做。

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

1 个答案:

答案 0 :(得分:2)

通过与Sean McBride(不在StackOverflow上)的讨论,在混合已检测和非检测代码时,存在已知的虚假内存超出范围错误:

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

"通常,人们不需要重建任何链接到已清理代码的代码。"

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

我希望这个问题可以帮助别人,因为这个问题耗费了我相当多的时间。阿桑很棒,但这个信息很难找到。