Skip to content

Commit e507c07

Browse files
tests: Add serialization/deserialization fuzzing helpers WriteToStream(…)/ReadFromStream(…)
1 parent e48094a commit e507c07

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

src/test/fuzz/util.h

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,4 +404,70 @@ NODISCARD inline FuzzedAutoFileProvider ConsumeAutoFile(FuzzedDataProvider& fuzz
404404
return {fuzzed_data_provider};
405405
}
406406

407+
#define WRITE_TO_STREAM_CASE(id, type, consume) \
408+
case id: { \
409+
type o = consume; \
410+
stream << o; \
411+
break; \
412+
}
413+
template <typename Stream>
414+
void WriteToStream(FuzzedDataProvider& fuzzed_data_provider, Stream& stream) noexcept
415+
{
416+
while (fuzzed_data_provider.ConsumeBool()) {
417+
try {
418+
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 13)) {
419+
WRITE_TO_STREAM_CASE(0, bool, fuzzed_data_provider.ConsumeBool())
420+
WRITE_TO_STREAM_CASE(1, char, fuzzed_data_provider.ConsumeIntegral<char>())
421+
WRITE_TO_STREAM_CASE(2, int8_t, fuzzed_data_provider.ConsumeIntegral<int8_t>())
422+
WRITE_TO_STREAM_CASE(3, uint8_t, fuzzed_data_provider.ConsumeIntegral<uint8_t>())
423+
WRITE_TO_STREAM_CASE(4, int16_t, fuzzed_data_provider.ConsumeIntegral<int16_t>())
424+
WRITE_TO_STREAM_CASE(5, uint16_t, fuzzed_data_provider.ConsumeIntegral<uint16_t>())
425+
WRITE_TO_STREAM_CASE(6, int32_t, fuzzed_data_provider.ConsumeIntegral<int32_t>())
426+
WRITE_TO_STREAM_CASE(7, uint32_t, fuzzed_data_provider.ConsumeIntegral<uint32_t>())
427+
WRITE_TO_STREAM_CASE(8, int64_t, fuzzed_data_provider.ConsumeIntegral<int64_t>())
428+
WRITE_TO_STREAM_CASE(9, uint64_t, fuzzed_data_provider.ConsumeIntegral<uint64_t>())
429+
WRITE_TO_STREAM_CASE(10, float, fuzzed_data_provider.ConsumeFloatingPoint<float>())
430+
WRITE_TO_STREAM_CASE(11, double, fuzzed_data_provider.ConsumeFloatingPoint<double>())
431+
WRITE_TO_STREAM_CASE(12, std::string, fuzzed_data_provider.ConsumeRandomLengthString(32))
432+
WRITE_TO_STREAM_CASE(13, std::vector<char>, ConsumeRandomLengthIntegralVector<char>(fuzzed_data_provider))
433+
}
434+
} catch (const std::ios_base::failure&) {
435+
break;
436+
}
437+
}
438+
}
439+
440+
#define READ_FROM_STREAM_CASE(id, type) \
441+
case id: { \
442+
type o; \
443+
stream >> o; \
444+
break; \
445+
}
446+
template <typename Stream>
447+
void ReadFromStream(FuzzedDataProvider& fuzzed_data_provider, Stream& stream) noexcept
448+
{
449+
while (fuzzed_data_provider.ConsumeBool()) {
450+
try {
451+
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 13)) {
452+
READ_FROM_STREAM_CASE(0, bool)
453+
READ_FROM_STREAM_CASE(1, char)
454+
READ_FROM_STREAM_CASE(2, int8_t)
455+
READ_FROM_STREAM_CASE(3, uint8_t)
456+
READ_FROM_STREAM_CASE(4, int16_t)
457+
READ_FROM_STREAM_CASE(5, uint16_t)
458+
READ_FROM_STREAM_CASE(6, int32_t)
459+
READ_FROM_STREAM_CASE(7, uint32_t)
460+
READ_FROM_STREAM_CASE(8, int64_t)
461+
READ_FROM_STREAM_CASE(9, uint64_t)
462+
READ_FROM_STREAM_CASE(10, float)
463+
READ_FROM_STREAM_CASE(11, double)
464+
READ_FROM_STREAM_CASE(12, std::string)
465+
READ_FROM_STREAM_CASE(13, std::vector<char>)
466+
}
467+
} catch (const std::ios_base::failure&) {
468+
break;
469+
}
470+
}
471+
}
472+
407473
#endif // BITCOIN_TEST_FUZZ_UTIL_H

0 commit comments

Comments
 (0)