bool all_zero(const char *buffer, const int64_t size) { bool bret = true; const char *buffer_end = buffer + size; const char *start = (char*)upper_align((int64_t)buffer, sizeof(int64_t)); start = std::min(start, buffer_end); const char *end = (char*)lower_align((int64_t)(buffer + size), sizeof(int64_t)); end = std::max(end, buffer); bret = all_zero_small(buffer, start - buffer); if (bret) { bret = all_zero_small(end, buffer + size - end); } if (bret) { const char *iter = start; while (iter < end) { if (0 != *((int64_t*)iter)) { bret = false; break; } iter += sizeof(int64_t); } } return bret; };
// DebugAllocator::_fill_memory void DebugAllocator::_fill_memory( FillMode i_mode, void * i_start_address, size_t i_size ) { switch( i_mode ) { case eNone: break; case eNaNs: { typedef memo_externals::FloatNanIntegerRepresentationType FloatIntType; void * start = upper_align( i_start_address, MEMO_ALIGNMENT_OF(uint32_t) ); void * const end = address_add( i_start_address, i_size ); void * const aligned_end = lower_align( end, MEMO_ALIGNMENT_OF(uint32_t) ); uint32_t * dest = static_cast<uint32_t *>( start ); for( ; dest < aligned_end; dest++ ) { *dest = memo_externals::g_float_nan_integer_representation; } char * c_dest = reinterpret_cast<char *>( dest ); for( ; c_dest < end; c_dest++ ) { *c_dest = 'N'; } break; } case ePseudoRandom: { void * start = upper_align( i_start_address, MEMO_ALIGNMENT_OF(uint32_t) ); void * const end = address_add( i_start_address, i_size ); void * const aligned_end = lower_align( end, MEMO_ALIGNMENT_OF(uint32_t) ); uint32_t * dest = static_cast<uint32_t *>( start ); uint32_t random = static_cast<uint32_t>( reinterpret_cast<uintptr_t>( dest ) &0xFFFFFFFF ); for( ; dest < aligned_end; dest++ ) { generate_rand_32( random ); *dest = random; } char * c_dest = reinterpret_cast<char *>( dest ); for( ; c_dest < end; c_dest++ ) { *c_dest = 'D'; } break; } case eBadF00d: { void * start = upper_align( i_start_address, MEMO_ALIGNMENT_OF(uint32_t) ); void * const end = address_add( i_start_address, i_size ); void * const aligned_end = lower_align( end, MEMO_ALIGNMENT_OF(uint32_t) ); uint32_t * dest = static_cast<uint32_t *>( start ); for( ; dest < aligned_end; dest++ ) { *dest = 0xBADF00D; } char * c_dest = reinterpret_cast<char *>( dest ); for( ; c_dest < end; c_dest++ ) { *c_dest = 'B'; } break; } default: MEMO_ASSERT( false ); // unknown value } }