contrib/fuzz/fuzzutil.cc
author Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
Sat, 01 Sep 2018 18:00:38 -0400
changeset 39400 213c0493cea0
parent 38232 a1c0873a9990
permissions -rw-r--r--
resolve: test that we suggest a valid hg command Differential Revision: https://phab.mercurial-scm.org/D4447
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
}