• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //     __ _____ _____ _____
2 //  __|  |   __|     |   | |  JSON for Modern C++ (supporting code)
3 // |  |  |__   |  |  | | | |  version 3.11.3
4 // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5 //
6 // SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
7 // SPDX-License-Identifier: MIT
8 
9 /*
10 This file implements a parser test suitable for fuzz testing. Given a byte
11 array data, it performs the following steps:
12 
13 - j1 = parse(data)
14 - s1 = serialize(j1)
15 - j2 = parse(s1)
16 - s2 = serialize(j2)
17 - assert(s1 == s2)
18 
19 The provided function `LLVMFuzzerTestOneInput` can be used in different fuzzer
20 drivers.
21 */
22 
23 #include <iostream>
24 #include <sstream>
25 #include <nlohmann/json.hpp>
26 
27 using json = nlohmann::json;
28 
29 // see http://llvm.org/docs/LibFuzzer.html
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)30 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
31 {
32     try
33     {
34         // step 1: parse input
35         json const j1 = json::parse(data, data + size);
36 
37         try
38         {
39             // step 2: round trip
40 
41             // first serialization
42             std::string const s1 = j1.dump();
43 
44             // parse serialization
45             json const j2 = json::parse(s1);
46 
47             // second serialization
48             std::string const s2 = j2.dump();
49 
50             // serializations must match
51             assert(s1 == s2);
52         }
53         catch (const json::parse_error&)
54         {
55             // parsing a JSON serialization must not fail
56             assert(false);
57         }
58     }
59     catch (const json::parse_error&)
60     {
61         // parse errors are ok, because input may be random bytes
62     }
63     catch (const json::out_of_range&)
64     {
65         // out of range errors may happen if provided sizes are excessive
66     }
67 
68     // return 0 - non-zero return values are reserved for future use
69     return 0;
70 }
71