Fuzz introspector
For issues and ideas: https://github.com/ossf/fuzz-introspector/issues

Fuzzer details

Fuzzer: fuzz_load

Call tree

The calltree shows the control flow of the fuzzer. This is overlaid with coverage information to display how much of the potential code a fuzzer can reach is in fact covered at runtime. In the following there is a link to a detailed calltree visualisation as well as a bitmap showing a high-level view of the calltree. For further information about these topics please see the glossary for full calltree and calltree overview

Call tree overview bitmap:

The distribution of callsites in terms of coloring is
Color Runtime hitcount Callsite count Percentage
red 0 42 21.3%
gold [1:9] 0 0.0%
yellow [10:29] 0 0.0%
greenyellow [30:49] 0 0.0%
lawngreen 50+ 155 78.6%
All colors 197 100

Fuzz blockers

The following nodes represent call sites where fuzz blockers occur.

Amount of callsites blocked Calltree index Parent function Callsite Largest blocked function
7 11 toml.decoder._detect_pathlib_path call site: 00011 toml.decoder.loads
7 184 toml.decoder.load call site: 00184 toml.decoder.load
6 117 toml.decoder._load_date call site: 00117 .int
6 143 toml.decoder.TomlDecoder.load_value call site: 00143 TIME_RE.match
3 113 toml.decoder._load_date call site: 00113 .int
3 173 toml.decoder.loads call site: 00173 toml.decoder.TomlDecoder.get_empty_table
2 0 EP call site: 00000 toml.ordered.TomlOrderedDecoder.__init__
2 5 ...fuzz_load.TestOneInput call site: 00005 toml.decoder.load
1 22 toml.decoder.loads call site: 00022 s.decode
1 64 toml.decoder.TomlDecoder.bounded_string call site: 00064 .len
1 109 toml.decoder._load_date call site: 00109 .len
1 129 toml.decoder.TomlDecoder.load_line call site: 00129 quotesplit.split

Runtime coverage analysis

Covered functions
61
Functions that are reachable but not covered
52
Reachable functions
81
Percentage of reachable functions covered
35.8%
NB: The sum of covered functions and functions that are reachable but not covered need not be equal to Reachable functions . This is because the reachability analysis is an approximation and thus at runtime some functions may be covered that are not included in the reachability analysis. This is a limitation of our static analysis capabilities.
Function name source code lines source lines hit percentage hit

Files reached

filename functions hit
/ 1
...fuzz_load 8
toml.ordered 1
toml.decoder 74
toml.tz 1

Fuzzer: fuzz_dump

Call tree

The calltree shows the control flow of the fuzzer. This is overlaid with coverage information to display how much of the potential code a fuzzer can reach is in fact covered at runtime. In the following there is a link to a detailed calltree visualisation as well as a bitmap showing a high-level view of the calltree. For further information about these topics please see the glossary for full calltree and calltree overview

Call tree overview bitmap:

The distribution of callsites in terms of coloring is
Color Runtime hitcount Callsite count Percentage
red 0 5 11.3%
gold [1:9] 0 0.0%
yellow [10:29] 0 0.0%
greenyellow [30:49] 0 0.0%
lawngreen 50+ 39 88.6%
All colors 44 100

Fuzz blockers

The following nodes represent call sites where fuzz blockers occur.

Amount of callsites blocked Calltree index Parent function Callsite Largest blocked function
1 2 ...fuzz_dump.TestOneInput call site: 00002 toml.ordered.TomlOrderedEncoder.__init__
1 4 toml.ordered.TomlOrderedEncoder.__init__ call site: 00004 fdp.ConsumeInt
1 15 toml.encoder._dump_str call site: 00015 v.decode
1 27 toml.encoder.TomlEncoder.dump_sections call site: 00027 toml.encoder.TomlEncoder.dump_value
1 31 toml.encoder.TomlEncoder.dump_sections call site: 00031 toml.encoder.TomlEncoder.dump_inline_table

Runtime coverage analysis

