Commit d9c257a7 by Paolo Carlini Committed by Paolo Carlini

re PR libstdc++/51795 (linear_congruential_engine doesn't work correctly)

2012-01-27  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/51795
	* include/bits/random.h (linear_congruential_generator): Add
	static_assert preventing instantiation for values of 'a' and 'm'
	currently handled incorrectly but _Mod::__calc.
	* include/bits/random.tcc (seed_seq::generate): Avoid unsafe
	uses of _Mod::__calc.

From-SVN: r183655
parent af5c13eb
2012-01-27 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/51795
* include/bits/random.h (linear_congruential_generator): Add
static_assert preventing instantiation for values of 'a' and 'm'
currently handled incorrectly but _Mod::__calc.
* include/bits/random.tcc (seed_seq::generate): Avoid unsafe
uses of _Mod::__calc.
2012-01-27 Jakub Jelinek <jakub@redhat.com> 2012-01-27 Jakub Jelinek <jakub@redhat.com>
PR libstdc++/51798 PR libstdc++/51798
......
// random number generation -*- C++ -*- // random number generation -*- C++ -*-
// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. // Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the // software; you can redistribute it and/or modify it under the
...@@ -174,6 +174,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -174,6 +174,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static_assert(__m == 0u || (__a < __m && __c < __m), static_assert(__m == 0u || (__a < __m && __c < __m),
"template argument substituting __m out of bounds"); "template argument substituting __m out of bounds");
// XXX FIXME:
// _Mod::__calc should handle correctly __m % __a >= __m / __a too.
static_assert(__m % __a < __m / __a,
"sorry, not implemented yet: try a smaller 'a' constant");
public: public:
/** The type of the generated random value. */ /** The type of the generated random value. */
typedef _UIntType result_type; typedef _UIntType result_type;
......
// random number generation (out of line) -*- C++ -*- // random number generation (out of line) -*- C++ -*-
// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. // Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the // software; you can redistribute it and/or modify it under the
...@@ -49,6 +49,8 @@ namespace std _GLIBCXX_VISIBILITY(default) ...@@ -49,6 +49,8 @@ namespace std _GLIBCXX_VISIBILITY(default)
// //
// Preconditions: a > 0, m > 0. // Preconditions: a > 0, m > 0.
// //
// XXX FIXME: as-is, only works correctly for __m % __a < __m / __a.
//
template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool> template<typename _Tp, _Tp __m, _Tp __a, _Tp __c, bool>
struct _Mod struct _Mod
{ {
...@@ -2771,8 +2773,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -2771,8 +2773,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
^ __begin[(__k + __p) % __n] ^ __begin[(__k + __p) % __n]
^ __begin[(__k - 1) % __n]); ^ __begin[(__k - 1) % __n]);
_Type __r1 = __arg ^ (__arg >> 27); _Type __r1 = __arg ^ (__arg >> 27);
__r1 = __detail::__mod<_Type, __detail::_Shift<_Type, 32>::__value, __r1 = __detail::__mod<_Type,
1664525u, 0u>(__r1); __detail::_Shift<_Type, 32>::__value>(1664525u * __r1);
_Type __r2 = __r1; _Type __r2 = __r1;
if (__k == 0) if (__k == 0)
__r2 += __s; __r2 += __s;
...@@ -2793,8 +2795,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -2793,8 +2795,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ __begin[(__k + __p) % __n] + __begin[(__k + __p) % __n]
+ __begin[(__k - 1) % __n]); + __begin[(__k - 1) % __n]);
_Type __r3 = __arg ^ (__arg >> 27); _Type __r3 = __arg ^ (__arg >> 27);
__r3 = __detail::__mod<_Type, __detail::_Shift<_Type, 32>::__value, __r3 = __detail::__mod<_Type,
1566083941u, 0u>(__r3); __detail::_Shift<_Type, 32>::__value>(1566083941u * __r3);
_Type __r4 = __r3 - __k % __n; _Type __r4 = __r3 - __k % __n;
__r4 = __detail::__mod<_Type, __r4 = __detail::__mod<_Type,
__detail::_Shift<_Type, 32>::__value>(__r4); __detail::_Shift<_Type, 32>::__value>(__r4);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment