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

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中出现内存访问问题?

最佳答案 通过与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不会将新添加元素的内存标记为有效.从检测代码中访问元素会触发误报.)“

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

点赞