public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jonathan Wakely <jwakely@redhat.com>
To: Xi Ruoyao <ryxi@stu.xidian.edu.cn>
Cc: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org
Subject: Re: [PATCH] Implement non-trivial std::random_device::entropy (PR libstdc++/67578)
Date: Mon, 22 May 2017 13:21:00 -0000	[thread overview]
Message-ID: <20170522130058.GF4527@redhat.com> (raw)
In-Reply-To: <1495106850.1663.8.camel@stu.xidian.edu.cn>

[-- Attachment #1: Type: text/plain, Size: 1925 bytes --]

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.


[-- Attachment #2: patch.txt --]
[-- Type: text/x-patch, Size: 5948 bytes --]

commit 2e6f7939b6ab2ac0e25af6fc57085bcef8381d04
Author: Jonathan Wakely <jwakely@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  <ryxi@stu.xidian.edu.cn>
    	    Jonathan Wakely  <jwakely@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");

  reply	other threads:[~2017-05-22 13:01 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-18 12:15 Xi Ruoyao
2017-05-22 13:21 ` Jonathan Wakely [this message]
2017-05-22 13:50   ` Xi Ruoyao
2017-05-22 14:10     ` Jonathan Wakely
2017-05-22 14:19       ` Xi Ruoyao
2017-05-23 12:11         ` Jonathan Wakely
2017-05-22 14:30       ` [PATCH v2] " Xi Ruoyao
2017-05-23 16:22         ` Jonathan Wakely
2017-05-24 19:28           ` Jonathan Wakely

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170522130058.GF4527@redhat.com \
    --to=jwakely@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=libstdc++@gcc.gnu.org \
    --cc=ryxi@stu.xidian.edu.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).