使用Clang的UB消毒剂构建的程序的额外输出

时间:2016-06-10 19:23:27

标签: c++ clang undefined-behavior sanitizer

在使用已安装的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

(此命令从compile_commands.json获得,该命令由cmake生成)

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

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

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

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

我想当清洁剂遇到错误时会崩溃程序并打印一条带有解释的大信息。那这是什么?

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

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

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

1 个答案:

答案 0 :(得分: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++以希望删除此错误(我认为这不是来自我的代码!)

我在TestData ...

中使用了一个简单的std::set<>结构