问题标签 [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++ - Clang 运行时检查:打印回溯
Clang 编译器提供了许多有用的运行时检查,例如-fsanitize=unsigned-integer-overflow
. 当其中一项检查失败时,我可以打印回溯(例如使用 gdb)吗?目前我得到了问题的确切位置,但我没有上下文。我怎样才能从这些运行时检查中获得更多信息,尤其是回溯?
c++ - Clang 的 UBSan 和函数指针:这是非法的吗?
我正在尝试通过函数指针表调用一些 C++ 函数,该函数指针表作为 C 符号从共享对象中导出。该代码实际上正在运行,但 Clang 的未定义行为清理程序(= UBSan)认为我所做的调用是非法的,如下所示:
由于 Clang 的未定义行为清理器,通过函数指针间接调用返回 C++ 标准类对象的引用的函数是合法的,但对于用户定义的类是非法的。有人能告诉我它有什么问题吗?
我一直在尝试使用Clang-llvm 3.4-1ubuntu3和CMake 2.8.12.2在Ubuntu 14.04上构建项目。要重现该现象,请将以下5个文件放在同一目录下并调用build.sh。它将创建一个 makefile 并构建项目,并运行可执行文件。
Foo.h
Foo.cpp
你好世界.cpp
CMakeLists.txt
构建.sh
我一直在试图找到一个线索来深入研究这个问题,并意识到这个问题是由消毒剂的“功能”选项(-fsanitize=function)发现的,但它没有太多的记录。如果你们能给我一个合理的解释,我会很感激这样一个运行时错误消息,它看起来像是来自另一个星球。谢谢。
Clang 在输出中指出的“未知”是什么?
下面是 addr2line 的输出,用于检查消毒剂的“未知”内容:
嗯,它真的看起来像我期待调用的函数。你能猜到 Clang 看起来有什么不同吗?
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
似乎有效,但这个名字看起来很内部。
c++ - Clang++ UBSAN 报告类型“std::_Ios_Fmtflags”的无效值
以下代码在clang UBSAN编译时会崩溃
使用 Clang 3.6 编译:
$> clang++-3.6 -fsanitize=undefined -fno-sanitize=float-divide-by-zero,vptr,function -fno-sanitize-recover -o test test.cpp
然后程序崩溃了:
$> ./test in floatToString /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/ios_base.h :96:24:运行时错误:加载值 4294966271,这不是类型“std::_Ios_Fmtflags”的有效值
有人可以帮助我打开clang UBSAN时为什么会出现这个问题吗?
c++ - 运行时错误:加载值 127,这不是类型“bool”的有效值
我在 Debian 8 x86_64 上使用 g++ 4.9.2。我遇到了一个未定义的行为清理程序 (UBsan) ( -fsanitize=undefined
) 错误:
代码来自 Crypto++ 库。这是algebra.cpp:206
(和一些相关代码)的代码:
它在几个地方被调用,例如:
InversionIsFast
是一个bool
,所以这应该不是问题。但我添加!!InversionIsFast()
以防万一,问题仍然存在。
编辑:这是一个 grep InversionIsFast
。它似乎已初始化。
我也在m_negateNext
ctor中进行了初始化。
问题是什么,我该如何解决?
c++ - 使用 GCC Undefined Behavior Sanitizer
今天我读了一篇关于GCC Undefined Behavior Sanitizer (ubsan)的文章。但是,当我按照那里的步骤(添加-fsanitize=undefined
到我的代码中)时,编译器(Ubuntu 15.04 上的 GCC 4.9.2)说没有定义一些引用:
我怎样才能解决这个问题?
c++ - UBSan 和 Asan 与 GCC 4.9.2 一起使用
我已经用-fsanitize=undefined
选项编译了我的应用程序。我现在如何测试我的应用程序的未定义行为?
另外,如何进行 Asan 检查?我已经用 编译了我的程序-fsanitize=address
,它崩溃并显示以下输出:
我在 Ubuntu 15.04 上安装了 GCC 4.9.2。
c++ - 如何抑制来自 UBsan 的一些无符号整数溢出错误?
我的大多数-fsanitize=unsigned-integer-overflow
错误都是错误,但有时我会按预期明确使用它,这会导致 UBSan 产生误报。
有没有办法为特定表达式关闭 UBSan 无符号整数溢出检查?
编辑以回应 Shafik 评论,这里是一个例子:
大多数时候这是一个错误,有时不是。使用 UBSan,每次发生这种情况时都可以找到并修复错误,但我还没有找到一种方法来消除误报。
编辑 2:启用检查需要通过-fsanitize=integer
(启用所有整数检查)或fsanitize=unsigned-integer-overflow
. 从下面的评论看来,该检查仅在 clang 中可用,而在 GCC 中尚不可用。
g++ - Cygwin 的 UBsan 需要什么软件包?
我有一个测试脚本,可以通过各种配置进行打磨。该脚本测试Undefined Behavior sanitizer (UBsan)的可用性,然后在可用时执行构建。这是测试:
上面的测试设置HAVE_UBSAN=1
在 Cygwin 上,这意味着 GCC 的 Cygwin 声称支持 UBsan(否则会产生错误)。但是,我在 Cygwin i686 和 x86_64 下都发现了一个链接错误:
显然,没有安装任何需要的东西gcc-core
or gcc-g++
。我再次运行安装程序并搜索,ubsan
但我得到了 0 次点击。
Cygwin 的 UBsan 需要哪些软件包?
当我这样做的时候,我不妨问问我希望经历的下一次失败。Cygwin 的 Asan 需要什么包?
提前致谢。
clang - 未定义的行为清理程序抑制文件:无法解析抑制
使用-fsanitize=undefined使用 clang 3.6 编译应用程序后,我尝试启动检测程序,同时使用抑制文件忽略一些错误:
抑制文件 ubsan.supp 包含:
这会导致错误消息:
gcc 4.9 版本也是如此。我能找到的唯一文档是http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html,它适用于 clang 3.9,而我使用的是 3.6(其中不包含 ubsan 的文档)。
任何人都可以提供适用于 clang 3.6 的 ubsan 抑制文件的工作示例吗?
编辑:通过浏览 ubsan 的源代码,我发现唯一有效的抑制类型可能是“vptr_check”——但不知道我在看哪个版本。谁能确认在 clang 3.9 中有更多的抑制类型可用?