6

使用-fsanitize=undefined使用 clang 3.6 编译应用程序后,我尝试启动检测程序,同时使用抑制文件忽略一些错误:

UBSAN_OPTIONS="suppressions=ubsan.supp" ./app.exe

抑制文件 ubsan.supp 包含:

signed-integer-overflow:example.c

这会导致错误消息:

UndefinedBehaviorSanitizer: failed to parse suppressions

gcc 4.9 版本也是如此。我能找到的唯一文档是http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html,它适用于 clang 3.9,而我使用的是 3.6(其中不包含 ubsan 的文档)。

任何人都可以提供适用于 clang 3.6 的 ubsan 抑制文件的工作示例吗?

编辑:通过浏览 ubsan 的源代码,我发现唯一有效的抑制类型可能是“vptr_check”——但不知道我在看哪个版本。谁能确认在 clang 3.9 中有更多的抑制类型可用?

4

2 回答 2

1

我尝试过创建三个文件,compile.shmain.cppsuppressions.supp如下所示。这unsigned-integer-overflow不是其中的一部分,undefined因此需要特别包含它。这适用于我的带有 clang-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
于 2017-07-05T19:01:05.237 回答
1

我没有花时间确切地找出哪些抑制可用 in clang-3.6,但似乎 in clang-3.7onlyvptr_check可用作抑制。从 开始clang-3.8,禁止列表被定义为检查列表,加上vptr_check。在可用clang-3.9的检查是:

  • “不明确的”
  • “无效的”
  • “未对齐的指针使用”
  • “结盟”
  • “对象大小”
  • “有符号整数溢出”
  • “无符号整数溢出”
  • “整数除以零”
  • “浮点除以零”
  • “班底”
  • “移位指数”
  • “界限”
  • “无法到达”
  • “返回”
  • “vla绑定”
  • “浮动铸造溢出”
  • “布尔”
  • “枚举”
  • “功能”
  • “返回非空属性”
  • “非空属性”
  • “vptr”
  • “cf”
  • “vptr_check”
于 2018-12-31T19:20:59.570 回答