问题标签 [ubsan]

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

c - 如何在 gcc 上使用 ubsan (windows 8.1)

为了更好地防止 UB 案例,例如:

我今天更新了我的 GCC,所以我可以使用ubsan。我当前的版本是 5.3.0 根据gcc --version. 我以为ubsan会被这个更新添加,但似乎不是因为用C:\Users\my_name\Desktop>gcc -fsanitize=undefined a.c这个编译后得到的是:

c:/mingw/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32/bin/ld.exe: 找不到-lubsan

现在,我已经看过这篇文章,但是操作系统是Ubuntu 15.04并且我使用的是Win 8.1所以这对我没有帮助。这里的评论之一说:

您将需要安装 libubsan 软件包。

但我不知道它是否适用于windows/ubuntu,即使它适用于windows用户,我也不知道该怎么做。

编辑:我也尝试过编译(这里gcc -fno-sanitize=all a.c有很多选项)并且编译时没有警告,所以我猜想以某种方式识别消毒剂(因为它编译好)但由于某种原因拒绝了我的原始编译尝试GCC

0 投票
1 回答
569 浏览

c++ - 如何使用 MATRIX_EVAL 启用基于编译器的构建矩阵行?

我们的 Travis构建矩阵包含一行使用 Undefined Behavior sanitizer 构建的行:

对于 UBsan,GCC 需要 4.9(或者可能是 5.0),这导致我们在 Trusty 上的测试失败:

Travis 有一个MATRIX_EVAL看起来像某种选择器的东西。我认为它可以用来启用或禁用构建矩阵中的一行,但我不清楚如何使用它。该文档位于添加用于升级 gcc 和 clang的文档,但没有很好地解释。另请参阅Travis 文档中的构建 C 项目

当 GCC 为 4.9 或更高版本时,我们如何使用MATRIX_EVAL启用 UBsan 行?或者,如果MATRIX_EVAL是错误的工具,那么当 GCC 为 4.9 或更高版本时,我们如何告诉 Travis 启用构建?

0 投票
0 回答
229 浏览

c++ - Clang 对共享对象上导出的虚拟类的 UBsan 警告

我正在尝试在我大量使用 dlopen/dlsym 的应用程序上应用 clang 的 UBSan。但是,当我申请 UBSan 时,出现了一些我无法完全理解的警告。

带有一个标头/两个文件的示例代码。

Foo.h

Foo.cpp

测试.cpp

构建和运行

第一个和第三个错误很明显:我使用了 reinterpret_cast 并且 UBSan 无法理解这样的指针来自哪里。但是,我无法理解为什么在处理 vptr 时没有应用Foo和的继承关系。FooImpl这可能是一个真正的问题还是 UBSan 的错误(或限制?)

0 投票
1 回答
520 浏览

android - Android nkd r15c 和 UBSAN clang

我正在尝试使用 ndk r15c 和 clang 构建一个简单的 Android 二进制文件来测试 UBSAN(未定义的行为清理程序)。但是,当尝试链接以下错误时,构建失败:

我的 Android.mk 文件如下:

我的 Application.mk 如下:

我猜我错过了一些链接器标志或其他一些设置,但无法弄清楚发生了什么。查看 ubsan 运行时中的符号,这些符号似乎存在。

注意:我也尝试在我的 Android.mk 中使用 LOCAL_SANITIZE := undefined 而不是 -fsanitize=undefined ,结果相同。

0 投票
1 回答
305 浏览

c++ - 如何正确地将 uint32_t 转换为无符号

我正在尝试使用地址清理程序修复一些 C++ 代码。代码说:

消毒剂给出:

我需要如何解决这个问题?

0 投票
2 回答
5231 浏览

c - 加载未对齐的地址和 UBsan 发现

这个问题不是关于未对齐数据访问的定义,而是为什么memcpy尽管生成了相同的汇编代码,但类型转换却没有。

