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:
Ion Gaztañaga
2024-01-04 00:59:38 +01:00
parent 3c8c087eb7
commit 6e697d7968

View File

@@ -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;
} }
} }