| // __ _____ _____ _____ | |
| // __| | __| | | | JSON for Modern C++ (supporting code) | |
| // | | |__ | | | | | | version 3.11.3 | |
| // |_____|_____|_____|_|___| https://github.com/nlohmann/json | |
| // | |
| // SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> | |
| // SPDX-License-Identifier: MIT | |
| /* | |
| This file implements a parser test suitable for fuzz testing. Given a byte | |
| array data, it performs the following steps: | |
| - j1 = parse(data) | |
| - s1 = serialize(j1) | |
| - j2 = parse(s1) | |
| - s2 = serialize(j2) | |
| - assert(s1 == s2) | |
| The provided function `LLVMFuzzerTestOneInput` can be used in different fuzzer | |
| drivers. | |
| */ | |
| using json = nlohmann::json; | |
| // see http://llvm.org/docs/LibFuzzer.html | |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) | |
| { | |
| try | |
| { | |
| // step 1: parse input | |
| json const j1 = json::parse(data, data + size); | |
| try | |
| { | |
| // step 2: round trip | |
| // first serialization | |
| std::string const s1 = j1.dump(); | |
| // parse serialization | |
| json const j2 = json::parse(s1); | |
| // second serialization | |
| std::string const s2 = j2.dump(); | |
| // serializations must match | |
| assert(s1 == s2); | |
| } | |
| catch (const json::parse_error&) | |
| { | |
| // parsing a JSON serialization must not fail | |
| assert(false); | |
| } | |
| } | |
| catch (const json::parse_error&) | |
| { | |
| // parse errors are ok, because input may be random bytes | |
| } | |
| catch (const json::out_of_range&) | |
| { | |
| // out of range errors may happen if provided sizes are excessive | |
| } | |
| // return 0 - non-zero return values are reserved for future use | |
| return 0; | |
| } | |