From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27788 invoked by alias); 3 Feb 2014 06:38:57 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 27771 invoked by uid 48); 3 Feb 2014 06:38:52 -0000 From: "ppluzhnikov at google dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug libstdc++/60037] New: SIGFPE in std::generate_canonical Date: Mon, 03 Feb 2014 06:38:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: libstdc++ X-Bugzilla-Version: unknown X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: ppluzhnikov at google dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2014-02/txt/msg00098.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60037 Bug ID: 60037 Summary: SIGFPE in std::generate_canonical Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: ppluzhnikov at google dot com When libstdc++-v3/testsuite/ext/random/hypergeometric_distribution/operators/values.cc is built with -O0, I get a crash: Program received signal SIGFPE, Arithmetic exception. 0x0000000000401b07 in std::generate_canonical > (__urng=...) at /build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/random.tcc:3480 3480 return __sum / __tmp; (gdb) bt #0 0x0000000000401b07 in std::generate_canonical > (__urng=...) at /build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/random.tcc:3480 #1 0x00000000004018d9 in std::__detail::_Adaptor, unsigned int>::operator() (this=0x7fffffff9020) at /build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/random.h:190 #2 0x0000000000401785 in __gnu_cxx::hypergeometric_distribution::operator() > ( this=0x7fffffffab40, __urng=..., __param=...) at /gcc-svn/libstdc++-v3/include/ext/random.tcc:1328 #3 0x00000000004016fb in __gnu_cxx::hypergeometric_distribution::operator() > ( this=0x7fffffffab40, __urng=...) at /gcc-svn/build/x86_64-unknown-linux-gnu/libstdc++-v3/include/ext/random:3016 #4 0x0000000000401642 in std::_Bind<__gnu_cxx::hypergeometric_distribution (std::mersenne_twister_engine)>::__call(std::tuple<>&&, std::_Index_tuple<0ul>) (this=0x7fffffffab40, __args=) at /gcc-svn/build/x86_64-unknown-linux-gnu/libstdc++-v3/include/functional:1264 #5 0x0000000000401578 in std::_Bind<__gnu_cxx::hypergeometric_distribution (std::mersenne_twister_engine)>::operator()<, unsigned int>() (this=0x7fffffffab40) at /build/x86_64-unknown-linux-gnu/libstdc++-v3/include/functional:1323 #6 0x0000000000400d4c in __gnu_test::testDiscreteDist<100ul, 100000ul, std::_Bind<__gnu_cxx::hypergeometric_distribution<>(std::mersenne_twister_engine)>, test01():: >(std::_Bind<__gnu_cxx::hypergeometric_distribution(std::mersenne_twister_engine)> &, ) (f=..., pdf=...) at /gcc-svn/libstdc++-v3/testsuite/util/testsuite_random.h:50 #7 0x0000000000400aa9 in test01 () at /gcc-svn/libstdc++-v3/testsuite/ext/random/hypergeometric_distribution/operators/values.cc:42 #8 0x0000000000400b72 in main () at /gcc-svn/libstdc++-v3/testsuite/ext/random/hypergeometric_distribution/operators/values.cc:58 AFAICT, this is happening because: 3461 template 3463 _RealType 3464 generate_canonical(_UniformRandomNumberGenerator& __urng) 3465 { 3466 const size_t __b 3467 = std::min(static_cast(std::numeric_limits<_RealType>::digits), 3468 __bits); 3469 const long double __r = static_cast(__urng.max()) 3470 - static_cast(__urng.min()) + 1.0L; 3471 const size_t __log2r = std::log(__r) / std::log(2.0L); 3472 size_t __k = std::max(1UL, (__b + __log2r - 1UL) / __log2r); 3473 _RealType __sum = _RealType(0); 3474 _RealType __tmp = _RealType(1); 3475 for (; __k != 0; --__k) 3476 { 3477 __sum += _RealType(__urng() - __urng.min()) * __tmp; 3478 __tmp *= __r; 3479 } 3480 return __sum / __tmp; 3481 } 3482 3483 _GLIBCXX_END_NAMESPACE_VERSION 3484 } // namespace at line 3475, we have __r=4294967296, __tmp=1, __k=1. On line 3478, __tmp (which is unsigned int) overflows and becomes 0, and on line 3480 we divide by zero and get SIGFPE.