From 8edac3d83eac41e703cd07f54919f78d375a7cb7 Mon Sep 17 00:00:00 2001 From: Antoine Poinsot Date: Thu, 25 May 2023 17:24:45 +0200 Subject: [PATCH] fuzz: increase coverage of the descriptor targets Once a descriptor is successfully parsed, execute more of its methods. There is probably still room for improvements by checking for some invariants, but this is a low hanging fruit that significantly increases the code coverage of these targets. --- src/test/fuzz/descriptor_parse.cpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/test/fuzz/descriptor_parse.cpp b/src/test/fuzz/descriptor_parse.cpp index 4091e8667bce6..a5568d3528e41 100644 --- a/src/test/fuzz/descriptor_parse.cpp +++ b/src/test/fuzz/descriptor_parse.cpp @@ -107,11 +107,30 @@ class MockedDescriptorConverter { MockedDescriptorConverter MOCKED_DESC_CONVERTER; /** Test a successfully parsed descriptor. */ -static void TestDescriptor(const Descriptor& desc) +static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_provider, std::string& dummy) { - (void)desc.ToString(); + // Trivial helpers. (void)desc.IsRange(); (void)desc.IsSolvable(); + (void)desc.IsSingleType(); + (void)desc.GetOutputType(); + + // Serialization to string representation. + (void)desc.ToString(); + (void)desc.ToPrivateString(sig_provider, dummy); + (void)desc.ToNormalizedString(sig_provider, dummy); + + // Serialization to Script. + DescriptorCache cache; + std::vector out_scripts; + (void)desc.Expand(0, sig_provider, out_scripts, sig_provider, &cache); + (void)desc.ExpandPrivate(0, sig_provider, sig_provider); + (void)desc.ExpandFromCache(0, cache, out_scripts, sig_provider); + + // If we could serialize to script we must be able to infer using the same provider. + if (!out_scripts.empty()) { + assert(InferDescriptor(out_scripts.back(), sig_provider)); + } } void initialize_descriptor_parse() @@ -133,7 +152,7 @@ FUZZ_TARGET_INIT(mocked_descriptor_parse, initialize_mocked_descriptor_parse) FlatSigningProvider signing_provider; std::string error; const auto desc = Parse(*descriptor, signing_provider, error); - if (desc) TestDescriptor(*desc); + if (desc) TestDescriptor(*desc, signing_provider, error); } } @@ -144,6 +163,6 @@ FUZZ_TARGET_INIT(descriptor_parse, initialize_descriptor_parse) std::string error; for (const bool require_checksum : {true, false}) { const auto desc = Parse(descriptor, signing_provider, error, require_checksum); - if (desc) TestDescriptor(*desc); + if (desc) TestDescriptor(*desc, signing_provider, error); } }