Add detail::exception_id, a scoped enum with one named enumerator per documented exception id, and use it for every id in the library. The create() functions get an overload for it; the int overloads stay for user code. Following the review of #5783: add binary_reader::invalid_byte() and length_type_error(), basic_json::throw_subscript_wrong_type(), move the fuzzer includes and the using-declaration into fuzzer_common.hpp, and rename test_sax.hpp to sax_event_loggers.hpp. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
// __ _____ _____ _____
|
|
// __| | __| | | | JSON for Modern C++ (supporting code)
|
|
// | | |__ | | | | | | version 3.12.0
|
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
//
|
|
// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
// code shared by the fuzzer drivers tests/src/fuzzer-parse_*.cpp
|
|
|
|
#pragma once
|
|
|
|
#include <cassert> // assert
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using nlohmann::json; // NOLINT(google-global-names-in-headers): shared by all fuzzer drivers
|
|
|
|
// the round-trip checks of the drivers are assertions; NDEBUG would compile them away
|
|
#ifdef NDEBUG
|
|
#error "the fuzzer drivers must be built without NDEBUG"
|
|
#endif
|
|
|
|
// compares dumps rather than values, because NaN != NaN; keep writes strings
|
|
// byte for byte, so ill-formed UTF-8 that a binary reader accepts cannot throw
|
|
inline bool same_value(const json& lhs, const json& rhs)
|
|
{
|
|
return lhs.dump(-1, ' ', false, json::error_handler_t::keep) == rhs.dump(-1, ' ', false, json::error_handler_t::keep);
|
|
}
|
|
|
|
// step 0 of each driver: parse the input without exceptions; a parse error
|
|
// must then be reported as a discarded value, never thrown. Type and
|
|
// out-of-range errors are not parse errors and still throw; then @a threw is
|
|
// set and null is returned.
|
|
template<typename Parse>
|
|
json parse_without_exceptions(Parse parse, bool& threw)
|
|
{
|
|
threw = false;
|
|
try
|
|
{
|
|
return parse();
|
|
}
|
|
catch (const json::parse_error&)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (const json::exception&)
|
|
{
|
|
threw = true;
|
|
}
|
|
return {};
|
|
}
|