[Bug libstdc++/105502] New: std::normal_distribution deserialization issue
frank.marschner at cognitec dot com
gcc-bugzilla@gcc.gnu.org
Fri May 6 08:28:01 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105502
Bug ID: 105502
Summary: std::normal_distribution deserialization issue
Product: gcc
Version: 9.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: frank.marschner at cognitec dot com
Target Milestone: ---
Found an issue deserializing an serialized instance of
std::normal_distribution.
Depending on the amount of random numbers generated deserialization
works or not.
The issue was introduced with commit
160e95dc3d73329d2367fb405ef9f0e12bd2cc7b on file bits/random.tcc from Jan 9,
2020.
The issue is in the implementation of
template< class CharT, class Traits >
friend std::basic_istream<CharT,Traits>&
operator>>( std::basic_istream<CharT,Traits>& ist,
normal_distribution& d );
The commit introduces wrong initialization of members param (mean and
stddev) and also _M_saved_available depending on __saved_avail.
The following example demonstrates the issue
---8<----------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <random>
void test_serialization( const std::normal_distribution<>& nd)
{
std::stringstream sss;
sss << nd;
std::normal_distribution<> newND;
sss >> newND;
if( nd == newND) {
std::cout << "Serialization successful." << std::endl;
} else {
std::cout << "Serialization not successful." << std::endl;
}
}
int main( int argc, char** argv)
{
std::mt19937 gen{ 42};
std::normal_distribution<> d{ 4, 2};
test_serialization( d);
const auto result0 = d(gen);
test_serialization( d);
const auto result1 = d(gen);
test_serialization( d);
const auto result2 = d(gen);
test_serialization( d);
}
---8<----------------------------------------------------------------
The output running the code shows
Serialization not successful.
Serialization successful.
Serialization not successful.
Serialization successful.
The issues covers gcc versions since 8.4 up to recent.
More information about the Gcc-bugs
mailing list