simdjson/fuzz/fuzz_atpointer.cpp

69 lines
1.8 KiB
C++

#include "simdjson.h"
#include "FuzzUtils.h"
#include <cstddef>
#include <cstdint>
#include <string>
#include <string_view>
struct FuzzData {
std::string_view json_pointer;
std::string_view json_doc;
};
/**
* @brief split split fuzz data into a pointer and a document
* @param Data
* @param Size
* @return
*/
FuzzData split(const char *Data, size_t Size) {
using namespace std::literals;
constexpr auto sep="\n~~~\n"sv;
std::string_view all(Data,Size);
auto pos=all.find(sep);
if(pos==std::string_view::npos) {
//not found.
return FuzzData{std::string_view{},all};
} else {
return FuzzData{std::string_view{all.substr(0,pos)},all.substr(pos+sep.size())};
}
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
// Split data into two strings, json pointer and the document string.
// Might end up with none, either or both being empty, important for
// covering edge cases such as https://github.com/simdjson/simdjson/issues/1142
// Inputs missing the separator line will get an empty json pointer
// but the all the input put in the document string. This means
// test data from other fuzzers that take json input works for this fuzzer
// as well.
const auto fd=split(as_chars(Data),Size);
simdjson::dom::parser parser;
// parse without exceptions, for speed
auto res=parser.parse(fd.json_doc.data(),fd.json_doc.size());
if(res.error())
return 0;
simdjson::dom::element root;
if(res.get(root))
return 0;
auto maybe_leaf=root.at_pointer(fd.json_pointer);
if(maybe_leaf.error())
return 0;
simdjson::dom::element leaf;
if(maybe_leaf.get(leaf))
return 0;
std::string_view sv;
if(leaf.get_string().get(sv))
return 0;
return 0;
}