|  | ============== | 
|  | SanitizerStats | 
|  | ============== | 
|  |  | 
|  | .. contents:: | 
|  | :local: | 
|  |  | 
|  | Introduction | 
|  | ============ | 
|  |  | 
|  | The sanitizers support a simple mechanism for gathering profiling statistics | 
|  | to help understand the overhead associated with sanitizers. | 
|  |  | 
|  | How to build and run | 
|  | ==================== | 
|  |  | 
|  | SanitizerStats can currently only be used with :doc:`ControlFlowIntegrity`. | 
|  | In addition to ``-fsanitize=cfi*``, pass the ``-fsanitize-stats`` flag. | 
|  | This will cause the program to count the number of times that each control | 
|  | flow integrity check in the program fires. | 
|  |  | 
|  | At run time, set the ``SANITIZER_STATS_PATH`` environment variable to direct | 
|  | statistics output to a file. The file will be written on process exit. | 
|  | The following substitutions will be applied to the environment variable: | 
|  |  | 
|  | - ``%b`` -- The executable basename. | 
|  | - ``%p`` -- The process ID. | 
|  |  | 
|  | You can also send the ``SIGUSR2`` signal to a process to make it write | 
|  | sanitizer statistics immediately. | 
|  |  | 
|  | The ``sanstats`` program can be used to dump statistics. It takes as a | 
|  | command line argument the path to a statistics file produced by a program | 
|  | compiled with ``-fsanitize-stats``. | 
|  |  | 
|  | The output of ``sanstats`` is in four columns, separated by spaces. The first | 
|  | column is the file and line number of the call site. The second column is | 
|  | the function name. The third column is the type of statistic gathered (in | 
|  | this case, the type of control flow integrity check). The fourth column is | 
|  | the call count. | 
|  |  | 
|  | Example: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ 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 |