From: Gabriel Corona Date: Tue, 18 Mar 2014 11:51:30 +0000 (+0100) Subject: [mc] Fix mismatch between expected snapshot address and passed process address X-Git-Tag: v3_11~199^2~2^2~9 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/0c69daa2ab4a3b7d034934a2a2d53138b9333f06?ds=sidebyside [mc] Fix mismatch between expected snapshot address and passed process address Function 'compare_areas_with_type' expects snapshot addresses but was passed process/real addresses in a recursive call. It is very easy to mix the two types of addresses :/ --- diff --git a/src/mc/mc_compare.c b/src/mc/mc_compare.c index 4bb3b2d1af..b2be1fd2ff 100644 --- a/src/mc/mc_compare.c +++ b/src/mc/mc_compare.c @@ -166,13 +166,13 @@ static int compare_areas_with_type(void *area1, void *area2, mc_snapshot_t snaps case DW_TAG_pointer_type: case DW_TAG_reference_type: case DW_TAG_rvalue_reference_type: + + addr_pointed1 = *((void **)(area1)); + addr_pointed2 = *((void **)(area2)); + if(type->subtype && type->subtype->type == DW_TAG_subroutine_type){ - addr_pointed1 = *((void **)(area1)); - addr_pointed2 = *((void **)(area2)); return (addr_pointed1 != addr_pointed2); }else{ - addr_pointed1 = *((void **)(area1)); - addr_pointed2 = *((void **)(area2)); if(addr_pointed1 == NULL && addr_pointed2 == NULL) return 0; @@ -199,8 +199,12 @@ static int compare_areas_with_type(void *area1, void *area2, mc_snapshot_t snaps return 1; if(type->dw_type_id == NULL) return (addr_pointed1 != addr_pointed2); - else - return compare_areas_with_type(addr_pointed1, addr_pointed2, snapshot1, snapshot2, info, other_info, type->subtype, region_size, region_type, start_data, pointer_level); + else { + void* translated_addr_pointer1 = mc_translate_address((uintptr_t)addr_pointed1, snapshot1); + void* translated_addr_pointer2 = mc_translate_address((uintptr_t)addr_pointed2, snapshot2); + return compare_areas_with_type( + translated_addr_pointer1, translated_addr_pointer2, snapshot1, snapshot2, info, other_info, type->subtype, region_size, region_type, start_data, pointer_level); + } } else{