This project is a couple of tools that does source or binary analysis to get an
estimate of how much of a program or project is fortified as a result of
building with the _FORTIFY_SOURCE
macro.
This plugin helps get source level statistics on object size computation in
source code. Specifically, when a source file is built with this plugin
invoked, it will print the number of times that the __builtin_object_size
builtin was computed successfully along with the number of times it would have
been computed successfully if it were replaced with
__builtin_dynamic_object_size
.
make
to build and make check
to run tests.
Add -fplugin=$PATH_TO/fmetrics.so -fplugin-arg-fmetrics-project=SOMENAME
to
CFLAGS
or CXXFLAGS
of the project you intend to analyze and then build it.
The output for every source file is written out to stderr in the form:
SOMENAME:: TOTAL:BOS:BDOS
Where SOMENAME
is what you passed in the CFLAGS
above, TOTAL is the number
of __builtin_object_size
encountered, BOS
is the number of
__builtin_object_size
that the compiler successfully resolved to something
other than (size_t) -1
and BDOS
is the corresponding success count if the
builtin were replaced with __builtin_dynamic_object_size
.
The __builtin_object_size
builtin may get folded away early in some cases,
thus eluding the plugin. These cases however are successes or failures (e.g.
in handling of volatile expressions) in both __builtin_object_size
and
__builtin_dynamic_object_size
, so the meaning of the metrics should not
change. The percentage changes however may look different from the ideal
case.
Parse DSOs to get statistics for how well _FORTIFY_SOURCE
did with that DSO.
This is different from OpenOSC, which aims
to be more precise at compile time and add instrumentation for enhanced
diagnostics. This project aims to do none of that and as a result, can be
deployed pretty much anywhere and just pointed at a path or a DSO. Further,
OpenOSC assumes constant object sizes, which makes it unsuitable for
_FORTIFY_SOURCE=3
.
usage: fortify-metrics.py [-h] [-v] [-l] [-f] path [path ...]
Get build time statistics of _FORTIFY_SOURCE coverage for ELF files in given
directories.
positional arguments:
path Files or directories to analyze
optional arguments:
-h, --help show this help message and exit
-v, --verbose Verbose mode.
-l, --listall Include fortifiable functions with zero call counts.
-f, --fullpath Show full path in binary names.
More _chk
function calls does not necessarily mean better fortification
because calls may have been simplified to their regular variants and in some
cases, inlined or transformed to simpler calls. One could make reasonable
conclusions from the data though, based on changes in total calls across all
fortifiable functions.
Submit a pull request or file an issue!