summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2017-06-06 18:28:37 -0700
committerThiago Macieira <thiago.macieira@intel.com>2017-06-20 16:37:35 +0000
commit0669f71b0c78c0d3374571d266004d7503ca8b12 (patch)
tree9c5ee9a5be7f02c2ca6c52a5987f0c406622694a
parent4de40514066e7e31fe02c87afaf0863d6928391f (diff)
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 <random> and <sys/auxv.h>. 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 <random> anyway. As for <sys/auxv.h>, 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 <lars.knoll@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
-rw-r--r--config.tests/unix/cxx11_random/cxx11_random.cpp35
-rw-r--r--config.tests/unix/cxx11_random/cxx11_random.pro1
-rw-r--r--config.tests/unix/sys_auxv/sys_auxv.cpp34
-rw-r--r--config.tests/unix/sys_auxv/sys_auxv.pro1
-rw-r--r--src/corelib/configure.json25
-rw-r--r--src/corelib/global/qconfig-bootstrapped.h2
-rw-r--r--src/corelib/global/qrandom.cpp6
-rw-r--r--tests/auto/corelib/global/qrandomgenerator/tst_qrandomgenerator.cpp17
8 files changed, 111 insertions, 10 deletions
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 <random>
+
+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 <sys/auxv.h>
+
+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 <random>",
+ "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 <random>",
+ "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",
@@ -631,6 +651,11 @@ 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",
"message": "Your C library does not provide sscanf_l or snprintf_l.
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(<random>) ? 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(<sys/auxv.h>) ? 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 <qthreadstorage.h>
#include <private/qsimd_p.h>
-#if QT_HAS_INCLUDE(<random>)
+#if QT_CONFIG(cxx11_random)
# include <random>
# include "qdeadlinetimer.h"
# include "qhashfunctions.h"
#endif
-#if QT_HAS_INCLUDE(<sys/auxv.h>)
+#if QT_CONFIG(sys_auxv)
# include <sys/auxv.h>
#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(<chrono>)
+#elif QT_CONFIG(cxx11_random)
static QBasicAtomicInteger<unsigned> 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 <private/qrandom_p.h>
#include <algorithm>
-#if QT_HAS_INCLUDE(<random>)
+#if QT_CONFIG(cxx11_random)
# include <random>
#endif
-#if QT_HAS_INCLUDE(<random>) || 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 <typename Engine> void seedStdRandomEngine()
void tst_QRandomGenerator::seedStdRandomEngines()
{
-#if !QT_HAS_INCLUDE(<random>)
+#if !QT_CONFIG(cxx11_random)
QSKIP("<random> not found");
#else
seedStdRandomEngine<std::default_random_engine>();
@@ -511,7 +511,7 @@ void tst_QRandomGenerator::stdUniformIntDistribution_data()
void tst_QRandomGenerator::stdUniformIntDistribution()
{
-#if !QT_HAS_INCLUDE(<random>)
+#if !QT_CONFIG(cxx11_random)
QSKIP("<random> not found");
#else
QFETCH(uint, control);
@@ -580,8 +580,11 @@ void tst_QRandomGenerator::stdUniformIntDistribution()
void tst_QRandomGenerator::stdGenerateCanonical()
{
-#if !QT_HAS_INCLUDE(<random>)
+#if !QT_CONFIG(cxx11_random)
QSKIP("<random> 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(<random>)
+#if !QT_CONFIG(cxx11_random)
QSKIP("<random> not found");
#else
QFETCH(uint, control);
@@ -665,7 +668,7 @@ void tst_QRandomGenerator::stdUniformRealDistribution()
void tst_QRandomGenerator::stdRandomDistributions()
{
-#if !QT_HAS_INCLUDE(<random>)
+#if !QT_CONFIG(cxx11_random)
QSKIP("<random> not found");
#else
// just a compile check for some of the distributions, besides