SanitizerStats

简介

这些安全工具支持一种简单的机制来收集性能分析统计信息,以帮助了解与安全工具相关的开销。

如何构建和运行

SanitizerStats 目前只能与 控制流完整性 一起使用。除了 -fsanitize=cfi* 之外,还要传递 -fsanitize-stats 标志。这将导致程序统计程序中每个控制流完整性检查触发的次数。

在运行时,设置 SANITIZER_STATS_PATH 环境变量以将统计输出定向到文件。该文件将在进程退出时写入。以下替换将应用于环境变量

  • %b – 可执行文件基本名称。

  • %p – 进程 ID。

您还可以向进程发送 SIGUSR2 信号,使其立即写入安全工具统计信息。

sanstats 程序可用于转储统计信息。它将使用 -fsanitize-stats 编译的程序生成的统计文件路径作为命令行参数。

sanstats 的输出以四个空格分隔的列显示。第一列是调用站点的文件和行号。第二列是函数名称。第三列是收集的统计信息类型(在本例中为控制流完整性检查的类型)。第四列是调用计数。

示例

$ cat -n vcall.cc
     1 struct A {
     2   virtual void f() {}
     3 };
     4
     5 __attribute__((noinline)) void g(A *a) {
     6   a->f();
     7 }
     8
     9 int main() {
    10   A a;
    11   g(&a);
    12 }
$ clang++ -fsanitize=cfi -fvisibility=hidden -flto -fuse-ld=gold vcall.cc -fsanitize-stats -g
$ SANITIZER_STATS_PATH=a.stats ./a.out
$ sanstats a.stats
vcall.cc:6 _Z1gP1A cfi-vcall 1