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

sanitization - 有人在发布的软件中使用消毒剂吗?

消毒剂,例如:

  • 地址消毒剂(ASAN);
  • 未定义的行为清理器 (UBSAN)
  • 等等

在开发和测试过程中经常使用。

这些工具是否在已发布的软件中使用?

0 投票
3 回答
762 浏览

address-sanitizer - 日志控制,用于 Address Sanitizer PLUS Undefined Behavior Sanitizer?

几个消毒剂(来自 GCC 或 Clang)不能组合 - 即在同一构建中同时使用,但 Asan 和 Ubsan 是可组合的 - 即我可以使用“-fsanitize=address,undefined -fsanitize-recover=all ...”构建并有一个执行两个消毒剂检查的 exe。到目前为止一切都很好。

不过,生成的可执行文件中的 LOGGING 似乎有问题。

在所有情况下,如果未在选项中设置“log_path”,则所有缺陷都会在 stderr 上报告。到目前为止还可以。但是尝试使用 log_path ,事情变得很奇怪:

  • 对于仅使用 Asan 构建的 exe,并将 ASAN_OPTIONS 设置为包含“log_path=./ASAN”,Address Saniitizer 缺陷将进入名为 ASAN 的文件中。
  • 对于仅使用 Ubsan 构建的 exe,并将 UBSAN_OPTIONS 设置为包含“log_path=./UBSAN”,未定义行为缺陷将进入名为 UBSAN 的文件中。
  • 对于同时使用 Asan 和 Ubsan 构建的 exe o Asan 输出到指定的日志文件,但 ubsan 输出只到 stderr在 ASAN_OPTIONS 和 UBSAN_OPTIONS 中设置,使用的 log_path 是 UBSAN 之一,但只包含 ASAN 结果

是否有一些隐藏的魔法可以让两个消毒剂写入同一个缺陷日志?


要重现,请使用每个消毒剂都有缺陷的简单测试用例:

构建并运行:(此处使用 g++ 7.3.0,但其他 GCC 版本以及 clang 7.1.0 也显示出相同的基本行为)

仅限 Asan - 按预期工作

归档 ASAN。29648 包含以

==29648==错误:AddressSanitizer:全局缓冲区溢出地址 0x000000400aca 在 pc 0x0000004009a5 bp 0x7ffffffffe090 sp 0x7ffffffffe088

在 main /tmp/foo.C:7 中的 0x000000400aca 线程 T0 0x4009a4 处读取大小 1

仅 Ubsan - 按预期工作

文件 UBSAN.29675 包含

foo.C:6:6:运行时错误:移位指数 32 对于 32 位类型“int”而言太大

Asan PLUS Ubsan - 奇怪的日志记录行为

ASAN_OPTIONS 被忽略,所有缺陷都报告在标准错误上。现在尝试设置 UBSAN_OPTIONS:

文件 UBSAN.30352 仅包含Asan缺陷:

==30352==错误:AddressSanitizer:全局缓冲区溢出地址 0x000000400aca 在 pc 0x0000004009a5 bp 0x7ffffffffe090 sp 0x7ffffffffe088 读取大小 1 在 0x000000400aca 线程 T0 0x4009a4 在主 /tmp/foo.C:7

并且 Ubsan 缺陷仅写入 stderr:

foo.C:6:6:运行时错误:移位指数 32 对于 32 位类型“int”而言太大

0 投票
0 回答
560 浏览

c - Clang:生成的 .o 文件与 elf64-x86-64 不兼容

我正在尝试使用 clang 交叉编译并为 .c 文件运行 Undefined Behavior Sanitizer

我正在运行的命令

clang 是交叉编译器

sparc 是目标架构。

-integrated-as 使用 llvm 汇编器

-fuse-ld=lld 使用 lld 链接器

-fsanitize=undefined 运行 UBSan

错误

ld.lld:错误:/tmp/test1-43c7c0.o 与 elf64-x86-64 不兼容

collect2:错误:ld 返回 1 个退出状态

clang-11:错误:链接器(通过 gcc)命令失败,退出代码为 1(使用 -v 查看调用)

我的系统

Ubuntu 18.04

x86_64

在 ubuntu 终端上执行的命令

在不包含 sparc 程序集的 file.c 上没有 -target sparc,clang 可以正常工作

0 投票
1 回答
919 浏览

c++ - 在启用 UBSAN 的情况下将 double 转换为 long long 时超出可表示值的范围

在启用 UBSAN 的情况下编译以下代码会导致此错误:

运行时错误:值 9.22337e+18 超出“long long”类型的可表示值范围

这是一个已知的问题?我的理解是该值不在范围之外。

0 投票
2 回答
137 浏览

c++ - 如何检测 C++ 代码中的非一错误 (OBOE)?

考虑这个简单的程序:

如果我像这样编译并将其与 GCC 6.3.1 链接:

并像这样运行它:

我没有收到任何警告,即使我正在写入和读取 'arr' 末尾之后的一个元素(数组在索引 4 处结束)。

如果我运行:

我收到一条警告,提示“索引 6 超出类型“int [5]”的范围。在这种情况下,我正在编写和读取 'arr' 末尾之后的两个元素。

为什么非一个案例不会引发错误?我猜是因为数组末尾的一个元素是有效的内存地址(即迭代器可以指向它?)。您能否推荐任何其他可以可靠地检测到一个元素的越界访问的工具?

编辑

我也可以运行:

而且我看到了相同的行为,即一个元素的越界访问不会触发警告,但是,两个元素的越界访问会触发。这是我试图理解的部分。

0 投票
1 回答
331 浏览

c++ - fsanitize=undefined 导致链接器错误

我正在尝试使用 conda g++ 编译器使用 -fsanitize=undefined 编译程序。我遇到了“__ubsan_handle_type_mismatch”链接器错误。我在编译和链接中使用了标志,如下所示:

包括在链接末尾添加 -lubsan 并编译我知道不推荐但我没有成功的命令。我还确保我的 LD_LIBRARY_PATH 是空的,这样就不会出现任何问题。

下面是一个最小的示例问题,包括我的 python 环境的配置

车辆.h

车辆.cpp

测试.cpp

生成文件

我的 conda 环境 YAML 文件是:

make的结果是:

编辑:使用详细链接器重新运行

0 投票
0 回答
376 浏览

