3

在我使用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 sanitizer,因为当我使用 ASAN 构建或根本没有 sanitizer 时,所有这些数字都不存在。

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

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

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

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

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

4

1 回答 1

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<>

于 2016-06-26T16:13:27.930 回答