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

Fuzzer details

Fuzzer: parse_args_fuzzer

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 114 55.8%
gold [1:9] 0 0.0%
yellow [10:29] 4 1.96%
greenyellow [30:49] 0 0.0%
lawngreen 50+ 86 42.1%
All colors 204 100

Fuzz blockers

The followings are the branches where fuzzer fails to bypass.

Unique non-covered Complexity Unique Reachable Complexities Unique Reachable Functions All non-covered Complexity All Reachable Complexity Function Name Function Callsite Blocked Branch
68 201 55 :

['std::__1::vector >::~vector[abi:ne180100]()', 'args::EitherFlag::~EitherFlag()', 'std::__1::__wrap_iter , std::__1::allocator >*>::operator++[abi:ne180100]()', 'std::__1::basic_string , std::__1::allocator >::basic_string(std::__1::basic_string , std::__1::allocator > const&, unsigned long, unsigned long, std::__1::allocator const&)', 'std::__1::basic_string , std::__1::allocator >::size[abi:ne180100]() const', 'std::__1::basic_string , std::__1::allocator > std::__1::operator+[abi:ne180100] , std::__1::allocator >(std::__1::basic_string , std::__1::allocator >&&, std::__1::basic_string , std::__1::allocator > const&)', 'std::__1::basic_string , std::__1::allocator >::find[abi:ne180100](std::__1::basic_string , std::__1::allocator > const&, unsigned long) const', 'std::__1::__wrap_iter ::operator++[abi:ne180100]()', 'args::EitherFlag::EitherFlag(char)', '__cxa_throw', '__cxa_allocate_exception', 'bool std::__1::operator!=[abi:ne180100] (std::__1::__wrap_iter const&, std::__1::__wrap_iter const&)', 'args::Matcher::GetShortOrAny() const', 'std::__1::__wrap_iter ::operator*[abi:ne180100]() const', 'args::ArgumentParser::ParseOption(std::__1::basic_string , std::__1::allocator > const&, bool)', 'bool std::__1::operator!=[abi:ne180100] , std::__1::allocator >*>(std::__1::__wrap_iter , std::__1::allocator >*> const&, std::__1::__wrap_iter , std::__1::allocator >*> const&)', 'std::__1::basic_string , std::__1::allocator > std::__1::operator+[abi:ne180100] , std::__1::allocator >(std::__1::basic_string , std::__1::allocator > const&, char)', 'args::EitherFlag::EitherFlag(std::__1::basic_string , std::__1::allocator > const&)', 'std::__1::__wrap_iter ::operator++[abi:ne180100]()', 'std::__1::vector >::end[abi:ne180100]()', 'std::__1::__wrap_iter ::operator++[abi:ne180100]()', 'std::__1::vector >::~vector[abi:ne180100]()', 'std::__1::vector >::begin[abi:ne180100]()', 'std::__1::basic_string , std::__1::allocator >::substr[abi:ne180100](unsigned long, unsigned long) const', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::end[abi:ne180100]()', 'bool std::__1::operator!=[abi:ne180100] (std::__1::__wrap_iter const&, std::__1::__wrap_iter const&)', 'std::__1::__wrap_iter ::operator*[abi:ne180100]() const', 'args::FlagBase::GetMatcher() const', 'args::operator&(args::Options, args::Options)', 'args::Matcher::GetFlagStrings() const', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::empty[abi:ne180100]() const', 'std::__1::basic_string , std::__1::allocator >::at(unsigned long) const', 'std::__1::basic_string , std::__1::allocator >::empty[abi:ne180100]() const', 'args::EitherFlag::str(std::__1::basic_string , std::__1::allocator > const&, std::__1::basic_string , std::__1::allocator > const&) const', 'args::CompletionFlag::Get()', 'std::__1::vector >::begin[abi:ne180100]()', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::~vector[abi:ne180100]()', 'bool std::__1::operator!=[abi:ne180100] (std::__1::__wrap_iter const&, std::__1::__wrap_iter const&)', 'std::__1::vector >::~vector[abi:ne180100]()', 'args::Command::Name() const', 'args::NamedBase::HelpChoices(args::HelpParams const&) const', 'std::__1::vector >::begin[abi:ne180100]()', 'args::ArgumentParser::AddCompletionReply(std::__1::basic_string , std::__1::allocator > const&, std::__1::basic_string , std::__1::allocator > const&)', 'std::__1::vector >::end[abi:ne180100]()', 'std::__1::vector >::empty[abi:ne180100]() const', 'std::__1::vector >::end[abi:ne180100]()', 'std::__1::basic_string , std::__1::allocator >::~basic_string()', 'std::__1::__wrap_iter , std::__1::allocator >*>::operator*[abi:ne180100]() const', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::begin[abi:ne180100]()', 'std::__1::__wrap_iter ::operator*[abi:ne180100]() const', 'std::__1::basic_string , std::__1::allocator > std::__1::operator+[abi:ne180100] , std::__1::allocator >(std::__1::basic_string , std::__1::allocator > const&, std::__1::basic_string , std::__1::allocator > const&)', 'std::__1::allocator ::allocator[abi:ne180100]()', 'args::Base::GetOptions() const', '__cxa_free_exception', 'args::Completion::Completion(std::__1::basic_string , std::__1::allocator > const&)']

