Xcode 7 允许使用地址清理器来查找 C/C++ 中的内存问题。
https://github.com/google/sanitizers/wiki/AddressSanitizer https://github.com/google/sanitizers/wiki/AddressSanitizer
打开地址清理程序会传递编译和链接器标志-fsanitize=address
并且还定义了_LIBCPP_HAS_NO_ASAN
.
从命令行构建我的库并在未定义的情况下在经过清理的构建上运行测试时_LIBCPP_HAS_NO_ASAN
我看到不可重复的地址清理程序报告的内存访问问题。定义_LIBCPP_HAS_NO_ASAN
与 Xcode 一样,摆脱了消毒剂问题,但我很好奇为什么需要这样做。
为什么我需要定义_LIBCPP_HAS_NO_ASAN
使用 AppleClang7 来避免 libcxx 中出现内存访问问题?
根据与 Sean McBride(不在 StackOverflow 上)的讨论,混合检测和非检测代码时存在虚假内存越界错误的已知问题:
从安娜·扎克斯开始http://lists.apple.com/archives/xcode-users/2016/Jan/msg00077.html http://lists.apple.com/archives/xcode-users/2016/Jan/msg00077.html:
“一般来说,不需要重建链接到净化代码中的任何代码。”
“但是,C++ 容器溢出检查中存在一个极端情况,这种情况可能并不总是成立。具体来说,如果 libc++ 容器从已检测(使用 ASan 重建)到未检测代码,Address Sanitizer 可能会报告容器溢出误报。(想象一下两个库,都使用相同的 std::vector,只有其中一个被检测。来自非检测模块的 Push_back 不会将新添加元素的内存标记为有效。从检测代码访问该元素,将触发误报报告。)”
我希望这个问题对其他人有帮助,因为这个问题已经消耗了我大量的时间。阿桑很棒,但这个信息很难找到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)