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中出现内存访问问题?
答案 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不会将新添加元素的内存标记为有效。从检测代码中访问元素,触发误报。)"
我希望这个问题可以帮助别人,因为这个问题耗费了我相当多的时间。阿桑很棒,但这个信息很难找到。