Xcode 7允许使用地址消毒器来查找C/C++中的内存问题。
https://github.com/google/sanitizers/wiki/AddressSanitizer
打开address sanitizer会传递编译和链接器标志-fsanitize=address,还会定义_LIBCPP_HAS_NO_ASAN。
当从命令行构建我的库并在未定义_LIBCPP_HAS_NO_ASAN的已清理构建上运行测试时,我看到不可重复的address-sanitizer报告的内存访问问题。像Xcode一样定义_LIBCPP_HAS_NO_ASAN可以消除杀菌器问题,但我很好奇为什么需要这样做。
为什么我需要用AppleClang7来定义_LIBCPP_HAS_NO_ASAN,以避免在libcxx中出现内存访问问题?
发布于 2016-08-10 03:26:25
通过与Sean McBride (他不在StackOverflow上)的讨论,当混合插入指令和未插入指令的代码时,存在虚假内存越界错误的已知问题:
来自http://lists.apple.com/archives/xcode-users/2016/Jan/msg00077.html上的安娜·扎克斯
通常,不需要重新构建链接到已清理代码的任何代码。
“但是,在C++容器溢出检查中有一种情况,这种情况可能并不总是成立。具体地说,如果libc++容器从已检测的(使用ASan重新生成)交叉到未检测的代码,地址清理程序可能会报告容器溢出误报。(假设两个库都使用相同的std::vector,则只有一个库被检测。来自未检测的模块的Push_back不会将新添加的元素的内存标记为有效。从检测的代码访问该元素将触发误报报告。)”
我希望这个问题能对其他人有所帮助,因为这个问题占用了我相当多的时间。Asan很棒,但是这个信息很难找到。
https://stackoverflow.com/questions/38723374
复制相似问题