From 65eed6d5978738b06e047c9bd5d162b2596759f7 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 11 Oct 2017 13:25:44 +0200 Subject: configure: make C++11 a required functionality Error out if it's missing or broken (Mersenne Twister not present). This ensures that we never have a low-quality random generator in Qt. Change-Id: I0a103569c81b4711a649fffd14ec80649df7087e Reviewed-by: Lars Knoll --- src/corelib/configure.json | 11 +++------ src/corelib/global/qrandom.cpp | 19 +++++----------- .../qrandomgenerator/tst_qrandomgenerator.cpp | 26 +++------------------- 3 files changed, 12 insertions(+), 44 deletions(-) diff --git a/src/corelib/configure.json b/src/corelib/configure.json index 51e6d1d391..8067ca70f1 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -459,11 +459,6 @@ "condition": "tests.cxx11_future", "output": [ "publicFeature" ] }, - "cxx11_random": { - "label": "C++11 ", - "condition": "tests.cxx11_random", - "output": [ "privateFeature" ] - }, "eventfd": { "label": "eventfd", "condition": "tests.eventfd", @@ -869,9 +864,9 @@ ensure that the IDEs they use either set QT_LOGGING_TO_CONSOLE to 1 or are able to read the logged output from journald, syslog or slog2." }, { - "type": "warning", - "condition": "!config.win32 && !config.darwin && !config.bsd && !features.cxx11_random", - "message": "No high-quality PRNG available for QRandomGenerator fallback.\nIf the HW or OS RNG fails, Qt will abort execution." + "type": "error", + "condition": "!tests.cxx11_random", + "message": "C++11 is required and is missing or failed to compile." }, { "type": "error", diff --git a/src/corelib/global/qrandom.cpp b/src/corelib/global/qrandom.cpp index bafc312b3e..a7696719d1 100644 --- a/src/corelib/global/qrandom.cpp +++ b/src/corelib/global/qrandom.cpp @@ -46,16 +46,15 @@ #include #include +#include + #include #if QT_CONFIG(getentropy) # include -#else -# if QT_CONFIG(cxx11_random) -# include -# include "qdeadlinetimer.h" -# include "qhashfunctions.h" -# endif +#elif !defined(Q_OS_BSD4) && !defined(Q_OS_WIN) +# include "qdeadlinetimer.h" +# include "qhashfunctions.h" # if QT_CONFIG(getauxval) # include @@ -258,7 +257,7 @@ static void fallback_fill(quint32 *ptr, qssize_t left) Q_DECL_NOTHROW // BSDs have arc4random(4) and these work even in chroot(2) arc4random_buf(ptr, left * sizeof(*ptr)); } -#elif QT_CONFIG(cxx11_random) +#else static QBasicAtomicInteger seed = Q_BASIC_ATOMIC_INITIALIZER(0U); static void fallback_update_seed(unsigned value) { @@ -343,12 +342,6 @@ static void fallback_fill(quint32 *ptr, qssize_t left) Q_DECL_NOTHROW fallback_update_seed(*ptr); } -#else -static void fallback_update_seed(unsigned) {} -static Q_NORETURN void fallback_fill(quint32 *, qssize_t) -{ - qFatal("Random number generator failed and no high-quality backup available"); -} #endif static qssize_t fill_cpu(quint32 *buffer, qssize_t count) Q_DECL_NOTHROW diff --git a/tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp b/tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp index bf43f6d710..2195bf8ec8 100644 --- a/tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp +++ b/tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp @@ -34,11 +34,9 @@ #include #include -#if QT_CONFIG(cxx11_random) -# include -#endif +#include -#if !QT_CONFIG(getentropy) && (QT_CONFIG(cxx11_random) || defined(Q_OS_BSD4) || defined(Q_OS_WIN)) +#if !QT_CONFIG(getentropy) && (defined(Q_OS_BSD4) || defined(Q_OS_WIN)) # define HAVE_FALLBACK_ENGINE #endif @@ -468,9 +466,6 @@ template void seedStdRandomEngine() void tst_QRandomGenerator::seedStdRandomEngines() { -#if !QT_CONFIG(cxx11_random) - QSKIP(" not found"); -#else seedStdRandomEngine(); seedStdRandomEngine(); seedStdRandomEngine(); @@ -480,7 +475,6 @@ void tst_QRandomGenerator::seedStdRandomEngines() seedStdRandomEngine(); seedStdRandomEngine(); seedStdRandomEngine(); -#endif } void tst_QRandomGenerator::stdUniformIntDistribution_data() @@ -511,9 +505,6 @@ void tst_QRandomGenerator::stdUniformIntDistribution_data() void tst_QRandomGenerator::stdUniformIntDistribution() { -#if !QT_CONFIG(cxx11_random) - QSKIP(" not found"); -#else QFETCH(uint, control); QFETCH(quint32, max); setRNGControl(control & (SkipHWRNG|SkipSystemRNG|SkipMemfill)); @@ -575,14 +566,11 @@ void tst_QRandomGenerator::stdUniformIntDistribution() QVERIFY(value <= dist.max()); } } -#endif } void tst_QRandomGenerator::stdGenerateCanonical() { -#if !QT_CONFIG(cxx11_random) - QSKIP(" not found"); -#elif defined(Q_CC_MSVC) && Q_CC_MSVC < 1900 +#if defined(Q_CC_MSVC) && Q_CC_MSVC < 1900 // see https://connect.microsoft.com/VisualStudio/feedback/details/811611 QSKIP("MSVC 2013's std::generate_canonical is broken"); #else @@ -634,9 +622,6 @@ void tst_QRandomGenerator::stdUniformRealDistribution_data() void tst_QRandomGenerator::stdUniformRealDistribution() { -#if !QT_CONFIG(cxx11_random) - QSKIP(" not found"); -#else QFETCH(uint, control); QFETCH(double, min); QFETCH(double, sup); @@ -663,14 +648,10 @@ void tst_QRandomGenerator::stdUniformRealDistribution() QVERIFY(value < dist.max()); } } -#endif } void tst_QRandomGenerator::stdRandomDistributions() { -#if !QT_CONFIG(cxx11_random) - QSKIP(" not found"); -#else // just a compile check for some of the distributions, besides // std::uniform_int_distribution and std::uniform_real_distribution (tested // above) @@ -695,7 +676,6 @@ void tst_QRandomGenerator::stdRandomDistributions() QVERIFY(discrete(rd) != 0); QVERIFY_3TIMES(discrete(rd) == 3); } -#endif } QTEST_APPLESS_MAIN(tst_QRandomGenerator) -- cgit v1.2.3