@@ -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