Covered functions
509
Functions that are reachable but not covered
21
Reachable functions
30
Percentage of reachable functions covered
30.0%
NB: The sum of covered functions and functions that are reachable but not covered need not be equal to Reachable functions . This is because the reachability analysis is an approximation and thus at runtime some functions may be covered that are not included in the reachability analysis. This is a limitation of our static analysis capabilities.
Warning: The number of covered functions are larger than the number of reachable functions. This means that there are more functions covered at runtime than are extracted using static analysis. This is likely a result of the static analysis component failing to extract the right call graph or the coverage runtime being compiled with sanitizers in code that the static analysis has not analysed. This can happen if lto/gold is not used in all places that coverage instrumentation is used.
Function name source code lines source lines hit percentage hit

Files reached

filename functions hit
/ 1
...fuzz_dump 7
toml.ordered 1
toml.encoder 21

Analyses and suggestions

Optimal target analysis

Remaining optimal interesting functions

The following table shows a list of functions that are optimal targets. Optimal targets are identified by finding the functions that in combination, yield a high code coverage.

Func name Functions filename Arg count Args Function depth hitcount instr count bb count cyclomatic complexity Reachable functions Incoming references total cyclomatic complexity Unreached complexity
numpy.f2py.f2py2e.run_main numpy.f2py.f2py2e 1 ['N/A'] 4 0 9 8 6 235 2 900 873
numpy.distutils.command.build_clib.build_clib.run numpy.distutils.command.build_clib 1 ['N/A'] 5 0 15 8 6 204 0 687 624
numpy.f2py.crackfortran.postcrack numpy.f2py.crackfortran 3 ['N/A', 'N/A', 'N/A'] 4 0 9 20 11 189 4 714 566
numpy.lib.shape_base.apply_along_axis numpy.lib.shape_base 5 ['N/A', 'N/A', 'N/A', 'N/A', 'N/A'] 5 0 1 2 4 164 0 553 508
numpy.linalg.setup.configuration numpy.linalg.setup 2 ['N/A', 'N/A'] 5 0 4 2 4 172 0 576 443
numpy.distutils.command.build_src.build_src.build_sources numpy.distutils.command.build_src 1 ['N/A'] 4 0 6 2 4 167 1 557 407
numpy.f2py.crackfortran.readfortrancode numpy.f2py.crackfortran 3 ['N/A', 'N/A', 'N/A'] 4 0 14 42 20 178 3 701 324

Implementing fuzzers that target the above functions will improve reachability such that it becomes:

Functions statically reachable by fuzzers
11.0%
407 / 3860
Cyclomatic complexity statically reachable by fuzzers
14.0%
1966 / 14128

All functions overview

If you implement fuzzers for these functions, the status of all functions in the project will be:

Func name Functions filename Args Function call depth Reached by Fuzzers Fuzzers runtime hit Func lines hit % I Count BB Count Cyclomatic complexity Functions reached Reached by functions Accumulated cyclomatic complexity Undiscovered complexity

Runtime coverage analysis

This section shows analysis of runtime coverage data.

For futher technical details on how this section is generated, please see the Glossary .

Complex functions with low coverage

