gecko-dev/mfbt/tests/TestRandomNum.cpp
Mike Hommey f00f1ea9b3 Bug 1690167 - Allocate some memory before running RandomNum tests. r=Gankra
Because the previous commit changed how MFBT tests are linked, they now
use mozjemalloc. Mozjemalloc randomizes small allocations, which id does
by using MFBT's RandomNum. The code in RandomNum, on mac, uses a system
API that allocates memory. So mozjemalloc has some code to handle the
recursion gracefully.

When the RandomNum test runs, it essentially only runs the RNG... which
goes on to allocate memory, which then goes into the RNG. Needless to
say, that doesn't go well. In typical cases, this is not the type of
things that would happen, but it does happen for that one test.

We work around the issue by allocating memory first, which is actually
hard, because compilers like to optimize unused allocations away. So we
turn the existing code into one that uses an allocation instead of an
array on the stack.

Differential Revision: https://phabricator.services.mozilla.com/D105242
2021-03-10 23:52:41 +00:00

62 lines
1.9 KiB
C++

/* -*- 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/. */
#include "mozilla/RandomNum.h"
#include <vector>
/*
* We're going to check that random number generation is sane on a basic
* level - That is, we want to check that the function returns success
* and doesn't just keep returning the same number.
*
* Note that there are many more tests that could be done, but to really test
* a PRNG we'd probably need to generate a large set of randoms and
* perform statistical analysis on them. Maybe that's worth doing eventually?
*
* For now we should be fine just performing a dumb test of generating 5
* numbers and making sure they're all unique. In theory, it is possible for
* this test to report a false negative, but with 5 numbers the probability
* is less than one-in-a-trillion.
*
*/
#define NUM_RANDOMS_TO_GENERATE 5
using mozilla::Maybe;
using mozilla::RandomUint64;
static uint64_t getRandomUint64OrDie() {
Maybe<uint64_t> maybeRandomNum = RandomUint64();
MOZ_RELEASE_ASSERT(maybeRandomNum.isSome());
return maybeRandomNum.value();
}
static void TestRandomUint64() {
// The allocator uses RandomNum.h too, but its initialization path allocates
// memory. While the allocator itself handles the situation, we can't, so
// we make sure to use an allocation before getting a Random number ourselves.
std::vector<uint64_t> randomsList;
randomsList.reserve(NUM_RANDOMS_TO_GENERATE);
for (uint8_t i = 0; i < NUM_RANDOMS_TO_GENERATE; ++i) {
uint64_t randomNum = getRandomUint64OrDie();
for (uint64_t num : randomsList) {
MOZ_RELEASE_ASSERT(randomNum != num);
}
randomsList.push_back(randomNum);
}
}
int main() {
TestRandomUint64();
return 0;
}