【发布时间】: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