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