annotate contrib/fuzz/fuzzutil.cc @ 40788:41f0529b5112 stable

commandserver: get around ETIMEDOUT raised by selectors2 selector.select() should exits with an empty event list on timed out, but selectors2 raises OSError if timeout expires while recovering from EINTR. Spotted while debugging new chg feature.
author Yuya Nishihara <yuya@tcha.org>
date Mon, 03 Dec 2018 21:45:15 +0900
parents a1c0873a9990
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38173
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
1 #include "fuzzutil.h"
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
2
38232
a1c0873a9990 fuzz: fix use of undeclared function memcpy()
Yuya Nishihara <yuya@tcha.org>
parents: 38174
diff changeset
3 #include <cstring>
38173
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
4 #include <utility>
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
5
38174
36d55f90e2a3 fuzzutil: make it possible to use absl when C++17 isn't supported
Augie Fackler <augie@google.com>
parents: 38173
diff changeset
6 contrib::optional<two_inputs> SplitInputs(const uint8_t *Data, size_t Size)
38173
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
7 {
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
8 if (!Size) {
38174
36d55f90e2a3 fuzzutil: make it possible to use absl when C++17 isn't supported
Augie Fackler <augie@google.com>
parents: 38173
diff changeset
9 return contrib::nullopt;
38173
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
10 }
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
11 // figure out a random point in [0, Size] to split our input.
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
12 size_t left_size = (Data[0] / 255.0) * (Size - 1);
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
13
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
14 // Copy inputs to new allocations so if bdiff over-reads
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
15 // AddressSanitizer can detect it.
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
16 std::unique_ptr<char[]> left(new char[left_size]);
38232
a1c0873a9990 fuzz: fix use of undeclared function memcpy()
Yuya Nishihara <yuya@tcha.org>
parents: 38174
diff changeset
17 std::memcpy(left.get(), Data + 1, left_size);
38173
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
18 // right starts at the next byte after left ends
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
19 size_t right_size = Size - (left_size + 1);
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
20 std::unique_ptr<char[]> right(new char[right_size]);
38232
a1c0873a9990 fuzz: fix use of undeclared function memcpy()
Yuya Nishihara <yuya@tcha.org>
parents: 38174
diff changeset
21 std::memcpy(right.get(), Data + 1 + left_size, right_size);
38173
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
22 LOG(2) << "inputs are " << left_size << " and " << right_size
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
23 << " bytes" << std::endl;
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
24 two_inputs result = {std::move(right), right_size, std::move(left),
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
25 left_size};
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
26 return result;
fa0ddd5e8fff fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff changeset
27 }