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

c++ - Gcc thread sanitizer false positive only for debug info flag

我在使用 Gcc 的线程清理程序时遇到问题,我无法在他们的 bugzilla 或 stackoverflow 上找到该问题,所以我不确定我是否遗漏了某些内容,或者这是否真的是一个错误。如果我创建一个包含以下内容的 main.cpp 文件:

现在,如果我使用以下方法编译它:

运行生成的可执行文件不会产生任何问题。但是,如果我添加调试信息标志:

然后线程清理程序检测到数据竞争:

现在用 clang++(版本 3.6.0(主干 221144))编译的完全相同的代码没有检测到数据竞争:

我对 gcc 的这种行为有点好奇,因为:1) 将一个空的 lambda 函数作为参数传递给线程对我来说似乎是合法的 2) gcc 的行为取决于 -g 标志,这并没有让我觉得有很多事情要做使用 thread sanitizer 3)在类似情况下 clang 采取了我认为正确的行为

非常感谢,

0 投票
2 回答
3021 浏览

c++ - 地址消毒剂故障

我正在使用 gcc 和嵌入 clang 的消毒剂,包括地址消毒剂。事情运行得很好,但是在下一个演示代码中,尽管存在错误,但我没有得到与错误相关的输出(更准确地说 - 根本没有输出):

我试过g++ -O0 -g -fsanitize=address test.cc了,同样的clang++:g++-version 什么都不打印,clang 一个打印垃圾很长一段时间。Valgrind 在非仪器二进制上给出反馈: Syscall param write(buf) points to unaddressable byte(s).

是内部问题还是我做错了什么?

版本:gcc 4.9.2、clang 3.6.0

0 投票
1 回答
903 浏览

c++ - 正如 Clang 似乎表明的那样,这段代码真的是未定义的吗?

我打开了-fsanitize=undefined使用单元测试库 Catch 的项目。来自 Catch 的一行被此标志指示为导致未定义的行为。我设法做了一个孤立的例子:

编译:

如果我运行它,将给出以下打印:

这发生在我和 clang3.6.0的朋友身上3.4-1ubuntu3。我在 gcc 版本上不会发生这种情况4.9.2

那么这里是什么?这段代码真的很糟糕,还是在 clang 的结尾有什么可疑的地方?

0 投票
1 回答
1311 浏览

c++ - 在 OpenCV 中使用地址清理程序

我正在尝试将 Google 的Address Sanitizer与 CUDA 项目一起使用,更准确地说是与 OpenCV cuda 功能一起使用。但是,我在第一次 cuda 调用时遇到了“内存不足”错误。

它可以用

编译

我用 gcc 得到了同样的结果。我也尝试过将 cuda 函数列入黑名单,但没有结果。

现在使用没有opencv的cuda:

清理程序在内存泄漏时停止:

我的问题是如何使用地址清理程序来清理我的软件而不会陷入困境?我怎样才能至少正确地将所有与 cuda 相关的调用列入黑名单?

我在著名的网络搜索引擎上没有找到任何相关内容。就像人们不使用 cuda 或 asan 或两者兼而有之。伙计们只是有一个完全禁用 cuda 的构建吗?

我猜 asan 在 cuda 内存管理方面遇到了困难,但我正在寻找一种方法,至少在我的代码库的其余部分使用这个工具。

0 投票
3 回答
12500 浏览

c - 如何打破 gdb 中的 UBSan 报告并继续?

最新版本的 GCC 和 Clang 具有 Undefined Behavior Sanitizer (UBSan),它是一个-fsanitize=undefined添加运行时检测代码的编译标志 ( )。出现错误时,会显示如下警告:

packet-ber.c:1917:23: 运行时错误: 54645397829836991 的左移 8 位不能用“long int”类型表示

现在我想对此进行调试并在所述行上获得调试中断。对于 Address Sanitizer (ASAN),ASAN_OPTIONS=abort_on_error=1它会导致可捕获的致命错误。唯一似乎可用的 UBSan 选项是UBSAN_OPTIONS=print_stacktrace=1导致报告的呼叫跟踪转储。但是,这不允许我检查局部变量然后继续程序。-fsanitize-undefined-trap-on-error因此无法使用。

我应该如何在 UBSan 报告中闯入 gdb?虽然break __sanitizer::SharedPrintfCode似乎有效,但这个名字看起来很内部。

0 投票
1 回答
1728 浏览

c - 我如何知道是否在编译时启用了 Leak Sanitizer?

GCC 和 Clang 编译器都支持LeakSanitizer,这有助于发现 C 程序中的内存泄漏。有时内存泄漏是不可避免的(例如,因为它正在测试套件中进行测试)。

这样的内存可以使用Leak Sanitizer 接口进行注释:

然而,这将在不支持 LSan 的编译器上中断。在 Address Sanitizer 中,此构造可用于检测 ASAN 的可用性:

在 Clang中没有__has_feature(leak_sanitizer)检测到 LSan 的__SANITIZE_LEAKS__存在,对于 GCC 也不存在。无论如何,我如何检测 ASAN 可用性?请注意,LSan 可以独立于 AddressSanitizer 和 ThreadSanitizer 启用。

0 投票
1 回答
249 浏览

linux - clang memory sanitizer (linux) 不报告错误

我正在尝试在带有玩具程序的 linux 平台上产生 clang 内存清理程序错误。对于我认为正确的平台/编译/执行,我无法产生任何错误。

平台的简单描述:

  • docker容器中的debian 8
  • 标准铿锵包(3.5)
  • 使用这些指令编译的自定义 (msan) libc++ / libc++abi

问题是一个简单的测试程序不会报告错误。这是测试程序:

其中,未初始化的内存被读取。它是这样编译的:

该程序正在使用使用平台描述中链接的指令编译的 libc++ / libc++abi 库。

这是程序的输出:

我可以使用不正确的平台配置产生 clang memory sanitizer 误报错误,我理解这是预期的行为。当程序与未检测的 libc++ / libc++abi 链接时,会产生预期的误报。

0 投票
1 回答
86 浏览

c++ - g++ 4.9 sanitizer bug with cin parsing boolean on linux (ubuntu 12.04 64-bit)

这对我来说看起来像是一个 g++ 错误(可能与消毒剂有关),但我想知道是否有人使用 clang(鉴于 gcc 消毒剂来自 clang afaik)或不同的 g++ 版本,会有不同的结果?

这是一个简单的程序,它从用户的标准输入中读取 3 个值,尝试解析它们,然后打印它们(我还显示了 cin 标志的状态,以防有人想要它们)

以下是我的 shell 在没有消毒剂的情况下编译并使用用户提供的“true false 1”值运行时显示的内容:

我发现它没有打印“真,真,真”有点令人惊讶(我认为只有 '0' 会被解析为假,其他任何东西都是真的),但这不是重点。这是有趣的一点:添加消毒剂标志但提供相同的输入会显示不同的结果:

最终细节(如果你想要更多,请点击 lmk)

0 投票
1 回答
466 浏览

build - 使用地址清理程序 (asan) 构建 mplayer

我正在尝试使用带有地址清理标志的 clang 构建 mplayer。但是,当我执行 make 时,我不断收到错误。这是完整的输出日志,包括我使用的命令。任何帮助都感激不尽。

0 投票
3 回答
2121 浏览

c++ - 记忆消毒剂

我在 Ubuntu 14.04 上使用带有 Clang 3.7.0 的 Memory Sanitizer。以下代码可以完美运行:

编译时

我期待一个错误。Memory Sanitizer 没有发现 ans 未初始化的事实吗?

谢谢你的帮助。