blob: 2afb6c7ac052924d1db65dc3c987be1156e43a5b [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// A fuzzer that uses the FuzzedDataProvider library to consume fuzzing input.
// See also:
// https://github.com/google/fuzzing/blob/HEAD/docs/split-inputs.md#fuzzed-data-provider
// https://github.com/llvm/llvm-project/blob/HEAD/compiler-rt/include/fuzzer/FuzzedDataProvider.h
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <fuzzer/FuzzedDataProvider.h>
// The code under test. Normally this would be in a separate library.
namespace {
// In order to consume Enums in FuzzedDataProvider, your enums need to start at 0 and include an
// element named |kMaxValue|, equal to the maximum value of the enum.
enum Color {
kRed = 0,
kBlue,
kYellow,
kMaxValue = kYellow,
};
struct MyStruct {
uint32_t my_int;
double my_double;
std::string my_str;
Color my_color;
};
// Simulate a crash for a specific combinations of fields.
int crasher(uint16_t val1, uint8_t val2, bool val3, MyStruct *val4) {
if (val4 != nullptr && val4->my_color == kBlue && val4->my_str.size() > 4) {
__builtin_trap();
}
return 0;
}
} // namespace
// The fuzz target function
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
FuzzedDataProvider provider(data, size);
auto val1 = provider.ConsumeIntegralInRange<uint16_t>(13000, 16000);
auto val2 = provider.ConsumeIntegral<uint8_t>();
auto val3 = provider.ConsumeBool();
MyStruct val4 = {
.my_int = provider.ConsumeIntegral<uint32_t>(),
.my_double = provider.ConsumeFloatingPoint<double>(),
.my_color = provider.ConsumeEnum<Color>(),
};
val4.my_str = provider.ConsumeRemainingBytesAsString();
return crasher(val1, val2, val3, &val4);
}