fuzzutil.cc
27 lines
| 922 B
| text/x-c
|
CppLexer
Augie Fackler
|
r38191 | #include "fuzzutil.h" | ||
Yuya Nishihara
|
r38234 | #include <cstring> | ||
Augie Fackler
|
r38191 | #include <utility> | ||
Augie Fackler
|
r38192 | contrib::optional<two_inputs> SplitInputs(const uint8_t *Data, size_t Size) | ||
Augie Fackler
|
r38191 | { | ||
if (!Size) { | ||||
Augie Fackler
|
r38192 | return contrib::nullopt; | ||
Augie Fackler
|
r38191 | } | ||
// figure out a random point in [0, Size] to split our input. | ||||
size_t left_size = (Data[0] / 255.0) * (Size - 1); | ||||
// Copy inputs to new allocations so if bdiff over-reads | ||||
// AddressSanitizer can detect it. | ||||
std::unique_ptr<char[]> left(new char[left_size]); | ||||
Yuya Nishihara
|
r38234 | std::memcpy(left.get(), Data + 1, left_size); | ||
Augie Fackler
|
r38191 | // right starts at the next byte after left ends | ||
size_t right_size = Size - (left_size + 1); | ||||
std::unique_ptr<char[]> right(new char[right_size]); | ||||
Yuya Nishihara
|
r38234 | std::memcpy(right.get(), Data + 1 + left_size, right_size); | ||
Augie Fackler
|
r38191 | LOG(2) << "inputs are " << left_size << " and " << right_size | ||
<< " bytes" << std::endl; | ||||
two_inputs result = {std::move(right), right_size, std::move(left), | ||||
left_size}; | ||||
return result; | ||||
} | ||||