mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-22 13:26:10 +01:00
add fuzzer for columns
This commit is contained in:
parent
0098a76fef
commit
2454cfffb7
@ -7,11 +7,14 @@
|
|||||||
add_library(fuzzhelper NullOStream.h NullOStream.cpp)
|
add_library(fuzzhelper NullOStream.h NullOStream.cpp)
|
||||||
target_link_libraries(fuzzhelper PUBLIC Catch2::Catch2)
|
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,
|
# This should be possible to set from the outside to be oss-fuzz compatible,
|
||||||
# fix later. For now, target libFuzzer only.
|
# fix later. For now, target libFuzzer only.
|
||||||
target_link_options(fuzzhelper PUBLIC "-fsanitize=fuzzer")
|
target_link_options(fuzzhelper PUBLIC "-fsanitize=fuzzer")
|
||||||
|
|
||||||
foreach(fuzzer TestSpecParser XmlWriter)
|
foreach(fuzzer TestSpecParser XmlWriter textflow)
|
||||||
add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp)
|
add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp)
|
||||||
target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper)
|
target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <iostream>
|
#include <ostream>
|
||||||
|
#include <streambuf>
|
||||||
|
|
||||||
// from https://stackoverflow.com/a/8244052
|
// from https://stackoverflow.com/a/8244052
|
||||||
class NullStreambuf : public std::streambuf {
|
class NullStreambuf : public std::streambuf {
|
||||||
@ -17,4 +18,3 @@ public:
|
|||||||
virtual void avoidOutOfLineVirtualCompilerWarning();
|
virtual void avoidOutOfLineVirtualCompilerWarning();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
47
fuzzing/fuzz_textflow.cpp
Normal file
47
fuzzing/fuzz_textflow.cpp
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user