diff --git a/c-cpp-example/src/advanced_examples/structured_input_checks_test.cpp b/c-cpp-example/src/advanced_examples/structured_input_checks_test.cpp new file mode 100644 index 0000000..c3b6136 --- /dev/null +++ b/c-cpp-example/src/advanced_examples/structured_input_checks_test.cpp @@ -0,0 +1,33 @@ +#include <cifuzz/cifuzz.h> +#include <fuzzer/FuzzedDataProvider.h> +#include "explore_me.h" +#include <gtest/gtest.h> + +TEST(ExploreStructuredInputChecks, DeveloperTest) { + InputStruct inputStruct = (InputStruct) {.a=0, .b= 10, .c="Developer"}; + EXPECT_NO_THROW(ExploreStructuredInputChecks(inputStruct)); +} + +TEST(ExploreStructuredInputChecks, MaintainerTest) { + InputStruct inputStruct = (InputStruct) {.a=20, .b= -10, .c="Maintainer"}; + EXPECT_NO_THROW(ExploreStructuredInputChecks(inputStruct)); +} + +FUZZ_TEST(const uint8_t *data, size_t size) { + FuzzedDataProvider fdp(data, size); + long a = fdp.ConsumeIntegral<long>(); + long b = fdp.ConsumeIntegral<long>(); + std::string c; + if (size > sizeof(InputStruct::c)) { // FIX: Check size against expected limit + c = fdp.ConsumeBytesAsString(sizeof(InputStruct::c) - 1); // FIX: Limit consumption to prevent overflow + } else { + c = fdp.ConsumeRemainingBytesAsString(); + } + + InputStruct inputStruct = (InputStruct) { + .a = a, + .b = b, + .c = c, + }; + ExploreStructuredInputChecks(inputStruct); +}