diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index e8858b6507..6301e7595d 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -721,15 +721,18 @@ size_t qHash(QLatin1String key, size_t seed) noexcept /*! \internal + + Note: not \c{noexcept}, but called from a \c{noexcept} function and thus + will cause termination if any of the functions here throw. */ static size_t qt_create_qhash_seed() { size_t seed = 0; #ifndef QT_BOOTSTRAPPED - QByteArray envSeed = qgetenv("QT_HASH_SEED"); - if (!envSeed.isEmpty()) { - seed = envSeed.toUInt(); + bool ok; + seed = qEnvironmentVariableIntValue("QT_HASH_SEED", &ok); + if (ok) { if (seed) { // can't use qWarning here (reentrancy) fprintf(stderr, "QT_HASH_SEED: forced seed value is not 0; ignored.\n"); @@ -757,7 +760,7 @@ static QBasicAtomicInteger qt_qhash_seed = Q_BASIC_ATOMIC_INITIALIZER(0) \internal \threadsafe - Initializes the seed and returns it + Initializes the seed and returns it. */ static size_t qt_initialize_qhash_seed() { @@ -821,7 +824,7 @@ static size_t qt_initialize_qhash_seed() will be zero if setDeterministicGlobalSeed() has been called or if the \c{QT_HASH_SEED} environment variable is set to zero. */ -QHashSeed QHashSeed::globalSeed() +QHashSeed QHashSeed::globalSeed() noexcept { size_t seed = qt_qhash_seed.loadRelaxed(); if (Q_UNLIKELY(seed == 0)) diff --git a/src/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h index 83c9f35f3f..76e781da7a 100644 --- a/src/corelib/tools/qhashfunctions.h +++ b/src/corelib/tools/qhashfunctions.h @@ -73,7 +73,7 @@ struct QHashSeed constexpr QHashSeed(size_t d = 0) : data(d) {} constexpr operator size_t() const noexcept { return data; } - static Q_CORE_EXPORT QHashSeed globalSeed() Q_DECL_PURE_FUNCTION; + static Q_CORE_EXPORT QHashSeed globalSeed() noexcept Q_DECL_PURE_FUNCTION; static Q_CORE_EXPORT void setDeterministicGlobalSeed(); static Q_CORE_EXPORT void resetRandomGlobalSeed(); private: