X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e709643ef0c5b61c6c878016c418bffa2b1b20cd..6db44d40a0cb94c4ad8fac6861e349057bf932e7:/src/mc/compare.cpp diff --git a/src/mc/compare.cpp b/src/mc/compare.cpp index 70c2982251..82c157ce10 100644 --- a/src/mc/compare.cpp +++ b/src/mc/compare.cpp @@ -10,6 +10,8 @@ #include "src/mc/mc_smx.hpp" #include "src/mc/sosp/Snapshot.hpp" +#include + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_compare, xbt, "Logging specific to mc_compare in mc"); using simgrid::mc::remote; @@ -38,8 +40,8 @@ public: } }; -typedef std::array HeapLocationPair; -typedef std::set HeapLocationPairs; +using HeapLocationPair = std::array; +using HeapLocationPairs = std::set; class HeapArea : public HeapLocation { public: @@ -134,21 +136,9 @@ public: static ssize_t heap_comparison_ignore_size(const std::vector* ignore_list, const void* address) { - int start = 0; - int end = ignore_list->size() - 1; - - while (start <= end) { - unsigned int cursor = (start + end) / 2; - simgrid::mc::IgnoredHeapRegion const& region = (*ignore_list)[cursor]; - if (region.address == address) - return region.size; - if (region.address < address) - start = cursor + 1; - if (region.address > address) - end = cursor - 1; - } - - return -1; + auto pos = std::lower_bound(ignore_list->begin(), ignore_list->end(), address, + [](auto const& reg, auto const* addr) { return reg.address < addr; }); + return (pos != ignore_list->end() && pos->address == address) ? pos->size : -1; } static bool is_stack(const void *address) @@ -242,10 +232,10 @@ static bool mmalloc_heap_differ(StateComparator& state, const Snapshot& snapshot snapshot2.read(RemotePtr((std::uint64_t)heapinfo_address)); while (i1 < state.heaplimit) { - const malloc_info* heapinfo1 = - (const malloc_info*)heap_region1->read(&heapinfo_temp1, &heapinfos1[i1], sizeof(malloc_info)); - const malloc_info* heapinfo2 = - (const malloc_info*)heap_region2->read(&heapinfo_temp2, &heapinfos2[i1], sizeof(malloc_info)); + const auto* heapinfo1 = + static_cast(heap_region1->read(&heapinfo_temp1, &heapinfos1[i1], sizeof(malloc_info))); + const auto* heapinfo2 = + static_cast(heap_region2->read(&heapinfo_temp2, &heapinfos2[i1], sizeof(malloc_info))); if (heapinfo1->type == MMALLOC_TYPE_FREE || heapinfo1->type == MMALLOC_TYPE_HEAPINFO) { /* Free block */ i1 ++; @@ -295,8 +285,8 @@ static bool mmalloc_heap_differ(StateComparator& state, const Snapshot& snapshot continue; } - const malloc_info* heapinfo2b = - (const malloc_info*)heap_region2->read(&heapinfo_temp2b, &heapinfos2[i2], sizeof(malloc_info)); + const auto* heapinfo2b = + static_cast(heap_region2->read(&heapinfo_temp2b, &heapinfos2[i2], sizeof(malloc_info))); if (heapinfo2b->type != MMALLOC_TYPE_UNFRAGMENTED) { i2++; @@ -331,7 +321,7 @@ static bool mmalloc_heap_differ(StateComparator& state, const Snapshot& snapshot if (state.equals_to_<1>(i1, j1).valid_) continue; - void* addr_frag1 = (void*)((char*)addr_block1 + (j1 << heapinfo1->type)); + void* addr_frag1 = (char*)addr_block1 + (j1 << heapinfo1->type); size_t i2 = 1; bool equal = false; @@ -345,8 +335,8 @@ static bool mmalloc_heap_differ(StateComparator& state, const Snapshot& snapshot } while (i2 < state.heaplimit && not equal) { - const malloc_info* heapinfo2b = - (const malloc_info*)heap_region2->read(&heapinfo_temp2b, &heapinfos2[i2], sizeof(malloc_info)); + const auto* heapinfo2b = + static_cast(heap_region2->read(&heapinfo_temp2b, &heapinfos2[i2], sizeof(malloc_info))); if (heapinfo2b->type == MMALLOC_TYPE_FREE || heapinfo2b->type == MMALLOC_TYPE_HEAPINFO) { i2 ++; @@ -391,8 +381,8 @@ static bool mmalloc_heap_differ(StateComparator& state, const Snapshot& snapshot /* All blocks/fragments are equal to another block/fragment_ ? */ for (size_t i = 1; i < state.heaplimit; i++) { - const malloc_info* heapinfo1 = - (const malloc_info*)heap_region1->read(&heapinfo_temp1, &heapinfos1[i], sizeof(malloc_info)); + const auto* heapinfo1 = + static_cast(heap_region1->read(&heapinfo_temp1, &heapinfos1[i], sizeof(malloc_info))); if (heapinfo1->type == MMALLOC_TYPE_UNFRAGMENTED && i1 == state.heaplimit && heapinfo1->busy_block.busy_size > 0 && not state.equals_to_<1>(i, 0).valid_) { @@ -410,8 +400,8 @@ static bool mmalloc_heap_differ(StateComparator& state, const Snapshot& snapshot } for (size_t i = 1; i < state.heaplimit; i++) { - const malloc_info* heapinfo2 = - (const malloc_info*)heap_region2->read(&heapinfo_temp2, &heapinfos2[i], sizeof(malloc_info)); + const auto* heapinfo2 = + static_cast(heap_region2->read(&heapinfo_temp2, &heapinfos2[i], sizeof(malloc_info))); if (heapinfo2->type == MMALLOC_TYPE_UNFRAGMENTED && i1 == state.heaplimit && heapinfo2->busy_block.busy_size > 0 && not state.equals_to_<2>(i, 0).valid_) { XBT_DEBUG("Block %zu not found (size used = %zu)", i, @@ -748,7 +738,6 @@ static bool heap_area_differ(StateComparator& state, const void* area1, const vo int new_size2 = -1; Type* new_type1 = nullptr; - Type* new_type2 = nullptr; bool match_pairs = false; @@ -810,10 +799,10 @@ static bool heap_area_differ(StateComparator& state, const void* area1, const vo const Region* heap_region1 = MC_get_heap_region(snapshot1); const Region* heap_region2 = MC_get_heap_region(snapshot2); - const malloc_info* heapinfo1 = - (const malloc_info*)heap_region1->read(&heapinfo_temp1, &heapinfos1[block1], sizeof(malloc_info)); - const malloc_info* heapinfo2 = - (const malloc_info*)heap_region2->read(&heapinfo_temp2, &heapinfos2[block2], sizeof(malloc_info)); + const auto* heapinfo1 = + static_cast(heap_region1->read(&heapinfo_temp1, &heapinfos1[block1], sizeof(malloc_info))); + const auto* heapinfo2 = + static_cast(heap_region2->read(&heapinfo_temp2, &heapinfos2[block2], sizeof(malloc_info))); if ((heapinfo1->type == MMALLOC_TYPE_FREE || heapinfo1->type==MMALLOC_TYPE_HEAPINFO) && (heapinfo2->type == MMALLOC_TYPE_FREE || heapinfo2->type ==MMALLOC_TYPE_HEAPINFO)) { @@ -877,8 +866,8 @@ static bool heap_area_differ(StateComparator& state, const void* area1, const vo ssize_t frag2 = (ADDR2UINT(area2) % BLOCKSIZE) >> heapinfo2->type; // Process address of the fragment_: - void* real_addr_frag1 = (void*)((char*)real_addr_block1 + (frag1 << heapinfo1->type)); - void* real_addr_frag2 = (void*)((char*)real_addr_block2 + (frag2 << heapinfo2->type)); + void* real_addr_frag1 = (char*)real_addr_block1 + (frag1 << heapinfo1->type); + void* real_addr_frag2 = (char*)real_addr_block2 + (frag2 << heapinfo2->type); // Check the size of the fragments against the size of the type: if (type_size != -1) { @@ -925,10 +914,12 @@ static bool heap_area_differ(StateComparator& state, const void* area1, const vo // The type of the variable is already known: if (type) { - new_type1 = new_type2 = type; + new_type1 = type; } // Type inference from the block type. else if (state.types_<1>(block1, frag1) != nullptr || state.types_<2>(block2, frag2) != nullptr) { + Type* new_type2 = nullptr; + offset1 = (const char*)area1 - (const char*)real_addr_frag1; offset2 = (const char*)area2 - (const char*)real_addr_frag2; @@ -1015,7 +1006,6 @@ static bool areas_differ_with_type(simgrid::mc::StateComparator& state, const vo const simgrid::mc::Type* subtype; const simgrid::mc::Type* subsubtype; int elm_size; - int i; xbt_assert(type != nullptr); switch (type->type) { @@ -1060,7 +1050,7 @@ static bool areas_differ_with_type(simgrid::mc::StateComparator& state, const vo default: return false; } - for (i = 0; i < type->element_count; i++) { + for (int i = 0; i < type->element_count; i++) { size_t off = i * elm_size; if (areas_differ_with_type(state, (const char*)real_area1 + off, snapshot1, region1, (const char*)real_area2 + off, snapshot2, region2, type->subtype, pointer_level))