diff --git a/src/fuzz.cpp b/src/fuzz.cpp index 35bdd71..f6fbbc8 100644 --- a/src/fuzz.cpp +++ b/src/fuzz.cpp @@ -9,12 +9,19 @@ std::pair runStreaming(std::string copy, SerializeState state; auto c = serializeCallbacks(); parser3::Parser3 parser(&c, &state); - for (int i = 0; i < copy.size(); i += stride) { - auto s = - parser.parse(copy.data() + i, std::min(stride, copy.size() - i)); + if (stride == 0) { + auto s = parser.parse(copy.data(), copy.size()); if (s != parser3::S_AGAIN) { return {state.result, s}; } + } else { + for (int i = 0; i < copy.size(); i += stride) { + auto s = + parser.parse(copy.data() + i, std::min(stride, copy.size() - i)); + if (s != parser3::S_AGAIN) { + return {state.result, s}; + } + } } auto s = parser.parse(nullptr, 0); if (s != parser3::S_OK) { @@ -105,7 +112,7 @@ void testStringRoundTrip(std::string_view s) { } for (int stride = 0; stride < 16; ++stride) { auto escaped = "\"" + escapeAsJsonString(s) + "\""; - auto parsed = toValue(std::move(escaped)); + auto parsed = toValue(escaped, stride); if (!parsed.has_value()) { abort(); } diff --git a/src/json_value.h b/src/json_value.h index 5677ade..237dfdd 100644 --- a/src/json_value.h +++ b/src/json_value.h @@ -192,7 +192,7 @@ inline std::string toString(JsonValue const &jsonValue) { __builtin_unreachable(); } -inline std::optional toValue(std::string copy, int stride = 0) { +inline std::optional toValue(std::string copy, int stride) { ReadValueState state; auto c = readValueCallbacks(); parser3::Parser3 parser(&c, &state); @@ -202,7 +202,8 @@ inline std::optional toValue(std::string copy, int stride = 0) { } } else { for (int i = 0; i < copy.size(); i += stride) { - if (parser.parse(copy.data(), std::min(stride, copy.size() - i)) != + if (parser.parse(copy.data() + i, + std::min(stride, copy.size() - i)) != parser3::S_AGAIN) { return std::nullopt; }