68 201 boolargs::ArgumentParser::Complete ,std::__1::allocator >*>>(std::__1::__wrap_iter ,std::__1::allocator >*>,std::__1::__wrap_iter ,std::__1::allocator >*>) call site: 00000 /src/args/args.hxx:2553
60 834 47 :

['bool std::__1::operator==[abi:ne180100] (std::__1::__wrap_iter const&, std::__1::__wrap_iter const&)', 'std::__1::__wrap_iter , std::__1::allocator >*>::operator++[abi:ne180100]()', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::erase[abi:ne180100](std::__1::__wrap_iter , std::__1::allocator > const*>)', 'std::__1::vector >::operator=[abi:ne180100](std::__1::vector >&&)', 'args::UsageError::UsageError(std::__1::basic_string , std::__1::allocator > const&)', 'args::Command::GetCoroutine()', 'bool args::ArgumentParser::ParseLong , std::__1::allocator >*> >(std::__1::__wrap_iter , std::__1::allocator >*>&, std::__1::__wrap_iter , std::__1::allocator >*>)', 'bool args::ArgumentParser::ParseShort , std::__1::allocator >*> >(std::__1::__wrap_iter , std::__1::allocator >*>&, std::__1::__wrap_iter , std::__1::allocator >*>)', 'bool std::__1::operator!=[abi:ne180100] , std::__1::allocator >*>(std::__1::__wrap_iter , std::__1::allocator >*> const&, std::__1::__wrap_iter , std::__1::allocator >*> const&)', 'args::ArgumentParser::ParseOption(std::__1::basic_string , std::__1::allocator > const&, bool)', 'args::Command::RaiiSubparser::Parser()', 'args::Completion::Completion(std::__1::basic_string , std::__1::allocator > const&)', '__cxa_rethrow', 'std::__1::__wrap_iter , std::__1::allocator >*>::operator+[abi:ne180100](long) const', 'std::__1::function ::operator bool[abi:ne180100]() const', 'args::Command::SelectCommand(args::Command*)', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::end[abi:ne180100]()', '__clang_call_terminate', '_ZNSt3__111__wrap_iterIPKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEC2B8ne180100IPS6_TnNS_9enable_ifIXsr14is_convertibleIT_S8_EE5valueEiE4typeELi0EEERKNS0_ISD_EE', 'bool args::ArgumentParser::Complete , std::__1::allocator >*> >(std::__1::__wrap_iter , std::__1::allocator >*>, std::__1::__wrap_iter , std::__1::allocator >*>)', 'args::Command::RaiiSubparser::RaiiSubparser(args::ArgumentParser&, std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >)', 'std::__1::__wrap_iter ::operator*[abi:ne180100]() const', 'std::__1::__wrap_iter , std::__1::allocator >*> args::ArgumentParser::Parse , std::__1::allocator >*> >(std::__1::__wrap_iter , std::__1::allocator >*>, std::__1::__wrap_iter , std::__1::allocator >*>)', 'bool std::__1::operator==[abi:ne180100] , std::__1::allocator >(std::__1::basic_string , std::__1::allocator > const&, char const*)', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::operator[][abi:ne180100](unsigned long)', 'std::__1::basic_string , std::__1::allocator >::operator+=[abi:ne180100](std::__1::basic_string , std::__1::allocator > const&)', 'args::Command::RaiiSubparser::~RaiiSubparser()', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::resize(unsigned long)', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::erase(std::__1::__wrap_iter , std::__1::allocator > const*>, std::__1::__wrap_iter , std::__1::allocator > const*>)', 'args::Subparser::IsParsed() const', 'args::Base::KickOut() const', 'std::__1::basic_string , std::__1::allocator >::operator+=[abi:ne180100](char const*)', '__cxa_begin_catch', 'std::__1::iterator_traits , std::__1::allocator >*> >::difference_type std::__1::distance[abi:ne180100] , std::__1::allocator >*> >(std::__1::__wrap_iter , std::__1::allocator >*>, std::__1::__wrap_iter , std::__1::allocator >*>)', '_ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC2INS_11__wrap_iterIPS6_EETnNS_9enable_ifIXaasr31__has_forward_iterator_categoryIT_EE5valuesr16is_constructibleIS6_NS_15iterator_traitsISE_E9referenceEEE5valueEiE4typeELi0EEESE_SE_', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::size[abi:ne180100]() const', 'std::__1::vector >::begin[abi:ne180100]()', '_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B8ne180100ILi0EEEPKc', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::~vector[abi:ne180100]()', 'std::__1::function ::operator()(args::Subparser&) const', 'std::__1::vector >::empty[abi:ne180100]() const', 'std::__1::vector >::end[abi:ne180100]()', 'bool std::__1::operator==[abi:ne180100] >(std::__1::basic_string , std::__1::allocator > const&, std::__1::basic_string , std::__1::allocator > const&)', 'std::__1::__wrap_iter , std::__1::allocator >*>::operator*[abi:ne180100]() const', 'std::__1::vector , std::__1::allocator >, std::__1::allocator , std::__1::allocator > > >::begin[abi:ne180100]()', 'std::__1::__wrap_iter std::__1::find_if[abi:ne180100] , args::ArgumentParser::Parse , std::__1::allocator >*> >(std::__1::__wrap_iter , std::__1::allocator >*>, std::__1::__wrap_iter , std::__1::allocator >*>)::{lambda(args::Command*)#1}>(std::__1::__wrap_iter , std::__1::__wrap_iter , args::ArgumentParser::Parse , std::__1::allocator >*> >(std::__1::__wrap_iter , std::__1::allocator >*>, std::__1::__wrap_iter , std::__1::allocator >*>)::{lambda(args::Command*)#1})', '__cxa_end_catch']

96 882 std::__1::__wrap_iter ,std::__1::allocator >*>args::ArgumentParser::Parse ,std::__1::allocator >*>>(std::__1::__wrap_iter ,std::__1::allocator >*>,std::__1::__wrap_iter ,std::__1::allocator >*>) call site: 00000 /src/args/args.hxx:2739
26 26 1 :

['args::Command::Validate(std::__1::basic_string , std::__1::allocator > const&, std::__1::basic_string , std::__1::allocator > const&) const::{lambda()#1}::operator()() const']

32 42 args::Command::Validate(std::__1::basic_string ,std::__1::allocator >const&,std::__1::basic_string ,std::__1::allocator >const&)const call site: 00000 /src/args/args.hxx:2208
9 17 11 :

['args::EitherFlag::str() const', 'std::__1::basic_ostringstream , std::__1::allocator >::basic_ostringstream[abi:ne180100]()', '__cxa_throw', 'std::__1::basic_ostream >& std::__1::operator<<[abi:ne180100] , std::__1::allocator >(std::__1::basic_ostream >&, std::__1::basic_string , std::__1::allocator > const&)', 'std::__1::basic_ostringstream , std::__1::allocator >::str[abi:ne180100]() const', 'std::__1::basic_ostringstream , std::__1::allocator >::~basic_ostringstream()', 'std::__1::basic_string , std::__1::allocator >::~basic_string()', '__cxa_allocate_exception', '__cxa_free_exception', 'std::__1::basic_ostream >& std::__1::operator<<[abi:ne180100] >(std::__1::basic_ostream >&, char const*)', 'args::ExtraError::ExtraError(std::__1::basic_string , std::__1::allocator > const&)']

9 17 args::FlagBase::Match(args::EitherFlagconst&) call site: 00000 /src/args/args.hxx:1124
6 12 4 :

['__cxa_allocate_exception', 'args::UsageError::UsageError(std::__1::basic_string , std::__1::allocator > const&)', '__cxa_free_exception', '__cxa_throw']

6 12 args::ArgumentParser::LongSeparator(std::__1::basic_string ,std::__1::allocator >const&) call site: 00000 /src/args/args.hxx:2889
0 6 8 :

['std::__1::__wrap_iter ::operator*[abi:ne180100]() const', 'std::__1::vector >::end[abi:ne180100]() const', 'args::Group::Children() const', 'std::__1::__wrap_iter ::operator++[abi:ne180100]()', 'bool std::__1::operator!=[abi:ne180100] (std::__1::__wrap_iter const&, std::__1::__wrap_iter const&)', 'args::Base::GetOptions() const', 'args::operator&(args::Options, args::Options)', 'std::__1::vector >::begin[abi:ne180100]() const']

0 6 args::Command::Match(args::EitherFlagconst&) call site: 00000 /src/args/args.hxx:1905
0 6 8 :

['std::__1::__wrap_iter ::operator*[abi:ne180100]() const', 'std::__1::vector >::end[abi:ne180100]() const', 'args::Group::Children() const', 'std::__1::__wrap_iter ::operator++[abi:ne180100]()', 'bool std::__1::operator!=[abi:ne180100] (std::__1::__wrap_iter const&, std::__1::__wrap_iter const&)', 'args::Base::GetOptions() const', 'args::operator&(args::Options, args::Options)', 'std::__1::vector >::begin[abi:ne180100]() const']

0 6 args::Command::GetNextPositional() call site: 00000 /src/args/args.hxx:1969
0 0 None 96 882 std::__1::__wrap_iter ,std::__1::allocator >*>args::ArgumentParser::Parse ,std::__1::allocator >*>>(std::__1::__wrap_iter ,std::__1::allocator >*>,std::__1::__wrap_iter ,std::__1::allocator >*>) call site: 00000 /src/args/args.hxx:2681
0 0 None 96 882 std::__1::__wrap_iter ,std::__1::allocator >*>args::ArgumentParser::Parse ,std::__1::allocator >*>>(std::__1::__wrap_iter ,std::__1::allocator >*>,std::__1::__wrap_iter ,std::__1::allocator >*>) call site: 00000 /src/args/args.hxx:2687
0 0 None 58 70 args::Command::Validate(std::__1::basic_string ,std::__1::allocator >const&,std::__1::basic_string ,std::__1::allocator >const&)const call site: 00000 /src/args/args.hxx:2181
0 0 None 58 68 args::Command::Validate(std::__1::basic_string ,std::__1::allocator >const&,std::__1::basic_string ,std::__1::allocator >const&)const call site: 00000 /src/args/args.hxx:2200
0 0 None 16 100 boolargs::ArgumentParser::ParseShort ,std::__1::allocator >*>>(std::__1::__wrap_iter ,std::__1::allocator >*>&,std::__1::__wrap_iter ,std::__1::allocator >*>) call site: 00000 /src/args/args.hxx:2490

Runtime coverage analysis

Covered functions
76
Functions that are reachable but not covered
59
Reachable functions
152
Percentage of reachable functions covered
61.18%
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
/src/args/fuzz/parse_args_fuzzer.cpp 1
/src/args/args.hxx 72

Fuzz engine guidance

This sections provides heuristics that can be used as input to a fuzz engine when running a given fuzz target. The current focus is on providing input that is usable by libFuzzer.

/src/args/fuzz/parse_args_fuzzer.cpp

Dictionary

Use this with the libFuzzer -dict=DICT.file flag


Fuzzer function priority

Use one of these functions as input to libfuzzer with flag: -focus_function name

-focus_function=['std::__1::__wrap_iter, std::__1::allocator >*> args::ArgumentParser::Parse, std::__1::allocator >*> >(std::__1::__wrap_iter, std::__1::allocator >*>, std::__1::__wrap_iter, std::__1::allocator >*>)', 'bool args::ArgumentParser::ParseShort, std::__1::allocator >*> >(std::__1::__wrap_iter, std::__1::allocator >*>&, std::__1::__wrap_iter, std::__1::allocator >*>)', 'std::__1::__wrap_iter, std::__1::allocator >*> args::ArgumentParser::Parse, std::__1::allocator >*> >(std::__1::__wrap_iter, std::__1::allocator >*>, std::__1::__wrap_iter, std::__1::allocator >*>)', 'std::__1::basic_string, std::__1::allocator > args::ArgumentParser::ParseArgsValues, std::__1::allocator >*> >(args::FlagBase&, std::__1::basic_string, std::__1::allocator > const&, std::__1::__wrap_iter, std::__1::allocator >*>&, std::__1::__wrap_iter, std::__1::allocator >*>, bool, bool, bool, std::__1::basic_string, std::__1::allocator > const&, bool, std::__1::vector, std::__1::allocator >, std::__1::allocator, std::__1::allocator > > >&)', 'args::Matcher::Matcher, std::__1::equal_to, std::__1::allocator >, std::__1::unordered_set, std::__1::allocator >, std::__1::hash, std::__1::allocator > >, std::__1::equal_to, std::__1::allocator > >, std::__1::allocator, std::__1::allocator > > > >(std::__1::unordered_set, std::__1::equal_to, std::__1::allocator >&&, std::__1::unordered_set, std::__1::allocator >, std::__1::hash, std::__1::allocator > >, std::__1::equal_to, std::__1::allocator > >, std::__1::allocator, std::__1::allocator > > >&&)', 'bool args::ArgumentParser::ParseShort, std::__1::allocator >*> >(std::__1::__wrap_iter, std::__1::allocator >*>&, std::__1::__wrap_iter, std::__1::allocator >*>)', 'args::ArgumentParser::ArgumentParser(std::__1::basic_string, std::__1::allocator > const&, std::__1::basic_string, std::__1::allocator > const&)', 'args::Error::Error(std::__1::basic_string, std::__1::allocator > const&)', 'LLVMFuzzerTestOneInput']