Func name Function total lines Lines covered at runtime percentage covered Reached by fuzzers
io.open 788 75 9.517% ['fuzz_load']
re.match 2443 656 26.85% ['fuzz_dump']
d.update 31 12 38.70% ['fuzz_load']
v.dump 359 65 18.10% []
numpy.lib.npyio._read 98 1 1.020% []
numpy.lib.npyio.savetxt.WriteWrap.first_write 67 0 0.0% []
numpy.lib.npyio.genfromtxt 169 0 0.0% []
numpy.lib.npyio.genfromtxt.tobytes_first 77 0 0.0% []
numpy.lib.npyio.genfromtxt.encode_unicode_cols 79 1 1.265% []
numpy._pytesttester.PytestTester.__call__ 39 0 0.0% []
numpy.core.numeric.tensordot 54 0 0.0% []
numpy.core.numeric.cross 61 1 1.639% []
numpy.matrixlib.defmatrix.matrix.__new__ 35 0 0.0% []
numpy.core.function_base.linspace 37 0 0.0% []
numpy.core.function_base.geomspace 33 0 0.0% []
numpy.lib.polynomial.polyfit 48 0 0.0% []
numpy.lib.polynomial.poly1d.__str__.fmt_float 35 0 0.0% []
numpy.lib.utils.who 41 0 0.0% []
numpy.lib.utils.info 69 0 0.0% []
numpy.lib.utils._lookfor_generate_cache 89 0 0.0% []
numpy.ma.core.MaskedArray.__new__ 51 16 31.37% []
numpy.ma.core.MaskedArray.__getitem__._scalar_heuristic 41 0 0.0% []
numpy.ma.core.MaskedArray.__setitem__ 50 3 6.0% []
numpy.ma.core.MaskedArray.__setmask__ 37 3 8.108% []
numpy.ma.core.MaskedArray.__repr__ 33 0 0.0% []
numpy.ma.core.MaskedArray.var 35 1 2.857% []
numpy.core.einsumfunc._greedy_path 34 0 0.0% []
numpy.core.einsumfunc._can_dot 31 0 0.0% []
numpy.core.einsumfunc._parse_einsum_input 103 0 0.0% []
numpy.core.einsumfunc.einsum_path 107 0 0.0% []
numpy.core.einsumfunc.einsum 42 0 0.0% []
numpy.core._internal._array_descr 34 0 0.0% []
numpy.core._internal._commastring 33 0 0.0% []
numpy.core._internal.__dtype_from_pep3118 78 0 0.0% []
d.ravel 31 12 38.70% []
numpy.ctypeslib.ndpointer 45 0 0.0% []
numpy.polynomial.chebyshev._zseries_div 31 0 0.0% []
numpy.polynomial.chebyshev.chebint 37 0 0.0% []
numpy.core._machar.MachAr._do_init 178 0 0.0% []
numpy.linalg.linalg.matrix_power 32 0 0.0% []
numpy.linalg.linalg.qr 47 0 0.0% []
numpy.linalg.linalg.svd 41 0 0.0% []
numpy.linalg.linalg.lstsq 38 0 0.0% []
numpy.linalg.linalg.norm 82 0 0.0% []
numpy.core._methods._var 33 0 0.0% []
numpy.core.arrayprint.FloatingFormat.fillFormat 56 0 0.0% []
numpy.lib.arraysetops.in1d 69 0 0.0% []
numpy.lib.format._read_array_header 37 0 0.0% []
numpy.lib.format.read_array 32 0 0.0% []
numpy.lib._iotools.NameValidator.validate 38 0 0.0% []
numpy.lib._iotools.StringConverter.__init__ 46 0 0.0% []
numpy.core.records.fromfile 33 0 0.0% []
numpy.core.records.array 41 0 0.0% []
numpy.ma.extras.apply_along_axis 69 1 1.449% []
numpy.ma.extras.average 31 0 0.0% []
numpy.ma.extras._median 36 0 0.0% []
numpy.ma.extras.corrcoef 31 3 9.677% []
numpy.lib.function_base.select 31 0 0.0% []
numpy.lib.function_base.gradient 113 0 0.0% []
numpy.lib.function_base.diff 37 0 0.0% []
numpy.lib.function_base.cov 69 0 0.0% []
numpy.lib.function_base._ureduce 33 0 0.0% []
numpy.lib.function_base._median 31 0 0.0% []
numpy.lib.function_base._quantile 34 0 0.0% []
numpy.lib.function_base.delete 89 0 0.0% []
numpy.lib.function_base.insert 67 0 0.0% []
numpy.lib.index_tricks.nd_grid.__getitem__ 55 2 3.636% []
numpy.lib.index_tricks.AxisConcatenator.__getitem__ 82 0 0.0% []
numpy.core.defchararray.array 40 0 0.0% []
numpy.core.memmap.memmap.__new__ 52 0 0.0% []
numpy.lib.nanfunctions.nanvar 34 0 0.0% []
numpy.lib.histograms._get_bin_edges 40 0 0.0% []
numpy.lib.histograms.histogram 54 0 0.0% []
numpy.lib.histograms.histogramdd 57 0 0.0% []
numpy.lib.arraypad._set_reflect_both 35 0 0.0% []
numpy.lib.arraypad.pad 74 0 0.0% []
numpy.polynomial.hermite_e.hermeint 34 0 0.0% []
numpy.polynomial.polyutils._fit 53 0 0.0% []
numpy.polynomial.polynomial.polyint 35 0 0.0% []
numpy.polynomial._polybase.ABCPolyBase._repr_latex_ 33 0 0.0% []
numpy.polynomial.laguerre.lagint 35 0 0.0% []
numpy.polynomial.legendre.legint 38 0 0.0% []
numpy.polynomial.hermite.hermint 34 0 0.0% []

