gpt4 book ai didi

c++ - 为什么 Xcode 在创建经过地址清理的构建时定义 _LIBCPP_HAS_NO_ASAN?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:10 25 4
gpt4 key购买 nike

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 可以解决 sanitizer 问题,但我很好奇为什么需要这样做。

为什么我需要使用 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 不会将新添加的元素的内存标记为有效。从检测代码访问元素,会触发误报。)”

我希望这个问题对其他人有所帮助,因为这个问题已经占用了我相当多的时间。 Asan 很棒,但很难找到此信息。

关于c++ - 为什么 Xcode 在创建经过地址清理的构建时定义 _LIBCPP_HAS_NO_ASAN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38723374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com