gpt4 book ai didi

c++ - 我应该如何在clang中使用 sanitizer ?

转载 作者:IT老高 更新时间:2023-10-28 22:28:09 28 4
gpt4 key购买 nike

很抱歉,如果这是一个 super 简单的概念,但我发现很难获得正确的心态才能正确使用 clang 提供的 sanitizer 。

float foo(float f) { return (f / 0); }

我用

编译了这个小片段
clang++ -fsanitize=float-divide-by-zero -std=c++11 -stdlib=libc++ -c source.cpp -o osan

我还编译了我的对象的“正常”版本而不使用 sanitizer

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)

所以在净化版本中有一个 undefined symbol ,其名称类似于我在编译时使用的净化器;但一切都是真正的“沉默”,clang前端根本没有输出。

我应该如何使用 sanitizer 以及正确的工作流程是什么?那个 undefined symbol 有什么意义?

最佳答案

undefined symbol 是一个实现 sanitizer 检查的函数。如果您查看生成的代码:

没有 sanitizer :

_Z3foof:                                # @_Z3foof
.cfi_startproc
# BB#0:
xorps %xmm1, %xmm1
divss %xmm1, %xmm0
ret

使用 sanitizer :

_Z3foof:                                # @_Z3foof
.cfi_startproc
.long 1413876459 # 0x54460aeb
.quad _ZTIFffE
# BB#0:
pushq %rax
.Ltmp1:
.cfi_def_cfa_offset 16
movss %xmm0, 4(%rsp) # 4-byte Spill
movd %xmm0, %esi
movl $__unnamed_1, %edi
xorl %edx, %edx
callq __ubsan_handle_divrem_overflow
xorps %xmm1, %xmm1
movss 4(%rsp), %xmm0 # 4-byte Reload
divss %xmm1, %xmm0
popq %rax
ret

您会看到它添加了使用该函数进行检查的代码。

编译器应该自动链接到适当的清理库,然后对我来说下面的完整程序:

float foo(float f) { return (f / 0); }
int main() {
foo(1.0f);
}

执行时产生以下输出:

main.cpp:1:32: runtime error: division by zero

我使用命令 clang++ -fsanitize=undefined main.cpp && ./a.out 构建和运行


如果您想要编译时检查,您想要启用更多编译器警告或静态分析器。但是,对于浮点除零错误,似乎没有任何警告或静态分析检查。

这是一个生成分析报告的程序:

#include <malloc.h>

int main() {
int *i = (int*) malloc(sizeof(int));
}

使用 clang++ -std=c++11 main.cpp 编译它不产生任何诊断信息,但使用 clang++ -std=c++11 --analyze main.cpp 编译它报告以下内容:

main.cpp:4:10: warning: Value stored to 'i' during its initialization is never read
int *i = (int*) malloc(sizeof(int));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:5:1: warning: Potential leak of memory pointed to by 'i'
}
^

dead store 也可以用 -Weverything [-Wunused-value] 检测,但泄漏只能由分析器检测到。

默认情况下,完整的分析结果会写入 plist 文件。您还可以使用以下命令运行分析器:

clang++ --analyze -Xanalyzer -analyzer-output=text main.cpp
clang++ --analyze -Xanalyzer -analyzer-output=html -o html-dir main.cpp

分别在标准输出或通过带注释的源代码的 html 显示而不是在 plist 中获取检测到的问题的详细演练。

列出了分析器检查here .

请注意,为了达到最佳效果,分析器需要分析整个程序,这意味着它需要与构建系统相关联。通常的接口(interface)是通过 IDE (Xcode) 或 scan-build与 make 的工具。 CMake 有一些 clang 特性,比如产生 clang JSON compilation database files但我不确定 CMake 是否内置了对 clang 分析器的支持。

关于c++ - 我应该如何在clang中使用 sanitizer ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22699881/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com