【问题标题】:Additional output from program built with the UB sanitizer of Clang使用 Clang 的 UB sanitizer 构建的程序的附加输出
【发布时间】:2016-06-10 19:23:27
【问题描述】:

在我使用已安装的clang version 3.4 (tags/RELEASE_34/final) 的 travis CI 上,我使用以下代码构建我的代码:

clang++ main.cpp -m64 -fsanitize=undefined -Werror -std=c++98 -pedantic -pedantic-errors -fvisibility=hidden -fstrict-aliasing -Weverything -Qunused-arguments -fcolor-diagnostics -O3 -DNDEBUG

(此命令是从cmake生成的compile_commands.json获取的)

并在程序退出后的输出中出现一些数字(如内存的十六进制表示):

00 00 00  10 70 fb 01 00 00 00 00  10 70 fb 01

我猜这是来自 UB sanitizer,因为当我使用 ASAN 构建或根本没有 sanitizer 时,这些数字都不存在。

那么它们是什么意思?如何诊断我的 UB 错误(如果确实如此)?

我认为当消毒剂遇到错误时,它会使程序崩溃并打印一条带有解释的大消息。那么这是什么?

这对我来说是一个交易破坏者,因为我将文本文件中的参考输出与当前构建的程序输出进行比较,这样额外的输出会破坏一切。

我尝试在本地使用 Clang 3.6,这是我的 Ubuntu 使用相同构建命令的默认设置,但是当我运行可执行文件时,我没有收到任何错误或此类额外输出。

here 是基于 travis 的失败构建 - 我认为我的代码不相关,因为我的问题是消毒剂输出根本没有帮助。

【问题讨论】:

  • 你知道他们对未定义行为的看法。
  • 是的 - 但该工具不应该帮助我诊断 UB 吗?而不仅仅是说hey! there is some UB
  • 好吧,该工具将代码注入可执行文件。 “未定义的行为”有可能使 UBSan 停止工作,这并不奇怪。我确定您有正当理由,但我也注意到您禁用了许多有助于捕获 UB(使用您的编译指示)的警告。

标签: c++ clang undefined-behavior sanitizer


【解决方案1】:

我还使用 clang 3.5/3.6/3.7/3.8 启用了构建,结果发现 clang 3.5 的行为方式相同......

clang 3.6 但是提供更多输出!

  20 6c 98 01 00 00 00 00  20 6c 98 01 00 00 00 00  20 6c 98 01
              ^ 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/stl_tree.h:247:17: runtime error: upcast of address 0x00000115e090 with insufficient space for an object of type 'std::_Rb_tree_node<doctest::detail::TestData>'
0x00000115e090: note: pointer points here
 00 00 00 00  00 00 00 00 00 00 00 00  20 6c 98 01 00 00 00 00  20 6c 98 01 00 00 00 00  20 6c 98 01

clang 3.7 和 3.8 给出与 3.6 相同的输出

我正在使用libstdc++,所以我将切换到libc++ 以希望消除此错误(我认为这不是来自我的代码!)

我在std::set&lt;&gt; 中使用了一个简单的TestData 结构...

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2022-08-04
    • 1970-01-01
    相关资源
    最近更新 更多