/* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ (fuzz test support) | | |__ | | | | | | version 3.7.3 |_____|_____|_____|_|___| 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 . */ #include #include #include #include #include #include #include using json = nlohmann::json; // see http://llvm.org/docs/LibFuzzer.html extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { std::vector vec(data, data+size); std::deque deq(data, data+size); std::list lst(data, data+size); std::forward_list flist(data, data+size); std::set st(data, data+size); std::unordered_set ust(data, data+size); std::multiset mst(data, data+size); std::unordered_multiset umst(data, data+size); json j_vector(vec); json j_deque(deq); json j_list(lst); json j_flist(flist); json j_set(st); json j_uset(ust); json j_mset(mst); json j_umset(umst); assert(j_vector == j_deque); assert(j_vector == j_list); assert(j_vector == j_flist); // 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; }