我有一些示例代码来解析一个协议,该协议发送一个字节数组,分割成六个字节的组。

在将指针增加 6 并进行另一次 32 位读取后,UBSan 报告有关未对齐负载的错误。我使用而不是类型双关来抑制此错误memcpy,但我不太了解原因。需要明确的是,这是没有 UBSan 错误的相同例程,

两个例程都编译为相同的汇编代码(movl用于 32 位读取和movzwl16 位读取),那么为什么一个未定义的行为是另一个未定义的行为呢?是否memcpy有一些特殊的属性可以保证某些东西?

我不想在memcpy这里使用,因为我不能依赖编译器在优化它方面做得足够好。

0 投票
2 回答
354 浏览

c++ - Clang 5.0 和 UBsan 的指针加法和整数溢出?

我试图理解我们最近在使用 Clang 5.0 和 Undefined Behavior Sanitizer (UBsan) 时清除的问题。我们有代码可以向前或向后处理缓冲区。简化的情况类似于下面显示的代码

0-len可能看起来有点不寻常,但早期的 Microsoft .Net 编译器需要它。Clang 5.0 和 UBsan产生整数溢出结果

第 1138、1140、1142 行(和朋友)是增量,由于0-len.

根据C 中的指针比较。它们是有符号的还是无符号的?(其中还讨论了 C++),指针既不是有符号的也不是无符号的。我们的偏移量是无符号的,我们依靠无符号整数换行来实现反向跨步。

该代码在 GCC UBsan 和 Clang 4 以及更早的 UBsan 下运行良好。在 LLVM 开发人员的帮助下,我们最终为 Clang 5.0 清除了它。而不是size_t我们需要使用ptrdiff_t.

我的问题是,构造中的整数溢出/未定义行为在哪里?如何ptr + <unsigned>导致有符号整数溢出并导致未定义的行为?


这是一个反映真实代码的 MSVC。

0 投票
1 回答
1303 浏览

c - 铿锵声:-fsanitize=undefined 有 128 个整数运算(未定义对 `__muloti4' 的引用)

在clang中,如果程序使用128位整数时未定义的行为清理器( ) ,我会遇到链接错误。-fsanitize=undefined链接错误抱怨__muloti4

(在带有 clang 4.0.1 的 Ubuntu 17.10 上测试。)

使用 gcc,它可以开箱即用 ( gcc -fsanitize=undefined example.c)。

与 clang 一起使用的是以下调用,但我既不完全理解它(--rtlib=compiler-rt),也不像我这样:

我通过反复试验找到了它,但是使用 clang 和链接一些 gcc 库感觉不对。还明确链接到ubsan根据文档,也不需要。

这是摆脱错误的正确方法,还是有更强大的解决方案?

0 投票
1 回答
2859 浏览

c - 对“__ubsan_handle_nonnull_arg”的未定义引用

最近几天我一直在研究问题集拼写器,到目前为止,这就是我所拥有的。不幸的是,它没有编译,我有点迷茫。如果有人可以帮助我并告诉我,我做错了什么,我将非常感激。

在所有函数中,我得到了一些未定义的引用和无效符号索引,它们不允许代码编译:

0 投票
2 回答
1345 浏览

c++ - C++ clang UBsan 抑制标志名称

使用 clang 的 ubsan 从 boost 版本 1.64运行gzip.hpp代码会给出以下消息:

我想用抑制文件来抑制它。对于其他警告,这已经奏效:

在这种情况下,我希望这应该有效

但它在运行时给出

这个消毒剂标志的正确名称是什么?

另请参阅:https ://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#runtime-suppressions

并来自https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#available-checks

-fsanitize=implicit-integer-sign-change:整数类型之间的隐式转换,如果这改变了值的符号。也就是说,如果原值为负,新值为正(或零),或者原值为正,新值为负。此消毒剂捕获的问题不是未定义的行为,而是通常是无意的。