问题标签 [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.
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
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 启用构建?
c++ - Clang 对共享对象上导出的虚拟类的 UBsan 警告
我正在尝试在我大量使用 dlopen/dlsym 的应用程序上应用 clang 的 UBSan。但是,当我申请 UBSan 时,出现了一些我无法完全理解的警告。
带有一个标头/两个文件的示例代码。
Foo.h
Foo.cpp
测试.cpp
构建和运行
第一个和第三个错误很明显:我使用了 reinterpret_cast 并且 UBSan 无法理解这样的指针来自哪里。但是,我无法理解为什么在处理 vptr 时没有应用Foo
和的继承关系。FooImpl
这可能是一个真正的问题还是 UBSan 的错误(或限制?)
android - Android nkd r15c 和 UBSAN clang
我正在尝试使用 ndk r15c 和 clang 构建一个简单的 Android 二进制文件来测试 UBSAN(未定义的行为清理程序)。但是,当尝试链接以下错误时,构建失败:
我的 Android.mk 文件如下:
我的 Application.mk 如下:
我猜我错过了一些链接器标志或其他一些设置,但无法弄清楚发生了什么。查看 ubsan 运行时中的符号,这些符号似乎存在。
注意:我也尝试在我的 Android.mk 中使用 LOCAL_SANITIZE := undefined 而不是 -fsanitize=undefined ,结果相同。
c++ - 如何正确地将 uint32_t 转换为无符号
我正在尝试使用地址清理程序修复一些 C++ 代码。代码说:
消毒剂给出:
我需要如何解决这个问题?
c - 加载未对齐的地址和 UBsan 发现
这个问题不是关于未对齐数据访问的定义,而是为什么memcpy
尽管生成了相同的汇编代码,但类型转换却没有。
我有一些示例代码来解析一个协议,该协议发送一个字节数组,分割成六个字节的组。
在将指针增加 6 并进行另一次 32 位读取后,UBSan 报告有关未对齐负载的错误。我使用而不是类型双关来抑制此错误memcpy
,但我不太了解原因。需要明确的是,这是没有 UBSan 错误的相同例程,
两个例程都编译为相同的汇编代码(movl
用于 32 位读取和movzwl
16 位读取),那么为什么一个未定义的行为是另一个未定义的行为呢?是否memcpy
有一些特殊的属性可以保证某些东西?
我不想在memcpy
这里使用,因为我不能依赖编译器在优化它方面做得足够好。
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。
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
根据文档,也不需要。
这是摆脱错误的正确方法,还是有更强大的解决方案?
c - 对“__ubsan_handle_nonnull_arg”的未定义引用
最近几天我一直在研究问题集拼写器,到目前为止,这就是我所拥有的。不幸的是,它没有编译,我有点迷茫。如果有人可以帮助我并告诉我,我做错了什么,我将非常感激。
在所有函数中,我得到了一些未定义的引用和无效符号索引,它们不允许代码编译:
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:整数类型之间的隐式转换,如果这改变了值的符号。也就是说,如果原值为负,新值为正(或零),或者原值为正,新值为负。此消毒剂捕获的问题不是未定义的行为,而是通常是无意的。