mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-10 05:57:51 +00:00
Unify fuzzer random number generation into a single class
BUG=tint:1098 Change-Id: I84931804515487d931bbbb5f0d5239d03ca76dfc Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/63300 Auto-Submit: Ryan Harrison <rharrison@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Ryan Harrison <rharrison@chromium.org> Reviewed-by: Alastair Donaldson <afdx@google.com>
This commit is contained in:
committed by
Tint LUCI CQ
parent
6a1eb45961
commit
5dc0ea7cce
@@ -21,7 +21,8 @@ function(add_tint_regex_fuzzer NAME)
|
||||
endfunction()
|
||||
|
||||
set(LIBTINT_REGEX_FUZZER_SOURCES
|
||||
util.h
|
||||
../random_generator.cc
|
||||
../random_generator.h
|
||||
wgsl_mutator.cc
|
||||
wgsl_mutator.h)
|
||||
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
|
||||
#include "fuzzers/random_generator.h"
|
||||
#include "fuzzers/tint_common_fuzzer.h"
|
||||
#include "fuzzers/tint_regex_fuzzer/cli.h"
|
||||
#include "fuzzers/tint_regex_fuzzer/override_cli_params.h"
|
||||
#include "fuzzers/tint_regex_fuzzer/util.h"
|
||||
#include "fuzzers/tint_regex_fuzzer/wgsl_mutator.h"
|
||||
|
||||
#include "src/reader/wgsl/parser.h"
|
||||
#include "src/writer/wgsl/generator.h"
|
||||
|
||||
@@ -57,13 +56,13 @@ extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data,
|
||||
unsigned seed) {
|
||||
std::string wgsl_code(data, data + size);
|
||||
const std::vector<std::string> delimiters{";"};
|
||||
std::mt19937 generator(seed);
|
||||
RandomGenerator generator(seed);
|
||||
|
||||
std::string delimiter =
|
||||
delimiters[GetRandomIntFromRange(0, delimiters.size() - 1, generator)];
|
||||
delimiters[generator.GetUInt64(delimiters.size() - 1u)];
|
||||
|
||||
MutationKind mutation_kind = static_cast<MutationKind>(GetRandomIntFromRange(
|
||||
0, static_cast<size_t>(MutationKind::kNumMutationKinds) - 1, generator));
|
||||
MutationKind mutation_kind = static_cast<MutationKind>(generator.GetUInt64(
|
||||
static_cast<size_t>(MutationKind::kNumMutationKinds) - 1u));
|
||||
|
||||
switch (mutation_kind) {
|
||||
case MutationKind::kSwapIntervals:
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
// Copyright 2021 The Tint Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#ifndef FUZZERS_TINT_REGEX_FUZZER_UTIL_H_
|
||||
#define FUZZERS_TINT_REGEX_FUZZER_UTIL_H_
|
||||
|
||||
#include <random>
|
||||
|
||||
namespace tint {
|
||||
namespace fuzzers {
|
||||
namespace regex_fuzzer {
|
||||
|
||||
inline size_t GetRandomIntFromRange(size_t lower_bound,
|
||||
size_t upper_bound,
|
||||
std::mt19937& generator) {
|
||||
std::uniform_int_distribution<size_t> dist(lower_bound, upper_bound);
|
||||
return dist(generator);
|
||||
}
|
||||
} // namespace regex_fuzzer
|
||||
} // namespace fuzzers
|
||||
} // namespace tint
|
||||
#endif // FUZZERS_TINT_REGEX_FUZZER_UTIL_H_
|
||||
@@ -17,13 +17,12 @@
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <random>
|
||||
#include <regex>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "fuzzers/tint_regex_fuzzer/util.h"
|
||||
#include "fuzzers/random_generator.h"
|
||||
|
||||
namespace tint {
|
||||
namespace fuzzers {
|
||||
@@ -137,7 +136,7 @@ void ReplaceInterval(size_t start_index,
|
||||
|
||||
bool SwapRandomIntervals(const std::string& delimiter,
|
||||
std::string& wgsl_code,
|
||||
std::mt19937& generator) {
|
||||
RandomGenerator& generator) {
|
||||
std::vector<size_t> delimiter_positions =
|
||||
FindDelimiterIndices(delimiter, wgsl_code);
|
||||
|
||||
@@ -148,14 +147,10 @@ bool SwapRandomIntervals(const std::string& delimiter,
|
||||
|
||||
// When generating the i-th random number, we should make sure that there are
|
||||
// at least (3-i) numbers greater than this number.
|
||||
size_t ind1 =
|
||||
GetRandomIntFromRange(0, delimiter_positions.size() - 3U, generator);
|
||||
size_t ind2 = GetRandomIntFromRange(
|
||||
ind1 + 1U, delimiter_positions.size() - 2U, generator);
|
||||
size_t ind3 =
|
||||
GetRandomIntFromRange(ind2, delimiter_positions.size() - 2U, generator);
|
||||
size_t ind4 = GetRandomIntFromRange(
|
||||
ind3 + 1U, delimiter_positions.size() - 1U, generator);
|
||||
size_t ind1 = generator.GetUInt64(delimiter_positions.size() - 3u);
|
||||
size_t ind2 = generator.GetUInt64(ind1 + 1u, delimiter_positions.size() - 2u);
|
||||
size_t ind3 = generator.GetUInt64(ind2, delimiter_positions.size() - 2u);
|
||||
size_t ind4 = generator.GetUInt64(ind3 + 1u, delimiter_positions.size() - 1u);
|
||||
|
||||
SwapIntervals(delimiter_positions[ind1],
|
||||
delimiter_positions[ind2] - delimiter_positions[ind1],
|
||||
@@ -168,7 +163,7 @@ bool SwapRandomIntervals(const std::string& delimiter,
|
||||
|
||||
bool DeleteRandomInterval(const std::string& delimiter,
|
||||
std::string& wgsl_code,
|
||||
std::mt19937& generator) {
|
||||
RandomGenerator& generator) {
|
||||
std::vector<size_t> delimiter_positions =
|
||||
FindDelimiterIndices(delimiter, wgsl_code);
|
||||
|
||||
@@ -177,10 +172,8 @@ bool DeleteRandomInterval(const std::string& delimiter,
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t ind1 =
|
||||
GetRandomIntFromRange(0, delimiter_positions.size() - 2U, generator);
|
||||
size_t ind2 = GetRandomIntFromRange(
|
||||
ind1 + 1U, delimiter_positions.size() - 1U, generator);
|
||||
size_t ind1 = generator.GetUInt64(delimiter_positions.size() - 2u);
|
||||
size_t ind2 = generator.GetUInt64(ind1 + 1u, delimiter_positions.size() - 1u);
|
||||
|
||||
DeleteInterval(delimiter_positions[ind1],
|
||||
delimiter_positions[ind2] - delimiter_positions[ind1],
|
||||
@@ -191,7 +184,7 @@ bool DeleteRandomInterval(const std::string& delimiter,
|
||||
|
||||
bool DuplicateRandomInterval(const std::string& delimiter,
|
||||
std::string& wgsl_code,
|
||||
std::mt19937& generator) {
|
||||
RandomGenerator& generator) {
|
||||
std::vector<size_t> delimiter_positions =
|
||||
FindDelimiterIndices(delimiter, wgsl_code);
|
||||
|
||||
@@ -200,13 +193,9 @@ bool DuplicateRandomInterval(const std::string& delimiter,
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t ind1 =
|
||||
GetRandomIntFromRange(0, delimiter_positions.size() - 2U, generator);
|
||||
size_t ind2 = GetRandomIntFromRange(
|
||||
ind1 + 1U, delimiter_positions.size() - 1U, generator);
|
||||
|
||||
size_t ind3 =
|
||||
GetRandomIntFromRange(0, delimiter_positions.size() - 1U, generator);
|
||||
size_t ind1 = generator.GetUInt64(delimiter_positions.size() - 2u);
|
||||
size_t ind2 = generator.GetUInt64(ind1 + 1u, delimiter_positions.size() - 1u);
|
||||
size_t ind3 = generator.GetUInt64(delimiter_positions.size() - 1u);
|
||||
|
||||
DuplicateInterval(delimiter_positions[ind1],
|
||||
delimiter_positions[ind2] - delimiter_positions[ind1],
|
||||
@@ -215,7 +204,8 @@ bool DuplicateRandomInterval(const std::string& delimiter,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ReplaceRandomIdentifier(std::string& wgsl_code, std::mt19937& generator) {
|
||||
bool ReplaceRandomIdentifier(std::string& wgsl_code,
|
||||
RandomGenerator& generator) {
|
||||
std::vector<std::pair<size_t, size_t>> identifiers =
|
||||
GetIdentifiers(wgsl_code);
|
||||
|
||||
@@ -224,15 +214,12 @@ bool ReplaceRandomIdentifier(std::string& wgsl_code, std::mt19937& generator) {
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t id1_index =
|
||||
GetRandomIntFromRange(0, identifiers.size() - 1U, generator);
|
||||
|
||||
size_t id2_index =
|
||||
GetRandomIntFromRange(0, identifiers.size() - 1U, generator);
|
||||
size_t id1_index = generator.GetUInt64(identifiers.size() - 1u);
|
||||
size_t id2_index = generator.GetUInt64(identifiers.size() - 1u);
|
||||
|
||||
// The two identifiers must be different
|
||||
while (id1_index == id2_index) {
|
||||
id2_index = GetRandomIntFromRange(0, identifiers.size() - 1U, generator);
|
||||
id2_index = generator.GetUInt64(identifiers.size() - 1u);
|
||||
}
|
||||
|
||||
ReplaceRegion(identifiers[id1_index].first, identifiers[id1_index].second,
|
||||
@@ -242,7 +229,8 @@ bool ReplaceRandomIdentifier(std::string& wgsl_code, std::mt19937& generator) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ReplaceRandomIntLiteral(std::string& wgsl_code, std::mt19937& generator) {
|
||||
bool ReplaceRandomIntLiteral(std::string& wgsl_code,
|
||||
RandomGenerator& generator) {
|
||||
std::vector<std::pair<size_t, size_t>> literals = GetIntLiterals(wgsl_code);
|
||||
|
||||
// Need at least one integer literal
|
||||
@@ -250,14 +238,13 @@ bool ReplaceRandomIntLiteral(std::string& wgsl_code, std::mt19937& generator) {
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t id1_index = GetRandomIntFromRange(0, literals.size() - 1U, generator);
|
||||
size_t id1_index = generator.GetUInt64(literals.size() - 1u);
|
||||
|
||||
// INT_MAX = 2147483647, INT_MIN = -2147483648
|
||||
std::vector<std::string> boundary_values = {
|
||||
"2147483647", "-2147483648", "1", "-1", "0", "4294967295"};
|
||||
|
||||
size_t boundary_index =
|
||||
GetRandomIntFromRange(0, boundary_values.size() - 1U, generator);
|
||||
size_t boundary_index = generator.GetUInt64(boundary_values.size() - 1u);
|
||||
|
||||
ReplaceInterval(literals[id1_index].first, literals[id1_index].second,
|
||||
boundary_values[boundary_index], wgsl_code);
|
||||
|
||||
@@ -15,11 +15,12 @@
|
||||
#ifndef FUZZERS_TINT_REGEX_FUZZER_WGSL_MUTATOR_H_
|
||||
#define FUZZERS_TINT_REGEX_FUZZER_WGSL_MUTATOR_H_
|
||||
|
||||
#include <random>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "fuzzers/random_generator.h"
|
||||
|
||||
namespace tint {
|
||||
namespace fuzzers {
|
||||
namespace regex_fuzzer {
|
||||
@@ -114,7 +115,7 @@ void ReplaceInterval(size_t start_index,
|
||||
/// @return true if a swap happened or false otherwise.
|
||||
bool SwapRandomIntervals(const std::string& delimiter,
|
||||
std::string& wgsl_code,
|
||||
std::mt19937& generator);
|
||||
RandomGenerator& generator);
|
||||
|
||||
/// A function that, given a WGSL-like string and a delimiter,
|
||||
/// generates another WGSL-like string by deleting a random
|
||||
@@ -125,7 +126,7 @@ bool SwapRandomIntervals(const std::string& delimiter,
|
||||
/// @return true if a deletion happened or false otherwise.
|
||||
bool DeleteRandomInterval(const std::string& delimiter,
|
||||
std::string& wgsl_code,
|
||||
std::mt19937& generator);
|
||||
RandomGenerator& generator);
|
||||
|
||||
/// A function that, given a WGSL-like string and a delimiter,
|
||||
/// generates another WGSL-like string by duplicating a random
|
||||
@@ -136,20 +137,22 @@ bool DeleteRandomInterval(const std::string& delimiter,
|
||||
/// @return true if a duplication happened or false otherwise.
|
||||
bool DuplicateRandomInterval(const std::string& delimiter,
|
||||
std::string& wgsl_code,
|
||||
std::mt19937& generator);
|
||||
RandomGenerator& generator);
|
||||
|
||||
/// Replaces a randomly-chosen identifier in wgsl_code.
|
||||
/// @param wgsl_code - WGSL-like string where the replacement will occur.
|
||||
/// @param generator - the random number generator.
|
||||
/// @return true if a replacement happened or false otherwise.
|
||||
bool ReplaceRandomIdentifier(std::string& wgsl_code, std::mt19937& generator);
|
||||
bool ReplaceRandomIdentifier(std::string& wgsl_code,
|
||||
RandomGenerator& generator);
|
||||
|
||||
/// Replaces the value of a randomly-chosen integer with one of
|
||||
/// the values in the set {INT_MAX, INT_MIN, 0, -1}.
|
||||
/// @param wgsl_code - WGSL-like string where the replacement will occur.
|
||||
/// @param generator - the random number generator.
|
||||
/// @return true if a replacement happened or false otherwise.
|
||||
bool ReplaceRandomIntLiteral(std::string& wgsl_code, std::mt19937& generator);
|
||||
bool ReplaceRandomIntLiteral(std::string& wgsl_code,
|
||||
RandomGenerator& generator);
|
||||
|
||||
} // namespace regex_fuzzer
|
||||
} // namespace fuzzers
|
||||
|
||||
Reference in New Issue
Block a user