// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include "base/basictypes.h" #include "base/strings/string_util.h" #include "tools/ipc_fuzzer/fuzzer/generator.h" #include "tools/ipc_fuzzer/fuzzer/rand_util.h" namespace ipc_fuzzer { template void GenerateIntegralType(T* value) { switch (RandInRange(16)) { case 0: *value = static_cast(0); break; case 1: *value = static_cast(1); break; case 2: *value = static_cast(-1); break; case 3: *value = static_cast(2); break; default: *value = static_cast(RandU64()); break; } } template void GenerateFloatingType(T* value) { *value = RandDouble(); } template void GenerateStringType(T* value) { T temp_string; size_t length = RandInRange(300); for (size_t i = 0; i < length; ++i) temp_string += RandInRange(256); *value = temp_string; } void Generator::FuzzBool(bool* value) { *value = RandInRange(2) ? true: false; } void Generator::FuzzInt(int* value) { GenerateIntegralType(value); } void Generator::FuzzLong(long* value) { GenerateIntegralType(value); } void Generator::FuzzSize(size_t* value) { GenerateIntegralType(value); } void Generator::FuzzUChar(unsigned char* value) { GenerateIntegralType(value); } void Generator::FuzzWChar(wchar_t* value) { GenerateIntegralType(value); } void Generator::FuzzUInt16(uint16* value) { GenerateIntegralType(value); } void Generator::FuzzUInt32(uint32* value) { GenerateIntegralType(value); } void Generator::FuzzInt64(int64* value) { GenerateIntegralType(value); } void Generator::FuzzUInt64(uint64* value) { GenerateIntegralType(value); } void Generator::FuzzFloat(float* value) { GenerateFloatingType(value); } void Generator::FuzzDouble(double* value) { GenerateFloatingType(value); } void Generator::FuzzString(std::string* value) { GenerateStringType(value); } void Generator::FuzzString16(base::string16* value) { GenerateStringType(value); } void Generator::FuzzData(char* data, int length) { for (int i = 0; i < length; ++i) { GenerateIntegralType(&data[i]); } } void Generator::FuzzBytes(void* data, int data_len) { FuzzData(static_cast(data), data_len); } bool Generator::ShouldGenerate() { // The generator fuzzer should always generate new values. return true; } } // namespace ipc_fuzzer