问题标签 [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 投票
0 回答
1060 浏览

fortran - 这个“可能未初始化”的警告是假的吗?

当我编译这个愚蠢的 fortran 例程时:

使用gfortran -fsanitize=address -O2 -Wall -c a.f90(gcc 版本 4.8.4)我收到此警告:

而且我看不出怎么x可能未初始化(仅当N < 1,但它也从未使用过)。-fsanitize=address警告在没有或的情况下消失-O2。这些选项中的任何一个是否以某种“不安全”的方式更改了我的代码(例如发出警告)?更新的 gfortran 版本是否给出相同的信息?

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 回答
220 浏览

c++ - 使用 Clang 的 UB sanitizer 构建的程序的附加输出

在我使用clang version 3.4 (tags/RELEASE_34/final)的已安装的 travis CI 上,我使用以下代码构建我的代码:

(这个命令是compile_commands.json从cmake生成的)

并在程序退出后的输出中出现一些数字(如内存的十六进制表示):

我的猜测是这是来自 UB sanitizer,因为当我使用 ASAN 构建或根本没有 sanitizer 时,所有这些数字都不存在。

那么它们是什么意思呢?如何诊断我的 UB 错误(如果确实如此)?

我认为当消毒剂遇到错误时,它会使程序崩溃并打印一条带有解释的大消息。那么这是什么?

这对我来说是一个交易破坏者,因为我将文本文件中的参考输出与当前构建的程序输出进行比较,这样的额外输出会破坏一切。

我尝试在本地使用 Clang 3.6,这是我的 Ubuntu 使用相同构建命令的默认设置,但是当我运行可执行文件时,我没有收到任何错误或此类额外输出。

是 travis 的失败构建 - 我认为我的代码不相关,因为我的问题是消毒剂输出根本没有帮助。

0 投票
0 回答
593 浏览

c++ - -fsanitize=bounds-strict 是否包含在 GCC 6 的 -fsanitize=undefined 中?

我正在为使用 GCC 6 编译的 C++ 库编写问题报告。我正在阅读GCC 6 Changes, New Features, and Fixes,其中一个注释是:

  • UndefinedBehaviorSanitizer 获得了一个新的清理选项 -fsanitize=bounds-strict,它可以严格检查数组边界。特别是,它启用了 -fsanitize=bounds 以及灵活的类似数组成员的数组的检测。

是否包含严格的边界检查-fsanitize=undefined?还是我们都需要-fsanitize=undefinedand -fsanitize=bounds-strict

0 投票
1 回答
7315 浏览

debugging - 找不到 -lasan 和 libasan_preinit.o

当我使用-fsanitize=address将某个对象链接到二进制文件时,g++ 说标题中的两个库不存在。

我的 g++ 版本是:

如果我使用 g++,是否需要手动编译 libasan?

0 投票
1 回答
4798 浏览

c++ - 如何在 QMake 中启用消毒剂?

如何在 QMake 的.pro文件中启用消毒剂的使用?

我发现了几个可以QMAKE_CXXFLAGS自行修改的资源,但介绍性博文说:

它计划用于开发分支(Qt 5.2),因为它是一个新功能,但您应该可以将其挑选到例如 Qt 5.0 中。然后,您可以使用 -address-sanitizer 配置 Qt,并为您自己的应用程序运行 qmake CONFIG+=address_sanitizer。

但是,添加CONFIG+=address_sanitizer似乎没有效果。

0 投票
1 回答
184 浏览

c++ - 在移动的 lambda 中捕获和调试对局部变量的引用的无效使用

在我的一个真实项目中,我遇到了一个难以调试的情况,我不小心访问了对已移动的 lambda 中的局部变量的引用。访问是从另一个线程完成的,但移动的 lambda 一直保持活动状态,直到第二个线程完成。

该错误仅在禁用优化的情况下发生,并且是由粗心的重构引起的。

我创建了一个重现该问题的最小示例可在 wandbox 上找到


令人惊讶的是,没有一个消毒剂和警告标志在这里起到帮助作用。

我尝试了以下编译器和消毒剂的组合,

始终启用标志:

  • 编译器:Arch Linux x64 上的g++ 6.1.1 ;Arch Linux x64 上的clang++ 3.8.0 ;Fedora x64 上的g++ 5.3.1 ;Fedora x64 上的clang++ 3.7.0

  • 消毒剂-fsanitize=address; -fsanitize=undefined, -fsanitize=thread.

没有一种组合产生任何有用的诊断。我希望AddressSanitizer告诉我我正在访问一个悬空引用,或者UndefinedSanitizer在访问它时捕获 UB,或者ThreadSanitizer告诉我一个单独的线程正在访问一个无效的内存位置。

有没有可靠的方法来诊断这个问题?我应该将此示例作为功能请求/缺陷发布到任何消毒剂的错误跟踪器吗?

0 投票
0 回答
177 浏览

clang++ - Clangs SanitizerCoverage 与共享库

我在将sancovclang 工具与共享库一起使用时遇到了麻烦。
虽然它像记录的简单二进制文件一样工作,但我无法让它与共享库一起使用。

每当我从我的程序中使用共享库时,我都会得到一个*.sancov文件,但是当我尝试从中获取报告时,sancov我会收到以下错误消息:

忽略 libMyLib.so 及其覆盖范围,因为找不到 __sanitizer_cov* 函数。

似乎问题源于我的共享库中未解决消毒剂功能的事实。但我不确定。

nm libMyLib.so | grep saniti
U __sanitizer_cov
U __sanitizer_cov_module_init
U __sanitizer_cov_with_check

有人可以给我提示我做错了什么吗?

0 投票
3 回答
5880 浏览

gcc - 如何设置 ASAN/UBSAN 报告输出

我想运行我的单元测试套件-fsanitize=address,undefined并将所有消毒剂错误写入report.txt文件。默认情况下,所有 sanitizer 错误都会写入标准输出,但是软件也会将信息写入标准输出,因此很难检测到错误。我试过了:

我还尝试在运行测试之前调用 C API:

然而,似乎两者都不起作用,所有错误都被写入标准输出。我正在使用 Debian 测试:

是否有任何替代方法可以将我的单元测试中的消毒剂错误保存在某处?

0 投票
1 回答
817 浏览

c - 如何检查 malloc() 是否过度使用内存

在我的 C 程序中,根据用户的输入,将为给定的模拟分配内存。我面临的最初问题是用户可以要求分配大量数字,但 malloc() 永远不会失败,直到内存不足然后程序崩溃。

我调查了这背后的逻辑,现在它对我来说很有意义,请参阅 [ 1 ][ 2 ]。此处给出的一种可能的解决方法“ SIGKILL while allocating memory in C++ ”建议设置overcommit_memory/proc/sys/vm/overcommit_memory从 0 到 2。

这从一方面解决了问题。但由于我正在使用,-fsanitize=address我从消毒剂中得到错误。

有没有更好的解决方案?