Clang 未定义的行为消毒剂抑制文件:无法分析抑制
使用-fsanize=undefined编译带有clang 3.6的应用程序后, 我试图启动插入指令的程序,同时使用抑制文件忽略一些错误:Clang 未定义的行为消毒剂抑制文件:无法分析抑制,clang,sanitizer,ubsan,Clang,Sanitizer,Ubsan,使用-fsanize=undefined编译带有clang 3.6的应用程序后, 我试图启动插入指令的程序,同时使用抑制文件忽略一些错误: UBSAN_OPTIONS="suppressions=ubsan.supp" ./app.exe 抑制文件ubsan.supp包含: signed-integer-overflow:example.c 这将导致一条错误消息: UndefinedBehaviorSanitizer: failed to parse suppressions GCC4.9
UBSAN_OPTIONS="suppressions=ubsan.supp" ./app.exe
抑制文件ubsan.supp包含:
signed-integer-overflow:example.c
这将导致一条错误消息:
UndefinedBehaviorSanitizer: failed to parse suppressions
GCC4.9版本也是如此。
我能找到的唯一文档是,它是针对Clang3.9的,而我使用的是3.6(它没有包含ubsan的文档)
有人能提供在Clang3.6中工作的ubsan抑制文件的工作示例吗
编辑:通过浏览ubsan的源代码,我发现唯一有效的抑制类型可能是“vptr_check”-但不知道我在看哪个版本。
有人能确认在clang 3.9中有更多的抑制类型可用吗?我通过创建三个文件来尝试它,
compile.sh
、main.cpp
和suppressions.supp
,如下所示。无符号整数溢出
不是未定义
的一部分,因此需要特别包括它。这在我的机器上使用了叮当声3.9
因此,我想更多的抑制类型在clang-3.9
中是有效的
# compile.sh
set -x
UBSAN_OPTIONS=suppressions=suppressions.supp:print_stacktrace=1 #:help=1
export UBSAN_OPTIONS
clang++-3.9 -g -std=c++11 -fsanitize=undefined -fno-omit-frame-pointer -fsanitize=unsigned-integer-overflow main.cpp
./a.out
// main.cpp
#include <bits/stdc++.h>
#include <bits/stl_tree.h>
using namespace std;
int main(int argc, char **argv) {
unsigned int k = UINT_MAX;
k += 1;
return 0;
}
# suppressions.supp
unsigned-integer-overflow:main.cpp
#compile.sh
集合x
UBSAN_OPTIONS=suppressions=suppressions.supp:print_stacktrace=1#:help=1
导出UBSAN_选项
clang++-3.9-g-std=c++11-fsanitize=undefined-fno省略帧指针-fsanitize=unsigned integer overflow main.cpp
/a.out
//main.cpp
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv){
无符号整数k=UINT_MAX;
k+=1;
返回0;
}
#suppressions.supp
无符号整数溢出:main.cpp
我没有花时间确切地找出在clang-3.6
中哪些抑制可用,但在clang-3.7
中,似乎只有vptr\u check
可用作抑制。从clang-3.8
开始,抑制列表将是检查的列表,加上vptr\u检查
。
在clang-3.9
中,检查为:
- “未定义”
- “空”
- “未对齐的指针使用”
- “对齐”
- “对象大小”
- “有符号整数溢出”
- “无符号整数溢出”
- “整数除以零”
- “浮点除以零”
- “移位基数”
- “移位指数”
- “界限”
- “遥不可及”
- “返回”
- “弗拉界”
- “浮动强制转换溢出”
- “布尔”
- “枚举”
- “功能”
- “返回非空属性”
- “非空属性”
- “vptr”
- “cfi”
- “vptr_检查”