问题标签 [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 回答
2780 浏览

c++ - 如何在 gcc 中抑制 AddressSanitizer 的堆栈缓冲区溢出

我的应用程序正在使用boost::program_options,它在从异常生成错误消息时触发了 AddressSanitizer“堆栈缓冲区溢出”。

我不担心 boost 错误 - 该功能有效,这只是在非生产应用程序的命令行解析部分中。但是我想禁止 AddressSanitizer 消息。

我尝试过使用 ASAN_OPTIONS 抑制文件方法,但这似乎只支持非常短的错误类型列表(例如“vptr_check”和“leak”)。

0 投票
0 回答
666 浏览

c++ - 超出地址清理程序线程限制

我正在使用 -fsanitize=address 选项分析使用 gcc 6.1 编译的程序。该程序是多线程的,每个线程都有干净的退出(使用 pthread_exit)。

Address Sanitizer 失败并显示消息:==16800==AddressSanitizer: 线程限制(4194304 线程)超出。快死了。

线程数没有意义(我无法分配那么多线程)。有没有办法可以检测 AddressSanitizer 来查看线程的创建位置和方式?

0 投票
1 回答
2639 浏览

c++ - -fsanitize 在 GCC-6.1 中不使用黄金链接器

更新(2016 年 9 月 30 日)

gcc-6.2 ((Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901) 的 Ubuntu 版本不再有这个问题。


我正在使用 gcc-6.1[1] ((Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511)、GNU binutils 2.24 和支持 GLIBCXX_3.4.22 的 libstdc++ 的 Ubuntu 版本。即使在一个简单的“hello world”程序中,指定消毒剂也不会强制使用黄金链接器。

主文件

编译和链接

给出错误

这表明该-fsanitize选项未选择黄金链接器。当然,简单的修复方法是-fuse-ld=gold在链接期间使用,但以前的 gcc 版本在使用 sanitizers 时不需要这个。例如,这段代码在 gcc-5.3 和 4.9(都是 Ubuntu 版本)下运行良好。其他人对 gcc-6.1 的非 Ubuntu 版本有这个问题吗?Ubuntu构建是否损坏?


[1] 使用以下标志构建(gcc-5.3 和 gcc-4.9 构建时只有名称和后缀不同)

0 投票
1 回答
489 浏览

c++ - 带有 g++ 5.4.0 的 asan 不能在 travis CI 上工作

直到最近,我使用地址消毒剂在 travis 上使用 g++ 5 构建的版本都在通过 - 在过去的一周里它们坏了。

我看到 g++ 的版本是从(Ubuntu 5.2.1-23ubuntu1~12.04) 5.2.1 20151031(Ubuntu 5.4.0-3ubuntu1~12.04) 5.4.0 20160603(从${CXX} --version线看)

错误来自链接器 -/usr/bin/ld: unrecognized option '--push-state'

最后一个工作版本 -这里

当前损坏的构建 -这里

知道这是否是一个已知问题吗?是否在任何地方报告?有解决方法吗?

是我在 github 上的存储库 - 它使用 CMake 并且不添加任何链接器标志。我-fsanitize=address.travis.yml配置文件中添加 - 见这里

0 投票
1 回答
528 浏览

exception - 带有 gcc-5.2 的 ASAN 不拦截异常

在过去的 2 年里,我一直在使用带有 gcc-4.8.2 的 ASAN,没有任何问题。我们迁移到 gcc-5.2 以使用 LSAN 等新功能。在使用 gcc-5.2 构建应用程序后,它不再能够拦截 __cxa_throw 导致崩溃,在以详细度 = 1 运行 ASAN 后发现了这一点

是的,我们静态链接 libstdc++,但这在 gcc-4.8.2 中不是问题,因为 ASAN 能够正确拦截所有内容。

0 投票
3 回答
91229 浏览

gcc - 如何在 GCC 中使用 AddressSanitizer?

我正在尝试构建我的项目

但得到很多错误,如:

如何使用 AddressSanitize 支持编译项目?

我的 gcc 版本是 4.8.4。

0 投票
2 回答
5022 浏览

c++ - 如何解释 AddressSanitizer 输出?

似乎检测到 AddressSanitizerheap-buffer-overflow但输出不像这里那样清晰。

如何获取发生溢出的行?

我如何解释这个结果?

0 投票
3 回答
6389 浏览

ubuntu - 为什么 ASAN_SYMBOLIZER_PATH 不再适用于版本修饰的二进制文件

在 Ubuntu 14.10 上,该llvm-symbolizer程序安装为/usr/bin/llvm-symbolizer-3.5. 通常,地址清理程序希望找到一个名为 的二进制llvm-symbolizer文件PATH。但是,作为一种解决方法,可以显式设置ASAN_SYMBOLIZER_PATH. 因此,ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.5在环境中设置将使地址清理程序检测程序打印符号化错误。

在 Ubuntu 16.04 上,该llvm-symbolizer程序再次以版本后缀安装,现在为/usr/bin/llvm-symbolizer-3.8. 但是,该ASAN_SYMBOLIZER_PATH设置似乎不再起作用。当 ASAN 检测到错误时,在环境中运行带有ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.8set 的 ASAN 检测程序会生成以下错误:

有谁知道为什么这种行为会改变,或者如何恢复旧的行为?这似乎是不合理的限制。我指向 ASAN 的符号程序绝对是一个已知的符号程序,它恰好在末尾有一个 Ubuntu 强制版本标签。

请注意,调整PATH在这里没有帮助,因为 Ubuntu 不会发布没有llvm-symbolizer版本修饰的二进制文件。

0 投票
1 回答
975 浏览

c++ - 地址清理程序不适用于 Windows 上的 bash

目前在 Windows 上的 Ubuntu Bash 上运行 llvm、clang、clang-format 和 clang-modernize。我想使用谷歌发布的一套清理工具,包括地址、内存和线程清理。fsanitize 选项似乎都不起作用。

这是 ASAN 的代码示例:

这是 Windows 上 bash 中的 clang 调用:

结果

我喜欢关于如何让它工作或者我是否缺少工具链的一部分或其他东西的建议。

如果失败了,我想我会双启动 Ubuntu 或 Debian,因为 windows 的 clang 缺少像 std:out 支持这样的简单功能,尽管理想情况下我希望能够为 Windows 目标和 Linux 目标编译。我想避免双重引导,因为 Ubuntu 无法挂载 Windows 存储空间,但它们似乎很好地服务于 Windows 上的 Ubuntu bash。

0 投票
1 回答
149 浏览

c++ - 如何在 GCC 中使用容器溢出错误检测?

EuroLLVM 2014 上,Kostya Serebryany 提出了一种向量溢出检测的方法。在幻灯片 12 上,他提供了GCC 修订版 207517的链接,您可以在其中看到branches/google/gcc-4_8/libstdc++-v3/
我想知道我可以在哪个 GCC 版本上使用容器溢出错误检测?如果它只在主干中,它在 Clang 3.9 版本中可用还是也在主干中?