Skip to content
Permalink
Browse files
add fuzzer for columns
  • Loading branch information
pauldreik authored and horenmar committed Oct 7, 2020
1 parent 0098a76 commit 2454cfffb7eda9d0952b6b1b0f827c7cad232dd5
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 3 deletions.
@@ -7,11 +7,14 @@
add_library(fuzzhelper NullOStream.h NullOStream.cpp)
target_link_libraries(fuzzhelper PUBLIC Catch2::Catch2)

# use C++17 so we can get string_view
target_compile_features(fuzzhelper PUBLIC cxx_std_17)

# This should be possible to set from the outside to be oss-fuzz compatible,
# fix later. For now, target libFuzzer only.
target_link_options(fuzzhelper PUBLIC "-fsanitize=fuzzer")

foreach(fuzzer TestSpecParser XmlWriter)
foreach(fuzzer TestSpecParser XmlWriter textflow)
add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp)
target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper)
endforeach()
@@ -1,6 +1,7 @@
#pragma once

#include <iostream>
#include <ostream>
#include <streambuf>

// from https://stackoverflow.com/a/8244052
class NullStreambuf : public std::streambuf {
@@ -17,4 +18,3 @@ class NullOStream final : private NullStreambuf, public std::ostream {
virtual void avoidOutOfLineVirtualCompilerWarning();
};


@@ -0,0 +1,47 @@
//License: Boost 1.0
//By Paul Dreik 2020

#include <catch2/internal/catch_textflow.hpp>

#include "NullOStream.h"

#include <string>
#include <string_view>


template<class Callback>
void split(const char *Data, size_t Size, Callback callback) {

using namespace std::literals;
constexpr auto sep="\n~~~\n"sv;

std::string_view remainder(Data,Size);
for (;;) {
auto pos=remainder.find(sep);
if(pos==std::string_view::npos) {
//not found. use the remainder and exit
callback(remainder);
return;
} else {
//found. invoke callback on the first part, then proceed with the rest.
callback(remainder.substr(0,pos));
remainder=remainder.substr(pos+sep.size());
}
}
}

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {

Catch::TextFlow::Columns columns;

// break the input on separator
split((const char*)Data,Size,[&](std::string_view word) {
columns+=Catch::TextFlow::Column(std::string(word));
});

NullOStream nul;
nul << columns;

return 0;
}

0 comments on commit 2454cff

Please sign in to comment.