mirror of
https://github.com/boostorg/container.git
synced 2025-07-31 21:14:30 +02:00
Rewrite default_init_test() to make harder for the compiler to optimize because we rely on UB to test memory was not initialized.
This commit is contained in:
@@ -627,43 +627,43 @@ bool default_init_test()//Test for default initialization
|
|||||||
{
|
{
|
||||||
const std::size_t Capacity = 100;
|
const std::size_t Capacity = 100;
|
||||||
|
|
||||||
typedef static_vector<int, Capacity> di_vector_t;
|
typedef static_vector<unsigned char, Capacity> di_vector_t;
|
||||||
|
|
||||||
{
|
|
||||||
di_vector_t v(Capacity, default_init);
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
typename dtl::aligned_storage<sizeof(di_vector_t)>::type as;
|
typename dtl::aligned_storage<sizeof(di_vector_t)>::type as;
|
||||||
di_vector_t& v = *::new(as.data) di_vector_t;
|
di_vector_t *pv = ::new(as.data)di_vector_t(Capacity);
|
||||||
int *p = v.data();
|
|
||||||
|
|
||||||
for(std::size_t i = 0; i != Capacity; ++i, ++p){
|
//Use volatile pointer to make compiler's job harder, as we are riding on UB
|
||||||
*p = static_cast<int>(i);
|
volatile unsigned char * pch_data = pv->data();
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i != Capacity; ++i) {
|
||||||
|
pch_data[i] = static_cast<unsigned char>(i);
|
||||||
}
|
}
|
||||||
|
pv->~di_vector_t();
|
||||||
|
|
||||||
di_vector_t &rv = *::new(&v)di_vector_t(Capacity, default_init);
|
pv = ::new(as.data) di_vector_t(Capacity, default_init);
|
||||||
di_vector_t::iterator it = rv.begin();
|
pv->~di_vector_t();
|
||||||
|
|
||||||
for(std::size_t i = 0; i != Capacity; ++i, ++it){
|
for(std::size_t i = 0; i != Capacity; ++i){
|
||||||
if(*it != static_cast<int>(i))
|
if (pch_data[i] != static_cast<unsigned char>(i)){
|
||||||
|
std::cout << "failed in iteration" << i << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
v.~di_vector_t();
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
di_vector_t v;
|
di_vector_t v;
|
||||||
|
|
||||||
int *p = v.data();
|
unsigned char *p = v.data();
|
||||||
for(std::size_t i = 0; i != Capacity; ++i, ++p){
|
for(std::size_t i = 0; i != Capacity; ++i, ++p){
|
||||||
*p = static_cast<int>(i+100);
|
*p = static_cast<unsigned char>(i+100);
|
||||||
}
|
}
|
||||||
|
|
||||||
v.resize(Capacity, default_init);
|
v.resize(Capacity, default_init);
|
||||||
|
|
||||||
di_vector_t::iterator it = v.begin();
|
di_vector_t::iterator it = v.begin();
|
||||||
for(std::size_t i = 0; i != Capacity; ++i, ++it){
|
for(std::size_t i = 0; i != Capacity; ++i, ++it){
|
||||||
if(*it != static_cast<int>(i+100))
|
if(*it != static_cast<unsigned char>(i+100))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user