| /* |
| __ _____ _____ _____ |
| __| | __| | | | JSON for Modern C++ (fuzz test support) |
| | | |__ | | | | | | version 3.9.1 |
| |_____|_____|_____|_|___| https://github.com/nlohmann/json |
| |
| 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. |
| |
| Licensed under the MIT License <http://opensource.org/licenses/MIT>. |
| */ |
| |
| #include <iostream> |
| #include <sstream> |
| #include <nlohmann/json.hpp> |
| |
| 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 j1 = json::parse(data, data + size); |
| |
| try |
| { |
| // step 2: round trip |
| |
| // first serialization |
| std::string s1 = j1.dump(); |
| |
| // parse serialization |
| json j2 = json::parse(s1); |
| |
| // second serialization |
| std::string 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; |
| } |