On 18/05/17 19:27 +0800, Xi Ruoyao wrote:
This patch use ioctl to get entropy of std::random_device using /dev/random and /dev/urandom.
This is a nice addition, thanks. N.B. I couldn't apply your patch, several lines had U+00A0 (i.e. NO-BREAK SPACE) characters where normal spaces should be. I don't know if this is something your mail client did, but maybe attaching the patch as a multipart message rather than including it inline in the body will prevent it in future.
diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 3e6e70b..39ad330 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -1963,6 +1963,9 @@ GLIBCXX_3.4.23 { _ZNSt13__future_base13_State_baseV211_Make_ready6_M_setEv; #endif + # std::random_device::_M_getentropy() const + _ZNKSt13random_device13_M_getentropyEv; + } GLIBCXX_3.4.22;
The 3.4.23 version is now "closed" because it was used for the GCC 7.1 release, and so we can't add new symbols to it. That means we need to bump the library version and create a new GLIBCXX_3.4.24 version node. The required steps are documented in doc/xml/manual/build_hacking.xml (and done by the attached patch which I'm testing).
@@ -161,6 +169,34 @@ namespace std _GLIBCXX_VISIBILITY(default) return _M_mt(); } + double + random_device::_M_getentropy() const noexcept + { +#if defined _GLIBCXX_HAVE_SYS_IOCTL_H && \ + defined _GLIBCXX_HAVE_LINUX_RANDOM_H
Is RNDGETENTCNT guaranteed to be defined by all versions of <linux/random.h>? Would it be better to check for it explicitly? i.e. #if defined _GLIBCXX_HAVE_SYS_IOCTL_H && defined RNDGETENTCNT It would also be nice to have a test for this functionality, but since the available entropy might be zero sometimes we can't guarantee that a test for a non-zero value will always pass.
commit 2e6f7939b6ab2ac0e25af6fc57085bcef8381d04 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon May 22 13:36:53 2017 +0100 PR libstdc++/67578 Implement non-trivial std::random_device::entropy 2017-05-22 Xi Ruoyao <r...@stu.xidian.edu.cn> Jonathan Wakely <jwak...@redhat.com> PR libstdc++/67578 * acinclude.m4: Bump libtool_VERSION. * config/abi/pre/gnu.ver: Add GLIBCXX_3.4.23 with new symbol. * config.h.in: Regenerate. * configure: Regenerate. * configure.ac: Add test for <linux/random.h>. * doc/xml/manual/abi.xml: Document new library version. * include/bits/random.h (random_device::entropy) [_GLIBCXX_USE_RANDOM_TR1]: Add call to new _M_getentropy member. (random_device::_M_getentropy): Declare. * src/c++11/random.cc (random_device::_M_getentropy): Define. * testsuite/util/testsuite_abi.cc: Add GLIBCXX_3.4.24 to known versions. diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index 61c8cb2..baeea67 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -3750,7 +3750,7 @@ changequote([,])dnl fi # For libtool versioning info, format is CURRENT:REVISION:AGE -libtool_VERSION=6:23:0 +libtool_VERSION=6:24:0 # Everything parsed; figure out what files and settings to use. case $enable_symvers in diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 268fb94..48e2ec8 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -1967,6 +1967,13 @@ GLIBCXX_3.4.23 { } GLIBCXX_3.4.22; +GLIBCXX_3.4.24 { + + # std::random_device::_M_getentropy() const + _ZNKSt13random_device13_M_getentropyEv; + +} GLIBCXX_3.4.23; + # Symbols in the support library (libsupc++) have their own tag. CXXABI_1.3 { diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index 8e97350..270dcba 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -237,7 +237,7 @@ AC_CHECK_HEADERS([endian.h execinfo.h float.h fp.h ieeefp.h inttypes.h \ locale.h machine/endian.h machine/param.h nan.h stdint.h stdlib.h string.h \ strings.h sys/ipc.h sys/isa_defs.h sys/machine.h sys/param.h \ sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \ -wchar.h wctype.h]) +wchar.h wctype.h linux/random.h]) # Only do link tests if native. Else, hardcode. if $GLIBCXX_IS_NATIVE; then diff --git a/libstdc++-v3/doc/xml/manual/abi.xml b/libstdc++-v3/doc/xml/manual/abi.xml index d086d9e..de8e66c 100644 --- a/libstdc++-v3/doc/xml/manual/abi.xml +++ b/libstdc++-v3/doc/xml/manual/abi.xml @@ -266,6 +266,7 @@ compatible. <listitem><para>GCC 5.1.0: libstdc++.so.6.0.21</para></listitem> <listitem><para>GCC 6.1.0: libstdc++.so.6.0.22</para></listitem> <listitem><para>GCC 7.1.0: libstdc++.so.6.0.23</para></listitem> + <listitem><para>GCC 8.0.0: libstdc++.so.6.0.24</para></listitem> </itemizedlist> <para> Note 1: Error should be libstdc++.so.3.0.3. @@ -334,6 +335,7 @@ compatible. <listitem><para>GCC 5.1.0: GLIBCXX_3.4.21, CXXABI_1.3.9</para></listitem> <listitem><para>GCC 6.1.0: GLIBCXX_3.4.22, CXXABI_1.3.10</para></listitem> <listitem><para>GCC 7.1.0: GLIBCXX_3.4.23, CXXABI_1.3.11</para></listitem> + <listitem><para>GCC 8.0.0: GLIBCXX_3.4.24, CXXABI_1.3.10</para></listitem> </itemizedlist> </listitem> diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h index d39cc3e..bb761ec 100644 --- a/libstdc++-v3/include/bits/random.h +++ b/libstdc++-v3/include/bits/random.h @@ -1603,7 +1603,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION double entropy() const noexcept - { return 0.0; } + { +#ifdef _GLIBCXX_USE_RANDOM_TR1 + return this->_M_getentropy(); +#else + return 0.0; +#endif + } result_type operator()() @@ -1627,6 +1633,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION result_type _M_getval(); result_type _M_getval_pretr1(); + double _M_getentropy() const noexcept; union { diff --git a/libstdc++-v3/src/c++11/random.cc b/libstdc++-v3/src/c++11/random.cc index df79874..5011cf2 100644 --- a/libstdc++-v3/src/c++11/random.cc +++ b/libstdc++-v3/src/c++11/random.cc @@ -38,6 +38,14 @@ # include <unistd.h> #endif +#ifdef _GLIBCXX_HAVE_SYS_IOCTL_H +# include <sys/ioctl.h> +#endif + +#ifdef _GLIBCXX_HAVE_LINUX_RANDOM_H +# include <linux/random.h> +#endif + namespace std _GLIBCXX_VISIBILITY(default) { namespace @@ -161,6 +169,33 @@ namespace std _GLIBCXX_VISIBILITY(default) return _M_mt(); } + double + random_device::_M_getentropy() const noexcept + { +#if defined _GLIBCXX_HAVE_SYS_IOCTL_H && defined RNDGETENTCNT + if (!_M_file) + return 0.0; + + const int fd = fileno(static_cast<FILE*>(_M_file)); + if (fd < 0) + return 0.0; + + int ent; + if (ioctl(fd, RNDGETENTCNT, &ent) < 0) + return 0.0; + + if (ent < 0) + return 0.0; + + if (static_cast<unsigned>(ent) > sizeof(result_type) * 8) + return static_cast<double>(sizeof(result_type) * 8); + + return static_cast<double>(ent); +#else + return 0.0; +#endif + } + template class mersenne_twister_engine< uint_fast32_t, 32, 624, 397, 31, diff --git a/libstdc++-v3/testsuite/util/testsuite_abi.cc b/libstdc++-v3/testsuite/util/testsuite_abi.cc index f5fc594..953c907 100644 --- a/libstdc++-v3/testsuite/util/testsuite_abi.cc +++ b/libstdc++-v3/testsuite/util/testsuite_abi.cc @@ -204,6 +204,7 @@ check_version(symbol& test, bool added) known_versions.push_back("GLIBCXX_LDBL_3.4.21"); known_versions.push_back("GLIBCXX_3.4.22"); known_versions.push_back("GLIBCXX_3.4.23"); + known_versions.push_back("GLIBCXX_3.4.24"); known_versions.push_back("CXXABI_1.3"); known_versions.push_back("CXXABI_LDBL_1.3"); known_versions.push_back("CXXABI_1.3.1");