From 0669f71b0c78c0d3374571d266004d7503ca8b12 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 6 Jun 2017 18:28:37 -0700 Subject: [PATCH] QRandomGenerator: don't internally rely on QT_HAS_INCLUDE GCC didn't support it until version 5 or 6, so add configure tests for both and . Normally I'd say "upgrade", but this is too low-level and important a feature. There's a good chance that all our supported compilers have anyway. As for , it's present on Glibc, Bionic and MUSL, but I don't see it in uClibc (AT_RANDOM is a Linux-specific feature). Change-Id: Ia3e896da908f42939148fffd14c5b2af491f7a77 Reviewed-by: Lars Knoll Reviewed-by: Edward Welbourne --- .../unix/cxx11_random/cxx11_random.cpp | 35 +++++++++++++++++++ .../unix/cxx11_random/cxx11_random.pro | 1 + config.tests/unix/sys_auxv/sys_auxv.cpp | 34 ++++++++++++++++++ config.tests/unix/sys_auxv/sys_auxv.pro | 1 + src/corelib/configure.json | 25 +++++++++++++ src/corelib/global/qconfig-bootstrapped.h | 2 ++ src/corelib/global/qrandom.cpp | 6 ++-- .../qrandomgenerator/tst_qrandomgenerator.cpp | 17 +++++---- 8 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 config.tests/unix/cxx11_random/cxx11_random.cpp create mode 100644 config.tests/unix/cxx11_random/cxx11_random.pro create mode 100644 config.tests/unix/sys_auxv/sys_auxv.cpp create mode 100644 config.tests/unix/sys_auxv/sys_auxv.pro diff --git a/config.tests/unix/cxx11_random/cxx11_random.cpp b/config.tests/unix/cxx11_random/cxx11_random.cpp new file mode 100644 index 0000000000..d6872667fd --- /dev/null +++ b/config.tests/unix/cxx11_random/cxx11_random.cpp @@ -0,0 +1,35 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Intel Corporation. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +int main() +{ + std::mt19937 mt(0); + return 0; +} diff --git a/config.tests/unix/cxx11_random/cxx11_random.pro b/config.tests/unix/cxx11_random/cxx11_random.pro new file mode 100644 index 0000000000..0cd5fff9d9 --- /dev/null +++ b/config.tests/unix/cxx11_random/cxx11_random.pro @@ -0,0 +1 @@ +SOURCES = cxx11_random.cpp diff --git a/config.tests/unix/sys_auxv/sys_auxv.cpp b/config.tests/unix/sys_auxv/sys_auxv.cpp new file mode 100644 index 0000000000..62f71e95d2 --- /dev/null +++ b/config.tests/unix/sys_auxv/sys_auxv.cpp @@ -0,0 +1,34 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Intel Corporation. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +int main() +{ + return getauxval(AT_NULL); +} diff --git a/config.tests/unix/sys_auxv/sys_auxv.pro b/config.tests/unix/sys_auxv/sys_auxv.pro new file mode 100644 index 0000000000..6920d80e39 --- /dev/null +++ b/config.tests/unix/sys_auxv/sys_auxv.pro @@ -0,0 +1 @@ +SOURCES = sys_auxv.cpp diff --git a/src/corelib/configure.json b/src/corelib/configure.json index 7fca3137eb..0da3bff713 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -138,6 +138,11 @@ "type": "compile", "test": "unix/cloexec" }, + "cxx11_random": { + "label": "C++11 ", + "type": "compile", + "test": "unix/cxx11_random" + }, "eventfd": { "label": "eventfd", "type": "compile", @@ -208,6 +213,11 @@ "type": "compile", "test": "unix/syslog" }, + "sys_auxv": { + "label": "sys/auxv.h", + "type": "compile", + "test": "unix/sys_auxv" + }, "xlocalescanprint": { "label": "xlocale.h (or equivalents)", "type": "compile", @@ -242,6 +252,11 @@ "condition": "features.doubleconversion && libs.doubleconversion", "output": [ "privateFeature" ] }, + "cxx11_random": { + "label": "C++11 ", + "condition": "tests.cxx11_random", + "output": [ "privateFeature" ] + }, "eventfd": { "label": "eventfd", "condition": "tests.eventfd", @@ -394,6 +409,11 @@ "condition": "tests.syslog", "output": [ "privateFeature" ] }, + "sys_auxv": { + "label": "sys/auxv.h", + "condition": "config.linux && tests.sys_auxv", + "output": [ "privateFeature" ] + }, "threadsafe-cloexec": { "label": "Threadsafe pipe creation", "condition": "tests.cloexec", @@ -630,6 +650,11 @@ If your users intend to develop applications against this build, 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": "input.doubleconversion == 'no' && !tests.xlocalescanprint", diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h index 374b53a9b5..a6a56b5d59 100644 --- a/src/corelib/global/qconfig-bootstrapped.h +++ b/src/corelib/global/qconfig-bootstrapped.h @@ -75,6 +75,7 @@ #else # define QT_FEATURE_alloca_malloc_h -1 #endif +#define QT_FEATURE_cxx11_random (QT_HAS_INCLUDE() ? 1 : -1) #define QT_FEATURE_iconv -1 #define QT_FEATURE_icu -1 #define QT_FEATURE_journald -1 @@ -96,6 +97,7 @@ #define QT_NO_GEOM_VARIANT #define QT_FEATURE_sharedmemory -1 #define QT_FEATURE_systemsemaphore -1 +#define QT_FEATURE_sys_auxv (QT_HAS_INCLUDE() ? 1 : -1) #ifdef QT_BUILD_QMAKE #define QT_FEATURE_commandlineparser -1 diff --git a/src/corelib/global/qrandom.cpp b/src/corelib/global/qrandom.cpp index 83a309b143..6a92260c46 100644 --- a/src/corelib/global/qrandom.cpp +++ b/src/corelib/global/qrandom.cpp @@ -46,13 +46,13 @@ #include #include -#if QT_HAS_INCLUDE() +#if QT_CONFIG(cxx11_random) # include # include "qdeadlinetimer.h" # include "qhashfunctions.h" #endif -#if QT_HAS_INCLUDE() +#if QT_CONFIG(sys_auxv) # include #endif @@ -213,7 +213,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_HAS_INCLUDE() +#elif QT_CONFIG(cxx11_random) static QBasicAtomicInteger seed = Q_BASIC_ATOMIC_INITIALIZER(0U); static void fallback_update_seed(unsigned value) { diff --git a/tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp b/tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp index 1909f4879f..83bee29d1a 100644 --- a/tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp +++ b/tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp @@ -34,11 +34,11 @@ #include #include -#if QT_HAS_INCLUDE() +#if QT_CONFIG(cxx11_random) # include #endif -#if QT_HAS_INCLUDE() || defined(Q_OS_WIN) +#if QT_CONFIG(cxx11_random) || defined(Q_OS_BSD4) || defined(Q_OS_WIN) # define HAVE_FALLBACK_ENGINE #endif @@ -468,7 +468,7 @@ template void seedStdRandomEngine() void tst_QRandomGenerator::seedStdRandomEngines() { -#if !QT_HAS_INCLUDE() +#if !QT_CONFIG(cxx11_random) QSKIP(" not found"); #else seedStdRandomEngine(); @@ -511,7 +511,7 @@ void tst_QRandomGenerator::stdUniformIntDistribution_data() void tst_QRandomGenerator::stdUniformIntDistribution() { -#if !QT_HAS_INCLUDE() +#if !QT_CONFIG(cxx11_random) QSKIP(" not found"); #else QFETCH(uint, control); @@ -580,8 +580,11 @@ void tst_QRandomGenerator::stdUniformIntDistribution() void tst_QRandomGenerator::stdGenerateCanonical() { -#if !QT_HAS_INCLUDE() +#if !QT_CONFIG(cxx11_random) QSKIP(" not found"); +#elif 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 QFETCH(uint, control); setRNGControl(control); @@ -631,7 +634,7 @@ void tst_QRandomGenerator::stdUniformRealDistribution_data() void tst_QRandomGenerator::stdUniformRealDistribution() { -#if !QT_HAS_INCLUDE() +#if !QT_CONFIG(cxx11_random) QSKIP(" not found"); #else QFETCH(uint, control); @@ -665,7 +668,7 @@ void tst_QRandomGenerator::stdUniformRealDistribution() void tst_QRandomGenerator::stdRandomDistributions() { -#if !QT_HAS_INCLUDE() +#if !QT_CONFIG(cxx11_random) QSKIP(" not found"); #else // just a compile check for some of the distributions, besides