/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
class FuzzingTraits { public: staticunsignedint Random(unsignedint aMax); staticbool Sometimes(unsignedint aProbability); /** * Frequency() defines how many mutations of a kind shall be applied to a * target buffer by using a user definable factor. The higher the factor, * the less mutations are being made.
*/ static size_t Frequency(const size_t aSize, const uint64_t aFactor);
static std::mt19937_64& Rng();
};
/** * RandomNumericLimit returns either the min or max limit of an arithmetic * data type.
*/ template <typename T>
T RandomNumericLimit() {
static_assert(std::is_arithmetic_v<T> == true, "T must be an arithmetic type"); return FuzzingTraits::Sometimes(2) ? std::numeric_limits<T>::min()
: std::numeric_limits<T>::max();
}
/** * RandomInteger generates negative and positive integers in 2**n increments.
*/ template <typename T>
T RandomInteger() {
static_assert(std::is_integral_v<T> == true, "T must be an integral type"); double r = static_cast<double>(FuzzingTraits::Random((sizeof(T) * CHAR_BIT) + 1));
T x = static_cast<T>(pow(2.0, r)) - 1; if (std::numeric_limits<T>::is_signed && FuzzingTraits::Sometimes(2)) { return (x * -1) - 1;
} return x;
}
/** * RandomIntegerRange returns a random integral within a [min, max] range.
*/ template <typename T>
T RandomIntegerRange(T min, T max) {
static_assert(std::is_integral_v<T> == true, "T must be an integral type");
MOZ_ASSERT(min < max);
std::uniform_int_distribution<T> d(min, max); return d(FuzzingTraits::Rng());
} /** * uniform_int_distribution is undefined for char/uchar. Need to handle them * separately.
*/ template <> inlineunsignedchar RandomIntegerRange(unsignedchar min, unsignedchar max) {
MOZ_ASSERT(min < max);
std::uniform_int_distribution<unsignedshort> d(min, max); returnstatic_cast<unsignedchar>(d(FuzzingTraits::Rng()));
} template <> inlinechar RandomIntegerRange(char min, char max) {
MOZ_ASSERT(min < max);
std::uniform_int_distribution<short> d(min, max); returnstatic_cast<char>(d(FuzzingTraits::Rng()));
}
/** * RandomFloatingPointRange returns a random floating-point number within a * [min, max] range.
*/ template <typename T>
T RandomFloatingPointRange(T min, T max) {
static_assert(std::is_floating_point_v<T> == true, "T must be a floating point type");
MOZ_ASSERT(min < max);
std::uniform_real_distribution<T> d(
min, std::nextafter(max, std::numeric_limits<T>::max())); return d(FuzzingTraits::Rng());
}
/** * RandomFloatingPoint returns a random floating-point number in 2**n * increments.
*/ template <typename T>
T RandomFloatingPoint() {
static_assert(std::is_floating_point_v<T> == true, "T must be a floating point type"); int radix = RandomIntegerRange<int>(std::numeric_limits<T>::min_exponent,
std::numeric_limits<T>::max_exponent);
T x = static_cast<T>(pow(2.0, static_cast<double>(radix))); return x * RandomFloatingPointRange<T>(-1.0, 1.0);
}
} // namespace fuzzing
} // namespace mozilla
#endif
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.