Files and Directories in report

This section shows which files and directories are considered in this report. The main reason for showing this is fuzz introspector may include more code in the reasoning than is desired. This section helps identify if too many files/directories are included, e.g. third party code, which may be irrelevant for the threat model. In the event too much is included, fuzz introspector supports a configuration file that can exclude data from the report. See the following link for more information on how to create a config file: link

Files in report

Source file Reached by Covered by
[] []
difflib [] []
numpy.distutils.log [] []
numpy.compat._inspect [] []
numpy.distutils.command.build_clib [] []
numpy.core.umath [] []
numpy.core._add_newdocs [] []
numpy.core._ufunc_config [] []
numpy.distutils.fcompiler.absoft [] []
numpy.ctypeslib [] []
numpy.fft.helper [] []
numpy.polynomial.hermite_e [] []
numpy.distutils.misc_util [] []
types [] []
mypy [] []
contextlib [] []
numpy._typing.setup [] []
numpy.fft._pocketfft [] []
shutil [] []
itertools [] []
numpy.core.memmap [] []
numpy.distutils [] []
sys [] []
numpy.lib.arraysetops [] []
numpy.f2py.func2subr [] []
numpy.core.einsumfunc [] []
numpy.doc.constants [] []
numpy.distutils.fcompiler.pg [] []
numpy.distutils.command.config_compiler [] []
numpy.matlib [] []
numpy.distutils.fcompiler.intel [] []
numpy._typing._extended_precision [] []
textwrap [] []
pprint [] []
numpy.f2py.f90mod_rules [] []
numpy.random._examples.numba.extending_distributions [] []
genapi [] []
numpy.lib._datasource [] []
numpy.ma.extras [] []
numpy.distutils.system_info [] []
_generator [] []
numpy.distutils.command.build_ext [] []
numpy.ma [] []
numpy.compat._pep440 [] []
numpy._typing._array_like [] []
numpy.distutils.command.install_clib [] []
numpy.core.fromnumeric [] []
toml.encoder ['fuzz_dump'] []
numpy.ma.setup [] []
numpy.lib.nanfunctions [] []
dictgen.utils [] []
hypothesis [] []
numpy.core.cversions [] []
numpy.distutils.command.install_data [] []
tokenize [] []
numpy.distutils.fcompiler.fujitsu [] []
gc [] []
numpy.core.arrayprint [] []
numpy.distutils.from_template [] []
mtrand [] []
numpy [] []
numpy._typing._char_codes [] []
numpy.lib.index_tricks [] []
numpy._pyinstaller.pyinstaller-smoke [] []
numpy.lib.format [] []
numpy.lib.npyio [] []
numpy.lib.stride_tricks [] []
locale [] []
numpy.distutils.cpuinfo [] []
numpy.testing._private.parameterized [] []
numpy.distutils._shell_utils [] []
numpy.lib.scimath [] []
pytest [] []
numpy.distutils.command.install [] []
numpy.polynomial.polyutils [] []
numpy.linalg.setup [] []
numpy.distutils.fcompiler.environment [] []
numpy.core.numerictypes [] []
numpy.distutils.command.autodist [] []
numpy.core [] []
numpy.distutils.command [] []
numpy.distutils.fcompiler.gnu [] []
_dummy_thread [] []
numpy.ma.timer_comparison [] []
numpy.distutils.msvc9compiler [] []
numpy.core._asarray [] []
numpy.linalg.linalg [] []
numpy.array_api._typing [] []
operator [] []
numpy.testing.utils [] []
numpy.distutils.fcompiler [] []
numpy.distutils.npy_pkg_config [] []
numpy.distutils.fcompiler.g95 [] []
numpy.core.function_base [] []
numpy.core._type_aliases [] []
numpy._typing._generic_alias [] []
numpy.distutils.unixccompiler [] []
...fuzz_load ['fuzz_load'] []
numpy.testing._private [] []
numpy._typing._nbit [] []
optparse [] []
random [] []
numpy.array_api.setup [] []
threading [] []
numpy._typing._scalars [] []
numpy.lib.ufunclike [] []
setuptools [] []
numpy.testing._private.noseclasses [] []
numpy.core.multiarray [] []
numpy.array_api._sorting_functions [] []
numpy.array_api._creation_functions [] []
toml [] []
numpy.f2py.capi_maps [] []
configparser [] []
numpy.distutils.fcompiler.hpux [] []
numpy.f2py.diagnose [] []
numpy.lib._iotools [] []
inspect [] []
numpy.distutils.fcompiler.sun [] []
numpy._typing [] []
numpy.core.setup [] []
threadpoolctl [] []
numpy.f2py.__main__ [] []
numpy.polynomial.chebyshev [] []
numpy.doc [] []
psutil [] []
sysconfig [] []
json [] []
unittest [] []
numpy.distutils.extension [] []
numpy.ma.mrecords [] []
toml.decoder ['fuzz_load'] []
numpy.f2py.symbolic [] []
code_generators [] []
toml.tz ['fuzz_load'] []
copyreg [] []
pickle [] []
numpy.lib.utils [] []
numpy.polynomial.hermite [] []
numpy.core.defchararray [] []
pathlib [] []
numpy._pyinstaller.test_pyinstaller [] []
typing [] []
mmap [] []
numpy.distutils.ccompiler_opt [] []
numpy.core._internal [] []
numpy.distutils.command.build_src [] []
urllib [] []
numpy.distutils.fcompiler.none [] []
numpy.array_api._statistical_functions [] []
numpy.f2py.crackfortran [] []
numpy.lib.polynomial [] []
numpy.distutils.ccompiler [] []
hashlib [] []
numpy.distutils.fcompiler.compaq [] []
_pcg64 [] []
_multiarray_umath [] []
numpy.core.setup_common [] []
functools [] []
struct [] []
numbers [] []
re [] []
dictgen [] []
numpy.compat.py3k [] []
numpy.f2py.use_rules [] []
numpy.random._examples.cffi.extending [] []
numpy._pyinstaller.hook-numpy [] []
numpy._typing._add_docstring [] []
_mt19937 [] []
numpy.distutils.fcompiler.lahey [] []
numpy.random.setup [] []
numpy.distutils.line_endings [] []
distutils [] []
...fuzz_dump ['fuzz_dump'] []
numpy.distutils.pathccompiler [] []
numpy.distutils.fcompiler.ibm [] []
numpy.array_api._set_functions [] []
numpy.distutils.conv_template [] []
numpy.random._pickle [] []
numpy.__config__ [] []
numpy.f2py.common_rules [] []
weakref [] []
numpy.polynomial.laguerre [] []
numpy.core.numeric [] []
numpy.testing [] []
numpy.setup [] []
numpy.random._examples.cython.setup [] []
win32pdh [] []
ast [] []
numpy.distutils.mingw32ccompiler [] []
numpy.core._add_newdocs_scalars [] []
tempfile [] []
numpy.array_api._elementwise_functions [] []
numpy.distutils.fcompiler.nv [] []
numpy.distutils.__config__ [] []
numpy.core.records [] []
numpy._pyinstaller [] []
numpy.distutils.command.sdist [] []
numpy.version [] []
concurrent [] []
numpy.polynomial.setup [] []
zipfile [] []
timeit [] []
PyInstaller [] []
pydoc [] []
shlex [] []
dictgen.generate [] []
numpy.array_api [] []
numpy.core.umath_tests [] []
numpy.lib.recfunctions [] []
numpy.core.overrides [] []
numpy._version [] []
numpy.core._dtype_ctypes [] []
numpy._pytesttester [] []
curses [] []
io [] []
numpy.fft.setup [] []
numpy.distutils.command.build [] []
collections [] []
numpy.fft [] []
numpy.distutils.fcompiler.arm [] []
subprocess [] []
numpy.core.getlimits [] []
numpy_distutils [] []
numpy.ma.bench [] []
numpy.lib.user_array [] []
numpy.distutils.intelccompiler [] []
pickle5 [] []
datetime [] []
numpy.lib.function_base [] []
numpy.f2py.cb_rules [] []
toml.ordered ['fuzz_load', 'fuzz_dump'] []
numpy.distutils.exec_command [] []
numpy.lib._version [] []
numpy.polynomial.polynomial [] []
winreg [] []
numpy.f2py.__version__ [] []
numpy.distutils.fcompiler.nag [] []
numpy.distutils.fcompiler.pathf95 [] []
numpy.polynomial [] []
numpy.array_api._data_type_functions [] []
numpy.lib [] []
numpy.lib.arrayterator [] []
numpy.lib.twodim_base [] []
numpy.array_api._searching_functions [] []
numpy.array_api._utility_functions [] []
numpy.array_api._constants [] []
numpy.polynomial.legendre [] []
base64 [] []
numpy._typing._dtype_like [] []
numpy.doc.ufuncs [] []
numpy.lib.mixins [] []
numpy.random [] []
nose [] []
glob [] []
math [] []
numpy.distutils.command.install_headers [] []
numpy.compat [] []
warnings [] []
atheris [] []
numpy.core._methods [] []
numpy.testing._private.nosetester [] []
numpy.distutils.fcompiler.vast [] []
numpy.distutils.lib2def [] []
charset_normalizer [] []
cffi [] []
numpy.core._dtype [] []
numpy.f2py.rules [] []
contextvars [] []
numpy.polynomial._polybase [] []
traceback [] []
importlib [] []
numpy.linalg [] []
abc [] []
numpy.lib.type_check [] []
numpy.core._exceptions [] []
numpy.compat.setup [] []
numpy.distutils.numpy_distribution [] []
numpy.matrixlib [] []
numpy.random._examples.cffi.parse [] []
builtins [] []
numpy.testing.setup [] []
numpy.dual [] []
numpy.distutils.armccompiler [] []
atexit [] []
numpy._typing._shape [] []
numpy.conftest [] []
numpy._distributor_init [] []
numpy.testing._private.utils [] []
numpy.distutils.fcompiler.mips [] []
ctypes [] []
numpy._globals [] []
numpy.matrixlib.defmatrix [] []
numpy.array_api._manipulation_functions [] []
numpy.distutils.command.develop [] []
numpy.typing.mypy_plugin [] []
_thread [] []
numpy.ma.testutils [] []
time [] []
numpy.distutils.setup [] []
platform [] []
numpy.distutils.core [] []
numpy.testing.print_coercion_tables [] []
numpy.testing._private.extbuild [] []
doctest [] []
numpy.typing [] []
os [] []
multiprocessing [] []
copy [] []
_pocketfft_internal [] []
numpy.lib.setup [] []
numpy.distutils.command.build_py [] []
numpy.core.generate_numpy_api [] []
numpy.array_api.linalg [] []
numpy.matrixlib.setup [] []
numpy._typing._nested_sequence [] []
numpy.distutils.command.config [] []
pipes [] []
fileinput [] []
numpy.distutils.command.egg_info [] []
numpy.distutils.msvccompiler [] []
numpy.f2py.cfuncs [] []
numpy.core._string_helpers [] []
numba [] []
numpy.f2py.f2py2e [] []
numpy.array_api._dtypes [] []
numpy.f2py.setup [] []
numpy.ma.core [] []
numpy.typing.setup [] []
numpy.f2py.auxfuncs [] []
numpy.lib.shape_base [] []
numpy.distutils.command.build_scripts [] []
numpy.testing._private.decorators [] []
numpy.lib.arraypad [] []
Cython [] []
numpy.core.shape_base [] []
numpy.distutils.command.bdist_rpm [] []
numpy.f2py [] []
[] []
numpy.array_api._array_object [] []
numpy.core._machar [] []
numpy.random._examples.numba.extending [] []
numpy.lib.histograms [] []

Directories in report

Directory