Skip to content

Commit 131314b

Browse files
committed
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.
1 parent 90a2474 commit 131314b

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

src/test/fuzz/descriptor_parse.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,30 @@ class MockedDescriptorConverter {
108108
MockedDescriptorConverter MOCKED_DESC_CONVERTER;
109109

110110
/** Test a successfully parsed descriptor. */
111-
static void TestDescriptor(const Descriptor& desc)
111+
static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_provider, std::string& dummy)
112112
{
113-
(void)desc.ToString();
113+
// Trivial helpers.
114114
(void)desc.IsRange();
115115
(void)desc.IsSolvable();
116+
(void)desc.IsSingleType();
117+
(void)desc.GetOutputType();
118+
119+
// Serialization to string representation.
120+
(void)desc.ToString();
121+
(void)desc.ToPrivateString(sig_provider, dummy);
122+
(void)desc.ToNormalizedString(sig_provider, dummy);
123+
124+
// Serialization to Script.
125+
DescriptorCache cache;
126+
std::vector<CScript> out_scripts;
127+
(void)desc.Expand(0, sig_provider, out_scripts, sig_provider, &cache);
128+
(void)desc.ExpandPrivate(0, sig_provider, sig_provider);
129+
(void)desc.ExpandFromCache(0, cache, out_scripts, sig_provider);
130+
131+
// If we could serialize to script we must be able to infer using the same provider.
132+
if (!out_scripts.empty()) {
133+
assert(InferDescriptor(out_scripts.back(), sig_provider));
134+
}
116135
}
117136

118137
void initialize_descriptor_parse()
@@ -134,7 +153,7 @@ FUZZ_TARGET(mocked_descriptor_parse, .init = initialize_mocked_descriptor_parse)
134153
FlatSigningProvider signing_provider;
135154
std::string error;
136155
const auto desc = Parse(*descriptor, signing_provider, error);
137-
if (desc) TestDescriptor(*desc);
156+
if (desc) TestDescriptor(*desc, signing_provider, error);
138157
}
139158
}
140159

@@ -145,6 +164,6 @@ FUZZ_TARGET(descriptor_parse, .init = initialize_descriptor_parse)
145164
std::string error;
146165
for (const bool require_checksum : {true, false}) {
147166
const auto desc = Parse(descriptor, signing_provider, error, require_checksum);
148-
if (desc) TestDescriptor(*desc);
167+
if (desc) TestDescriptor(*desc, signing_provider, error);
149168
}
150169
}

0 commit comments

Comments
 (0)