【发布时间】:2014-03-27 21:46:44
【问题描述】:
很抱歉,如果这是一个超级简单的概念,但我发现很难获得正确的心态才能正确使用clang 提供的消毒剂。
float foo(float f) { return (f / 0); }
我用这个小sn-p编译
clang++ -fsanitize=float-divide-by-zero -std=c++11 -stdlib=libc++ -c source.cpp -o osan
我还编译了我的对象的“正常”版本而不使用消毒剂
clang++ -std=c++11 -stdlib=libc++ -c source.cpp -o onorm
我期待一些详细的输出,或者来自控制台的一些错误,但是在使用 nm 检查文件时,我只发现了 1 个不同
nm o* --demangle
onorm:
0000000000000000 T foo(float)
osan:
U __ubsan_handle_divrem_overflow
0000000000000000 T foo(float)
所以在净化版本中有一个未定义的符号,其名称类似于我在编译时使用的净化器;但一切都是真正的“沉默”,clang前端根本没有输出。
我应该如何使用消毒剂以及正确的工作流程是什么?那个未定义的符号有什么意义?
【问题讨论】:
-
您应该将您的程序链接到可执行文件并运行它。消毒剂是运行时工具。
-
@osgx 有趣的是,在文档中,我发现没有人编译和运行带有
main函数的东西......所以我知道这是编译时间工具。 -
user2485710,哪些文档? Clang 的手册说 clang.llvm.org/docs/UsersManual.html “控制代码生成 ... -fsanitize=... 为各种形式的未定义或可疑行为打开 运行时检查 .... 如果检查失败,则会显示诊断消息在运行时产生解释问题。"
-
@osgx 来自 llvm 项目的文档,我没有它们的链接,可能它是与源代码本身一起分发的,但实际上它有点令人困惑,并让我想到了消毒剂 。在开始任何关于此的教程之前,应该更加强调“运行时”阶段。
-
@osgx 不,肯定不是那个页面。