clang - Clang++ LSAN 和 UBSAN 导致对 `__ubsan_handle_add_overflow' 的未定义引用

当我在使用编译器清理程序时,当仅在clang++.

请注意,当我删除-fsanitize=leak或添加这些标志时,链接问题消失了:-fsanitize=leak -fsanitize-trap=undefined.

另请注意,这种奇怪的链接错误似乎只在使用clang++. g++在下面显示的所有情况下都工作得很好。

任何线索都可能有所帮助。谢谢。

main.cpp如果您需要(您可能永远不会这样做)的源代码:

0 投票
3 回答
710 浏览

c++ - 为什么启用未定义的行为清理会干扰优化?

考虑以下代码:

如果我用 GCC 10.2 和 flags 编译它--std=c++17 -O1,我会得到:

此外,据我所知,此代码不会遇到任何未定义的行为问题。

但是 - 如果我添加 flag -fsanitize=undefined,编译结果是:

看到这个Compiler Explorer

我的问题:为什么清理会干扰优化?特别是因为代码似乎没有任何 UB 危害......

笔记:

  • 我怀疑是 GCC 错误,但也许我对 UBsan 所做的事情有错误的认识。
  • 如果我设置相同的行为-O3
  • 在没有优化标志的情况下,无论是否经过清理,都会生成较长的代码。
  • 如果您声明xconstexpr变量,则清理不会阻止优化。
  • 与 C++17 和 C++20 的行为相同。
  • 使用 Clang,您也会得到这种差异,但只能使用更高的优化设置(例如-O3)。
0 投票
1 回答
141 浏览

linux - 如何在 Linux 内核中启用有符号整数溢出 UBSan?

当我配置内核 5.4.0 时:

并且-fsanitize=signed-integer-overflow在编译过程中也出现在 gcc 命令中。

但是,在最后的 vmlinux 中,__ubsan_handle_add_overflow被镜像了,却从来没有调用过。

相比之下,其他非有符号整数溢出 UBSan 处理程序,例如 __ubsan_handle_load_invalid_value__ubsan_handle_shift_out_of_bounds 被广泛调用。

在整个编译过程中,我找不到这两种类型的 UBSan 之间的任何区别。是否可能是因为编译器优化假设溢出不应该存在,因此没有检测这些与溢出相关的 UBSan?

我在此处附加了一个典型的 gcc 命令,以备不时之需:

cmd_fs/ioctl.o := /home/cm/exp/symslice/syzkaller/gcc/bin/gcc -Wp,-MD,fs/.ioctl.o.d -nostdinc -isystem /home/cm/exp/symslice/syzkaller/gcc/bin/../lib/gcc/x86_64-pc-linux-gnu/8.0.1/include -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE -Werror=implicit-function-declaration -Werror=implicit-int -Wno-format-security -std=gnu89 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m64 -falign-jumps=1 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -march=core2 -mno-red-zone -mcmodel=kernel -DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_SSSE3=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -DCONFIG_AS_AVX512=1 -DCONFIG_AS_SHA1_NI=1 -DCONFIG_AS_SHA256_NI=1 -Wno-sign-compare -fno-asynchronous-unwind-tables -fno-delete-null-pointer-checks -Wno-frame-address -Wno-format-truncation -Wno-format-overflow -O2 --param=allow-store-data-races=0 -Wframe-larger-than=2048 -fstack-protector-strong -Wno-unused-but-set-variable -Wimplicit-fallthrough -Wno-unused-const-variable -fomit-frame-pointer -fno-var-tracking-assignments -g -femit-struct-debug-baseonly -fno-var-tracking -Wdeclaration-after-statement -Wvla -Wno-pointer-sign -Wno-stringop-truncation -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fno-stack-check -fconserve-stack -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -fmacro-prefix-map=./= -Wno-packed-not-aligned -fsanitize=kernel-address -fasan-shadow-offset=0xdffffc0000000000 --param asan-globals=1 --param asan-instrumentation-with-call-threshold=10000 --param asan-stack=1 --param asan-instrument-allocas=1 -fsanitize=shift -fsanitize=integer-divide-by-zero -fsanitize=unreachable -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=object-size -fsanitize=bool -fsanitize=enum -Wno-maybe-uninitialized -fsanitize-coverage=trace-pc -fsanitize-coverage=trace-cmp -DKBUILD_BASENAME='"ioctl"' -DKBUILD_MODNAME='"ioctl"' -c -o fs/ioctl.o fs/ioctl.c

0 投票
1 回答
336 浏览

security - 了解由未定义行为清理程序 (UBSan) 触发的运行时错误

启用未定义的消毒剂时,我在 GNU 科学库 (GSL) 中发现运行时错误:

但我不知道如何导致这些错误,或者如何修复它们。有人可以帮忙解释一下吗?此外,是否应该向开发人员提出一个重要的问题(例如,这种蜜蜂是否可以被用作安全攻击)?

源代码“deque.c”可以在这里找到,运行时错误的相关行如下所示(错误出现在第58、59、60、61行)。

在此处输入图像描述

deque 的定义在这里,在同一个文件中:

这里

[添加]代码调用如下,在GSL 的 movstat 库deque_initmmacc.c

上面代码中的函数引用了GSL的movstat库中ringbuf_size的以下代码。ringbuf.c