问题标签 [address-sanitizer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2154 浏览

gcc - 将功能列入黑名单的 gcc (4.8.3) 消毒剂选项

我正在 gcc 4.8.3 上编译我的代码。我已启用-fsanitize=address选项。但是我的程序在启动过程中退出,在 3rd 方库代码中抛出全局缓冲区溢出错误。所以我试图跳过这个函数(或调用者函数)的消毒剂。我试过__attribute__((no_sanitize("address")))了,但编译器会抛出警告,‘no_sanitize’ attribute directive ignored 即使尝试过-fsanitize-recover=address,但地址上似乎不支持恢复。任何人都可以帮助我如何让我的程序在第一个错误后继续运行,或者黑名单功能跳过清理?

编辑

0 投票
0 回答
2722 浏览

android - 为 NDK 库使用 AddressSanitizer

我有一个包含 Java 部分和 NDK 库部分的 Android 应用程序。我想测试 NDK 部分,所以我使用 AddressSanitizer 按照此处的说明进行编译: https ://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid

现在,我想在手机上运行该应用程序。根据上面的指令,我还需要运行ndk库提供的asan_device_setup脚本。但是当我运行脚本时,我得到了

我尝试直接运行该应用程序,但最终出现以下错误,因此我认为需要设备设置步骤...

非常感谢您对解决此问题的任何帮助。谢谢!

0 投票
1 回答
330 浏览

c++ - std::vector 的手动中毒

在下面的代码片段中,有一个并非微不足道的错误,但我希望像 AddressSanitizer 这样的工具能够捕获它。

当对向量进行范围限定并在范围之外打印时,catch 引用会抛出错误 use-heap-after-free。

但是当没有范围时,std::vector实现可能不会在 pop_back 之后释放内存,因此引用仍然指向有效内存。

我四处搜索,发现您可以手动毒化内存,我想知道这是否已在 STL 中实现(https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning

0 投票
1 回答
552 浏览

address-sanitizer - 地址消毒剂的假阴性?

考虑下面的代码。当我使用地址清理程序编译和运行它时,没有显示错误。但是应该有一个错误,即分配/访问超出范围的内存位置?为什么地址消毒剂没有检测到它?

谢谢!

0 投票
0 回答
2003 浏览

c++ - Address Sanitizer 的两个问题

在一个爱好项目中,我使用地址清理程序 (-fsanitize=address) 和 g++-6 (Homebrew GCC 6.3.0_1) 6.3.0。

我收到一个我不明白的错误,即:

==94266==AddressSanitizer CHECK failed: ../../../../libsanitizer/asan/asan_globals.cc:146 "((AddrIsAlignedByGranularity(g->size_with_redzone))) != (0)" (0x0, 0x0) #0 0x10b60cd3d in __asan::AsanCheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) (libasan.3.dylib+0x5dd3d) #1 0x10b612be3 in __sanitizer::CheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) (libasan.3.dylib+0x63be3)

玩了一段时间后,我注意到我在两个不同的类中使用正则表达式,如果我删除其中一个,问题就会消失。我想了解为什么以及我能做些什么。

因此,我的下一个尝试是构建问题的最小示例,我想出了以下内容:

如果我使用“g++-6 -fsanitize=address a.cpp m.cpp”编译然后运行“./a.out”,程序将永远挂起,而“g++-6 a.cpp m.cpp”后跟“ ./a.out" 按预期工作。

这不是我想在这里演示的内容(因为我没有收到 AddressSanitizer CHECK failed 错误),但问题可能相关吗?

我也确实看到了其中一些,只是为了完整: ld: warning: direct access in function '__GLOBAL__sub_D_00099_0_a.cpp' from file '/var/folders/lq/t18hc5bn0c5bxf7h7nn609f40000gp/T//ccTC4rgj.o' to global weak symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::__cxx11::regex_traits<char>::lookup_collatename<char const*>(char const*, char const*) const::__collatenames' from file '/var/folders/lq/t18hc5bn0c5bxf7h7nn609f40000gp/T//ccTC4rgj.o' means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings.

编辑:忘了提到我也注意到的一个细节。如果我注释掉 m.cpp 中的正则表达式 var 're',问题也会完全消失。

谢谢你的帮助!

0 投票
1 回答
739 浏览

xcode - Xcode Address Sanitizer 与 ccache

我正在尝试在 Xcode 中使用 Address Sanitizer,但我也在使用 ccache 来加速我的构建。为此,我CC在 Xcode 项目级别设置了标志,以指向我存储在~/projects/support/cmake/ccache-clang. 脚本读取

这样就达到了预期的效果(如果安装在开发人员的系统上,则使用ccache)。这运作良好。

现在,当我们为给定方案打开 Address Sanitizer 时,问题就来了。构建成功完成,但是当我们尝试运行时,我们终于看到了这个错误:

也许这是由于 Xcode 中的一些 hacky 实现,它试图解析编译器的路径以确定版本?

想知道如何修改我的脚本以允许 Address Sanitizer 工作。当前的解决方法是CC在我们需要进行消毒工作时删除覆盖的标志。

使用 Xcode 8.3.1

0 投票
2 回答
18115 浏览

gdb - 原因:AddressSanitizer:SEGV 位于未知地址(空指针)

我需要一些建议如何识别段错误的来源。

用 ASAN 编译:

从 gdb 开始:

1. 编辑:

上面的输出是针对 64 位 (x86_64) 编译的,在 32 位上会生成以下输出:

2.编辑:

不确定这意味着什么/为什么会导致段错误?

0 投票
3 回答
780 浏览

c - Clang 的 ASan 未检测到悬空指针的使用

在工具比较的上下文中,如果 ASan 可以检测到以下程序中的问题,我不想对它不公平:

第二次的G第一次出现f被称为调用未定义的行为,因为G在那一点上是不确定的。此外,G立即取消引用,这使得 ASan 可能会检测到这种内存错误。这是 ASan 规范的一部分,它有时无法检测到它应该找到的那种问题,但我想知道我是否可以使用它在这里找到这个特定问题。

我在-fsanitize-address-use-after-scope 这里找到了这个选项,但是这个选项在我使用的 Clang 版本中不起作用:

是否有 ASan 版本在执行上述程序时标记错误,有或没有特殊的命令行选项?

0 投票
0 回答
79 浏览

crash - 为什么非asan bulid不会崩溃?

我目睹了 Asan 编译环境的崩溃。

但是,在正常的编译环境中,并没有崩溃。

有什么区别?

这安全吗?

谢谢。

0 投票
7 回答
46634 浏览

c++ - 在 Xcode 中工作的 CMake 中启用 AddressSanitizer 的正确方法是什么

我添加了 AddressSanitizer 标志如下:

使用Unix Makefiles.

问题出现在生成 Xcode 项目时,它只是不想链接,因为它找不到 ASan 库。

我已经找到了两个解决方案,但决定不使用它们,因为它们不能仅使用 CMake 实现自动化:

  1. 添加-Wl,-undefined,dynamic_lookup到链接标志,因此它跳过链接到动态库。
  2. 直接链接libclang_rt.asan_osx_dynamic.dylib

那么这两种解决方案有什么问题呢?

  • 使用解决方案 #1 时,我必须在 Xcode 中手动打开目标方案并添加DYLD_INSERT_LIBRARIES指向libclang_rt.asan_osx_dynamic.dylib.
  • 使用解决方案 #2 时,ASan 库的路径因计算机而异。

此外,作为另一种解决方案,我尝试从 Xcode 目标方案中启用 Address Sanitizer 标志,但有趣的是它没有检测到我添加的问题,因此我没有将其列为解决方案,因为它未能通过我的测试。

任何帮助都感激不尽。