Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix mismatch between expected snapshot address and passed process address
authorGabriel Corona <gabriel.corona@loria.fr>
Tue, 18 Mar 2014 11:51:30 +0000 (12:51 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Tue, 18 Mar 2014 11:55:17 +0000 (12:55 +0100)
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 :/

src/mc/mc_compare.c

index 4bb3b2d..b2be1fd 100644 (file)
@@ -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{