Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : start heap comparison from local variables
authorMarion Guthmuller <marion.guthmuller@loria.fr>
Thu, 31 Jan 2013 22:05:51 +0000 (23:05 +0100)
committerMarion Guthmuller <marion.guthmuller@loria.fr>
Thu, 31 Jan 2013 23:45:34 +0000 (00:45 +0100)
include/xbt/mmalloc.h
src/include/mc/datatypes.h
src/include/mc/mc.h
src/mc/mc_checkpoint.c
src/mc/mc_compare.c
src/mc/mc_dpor.c
src/mc/mc_global.c
src/mc/mc_private.h
src/simix/smx_smurf_private.h
src/xbt/mmalloc/mm_diff.c

index 0a5dade..6c520bf 100644 (file)
@@ -61,11 +61,12 @@ XBT_PUBLIC( xbt_mheap_t ) mmalloc_get_default_md(void);
 void mmalloc_set_current_heap(xbt_mheap_t new_heap);
 xbt_mheap_t mmalloc_get_current_heap(void);
 
-int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stacks1, xbt_dynar_t *stacks2, xbt_dynar_t equals);
+int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2);
 int mmalloc_linear_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2);
-void init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2);
-void match_equals(xbt_dynar_t list, xbt_dynar_t equals);
-int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equals);
+void init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t to_ignore1, xbt_dynar_t to_ignore2);
+void match_equals(xbt_dynar_t list);
+int compare_area(void *area1, void* area2, xbt_dynar_t previous);
+void reset_heap_information(void);
 
 void mmalloc_backtrace_block_display(void* heapinfo, int block);
 void mmalloc_backtrace_fragment_display(void* heapinfo, int block, int frag);
index d21613c..307e3ea 100644 (file)
@@ -40,6 +40,7 @@ typedef struct s_stack_region{
   char *process_name;
   void *context;
   size_t size;
+  int block;
 }s_stack_region_t, *stack_region_t;
 
 typedef struct s_heap_equality{
@@ -50,5 +51,8 @@ typedef struct s_heap_equality{
 void heap_equality_free_voidp(void *e);
 void stack_region_free_voidp(void *s);
 
+void heap_ignore_region_free(mc_heap_ignore_region_t r);
+void heap_ignore_region_free_voidp(void *r);
+
 SG_END_DECL()
 #endif                          /* _MC_MC_H */
index 4680251..defbf5c 100644 (file)
@@ -32,6 +32,8 @@ extern char*_surf_mc_property_file; /* fixme: better location? */
 
 extern xbt_dynar_t mc_heap_comparison_ignore;
 extern xbt_dynar_t stacks_areas;
+extern void *maestro_stack_start;
+extern void *maestro_stack_end;
 
 /********************************* Global *************************************/
 void _mc_cfg_cb_reduce(const char *name, int pos);
index 1e8e29f..0cde216 100644 (file)
@@ -23,7 +23,6 @@ char *libsimgrid_path;
 void *start_data_libsimgrid, *start_bss_libsimgrid;
 void *start_data_binary, *start_bss_binary;
 void *start_text_binary;
-void *end_raw_heap;
 
 static mc_mem_region_t MC_region_new(int type, void *start_addr, size_t size);
 static void MC_region_restore(mc_mem_region_t reg);
@@ -38,6 +37,7 @@ static void print_local_variables_values(xbt_dynar_t all_variables);
 static void *get_stack_pointer(void *stack_context, void *heap);
 
 static void snapshot_stack_free(mc_snapshot_stack_t s);
+static xbt_dynar_t take_snapshot_ignore(void);
 
 static mc_mem_region_t MC_region_new(int type, void *start_addr, size_t size)
 {
@@ -107,8 +107,9 @@ void MC_init_memory_map_info(){
             start_bss_binary = reg.start_addr;
             i++;
           }
-        }else if(!memcmp(maps->regions[i].pathname, "[heap]", 6)){
-          end_raw_heap = reg.end_addr;
+        }else if(!memcmp(maps->regions[i].pathname, "[stack]", 7)){
+          maestro_stack_start = reg.start_addr;
+          maestro_stack_end = reg.end_addr;
           i++;
         }
       }
@@ -177,8 +178,9 @@ mc_snapshot_t MC_take_snapshot()
             i++;
           }
           MC_snapshot_add_region(snapshot, 1, start, size);
-        }else if(!memcmp(maps->regions[i].pathname, "[heap]", 6)){
-          end_raw_heap = reg.end_addr;
+        }else if(!memcmp(maps->regions[i].pathname, "[stack]", 7)){
+          maestro_stack_start = reg.start_addr;
+          maestro_stack_end = reg.end_addr;
           i++;
         } else if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){
           size = (char*)reg.end_addr - (char*)reg.start_addr;
@@ -200,6 +202,8 @@ mc_snapshot_t MC_take_snapshot()
     }
   }
 
+  snapshot->to_ignore = take_snapshot_ignore();
+
   if(_sg_mc_visited > 0 || strcmp(_sg_mc_property_file,""))
     snapshot->stacks = take_snapshot_stacks(&snapshot, heap);
   
@@ -231,6 +235,7 @@ void MC_free_snapshot(mc_snapshot_t snapshot)
 
   xbt_free(snapshot->regions);
   xbt_dynar_free(&(snapshot->stacks));
+  xbt_dynar_free(&(snapshot->to_ignore));
   xbt_free(snapshot);
 }
 
@@ -628,3 +633,26 @@ void variable_value_free_voidp(void* v){
   variable_value_free((variable_value_t) * (void **)v);
 }
 
+static xbt_dynar_t take_snapshot_ignore(){
+  
+  if(mc_heap_comparison_ignore == NULL)
+    return NULL;
+
+  xbt_dynar_t cpy = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), heap_ignore_region_free_voidp);
+
+  unsigned int cursor = 0;
+  mc_heap_ignore_region_t current_region;
+
+  xbt_dynar_foreach(mc_heap_comparison_ignore, cursor, current_region){
+    mc_heap_ignore_region_t new_region = NULL;
+    new_region = xbt_new0(s_mc_heap_ignore_region_t, 1);
+    new_region->address = current_region->address;
+    new_region->size = current_region->size;
+    new_region->block = current_region->block;
+    new_region->fragment = current_region->fragment;
+    xbt_dynar_push(cpy, &new_region);
+  }
+
+  return cpy;
+
+}
index 047e7af..2a49a44 100644 (file)
@@ -12,7 +12,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_compare, mc,
 
 static int heap_region_compare(void *d1, void *d2, size_t size);
 
-static int compare_stack(stack_region_t s1, stack_region_t s2, void *sp1, void *sp2, void *heap1, void *heap2, xbt_dynar_t equals);
 static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2);
 static size_t heap_ignore_size(void *address);
 
@@ -20,7 +19,8 @@ static void stack_region_free(stack_region_t s);
 static void heap_equality_free(heap_equality_t e);
 
 static int is_stack_ignore_variable(char *frame, char *var_name);
-static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals);
+static int compare_local_variables(char *s1, char *s2);
+static int compare_global_variables(int region_type, void *d1, void *d2);
 
 static size_t heap_ignore_size(void *address){
   unsigned int cursor = 0;
@@ -42,7 +42,7 @@ static size_t heap_ignore_size(void *address){
   return 0;
 }
 
-static int compare_global_variables(int region_type, void *d1, void *d2, xbt_dynar_t equals){
+static int compare_global_variables(int region_type, void *d1, void *d2){
 
   unsigned int cursor = 0;
   size_t offset; 
@@ -68,7 +68,7 @@ static int compare_global_variables(int region_type, void *d1, void *d2, xbt_dyn
             continue;
           }else{
             if((addr_pointed1 > std_heap) && ((char *)addr_pointed1 < (char *)std_heap + STD_HEAP_SIZE) && (addr_pointed2 > std_heap) && ((char *)addr_pointed2 < (char *)std_heap + STD_HEAP_SIZE)){
-              res_compare = compare_area(addr_pointed1, addr_pointed2, NULL, equals);
+              res_compare = compare_area(addr_pointed1, addr_pointed2, NULL);
               if(res_compare == 1){
                 #ifdef MC_VERBOSE
                   XBT_VERB("Different global variable in libsimgrid : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
@@ -103,7 +103,7 @@ static int compare_global_variables(int region_type, void *d1, void *d2, xbt_dyn
             continue;
           }else{
             if((addr_pointed1 > std_heap) && ((char *)addr_pointed1 < (char *)std_heap + STD_HEAP_SIZE) && (addr_pointed2 > std_heap) && ((char *)addr_pointed2 < (char *)std_heap + STD_HEAP_SIZE)){
-              res_compare = compare_area(addr_pointed1, addr_pointed2, NULL, equals);
+              res_compare = compare_area(addr_pointed1, addr_pointed2, NULL);
               if(res_compare == 1){
                 #ifdef MC_VERBOSE
                   XBT_VERB("Different global variable in binary : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
@@ -328,12 +328,10 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
   }
 
   /* Init heap information used in heap comparison algorithm */
-  init_heap_information((xbt_mheap_t)s1->regions[heap_index]->data, (xbt_mheap_t)s2->regions[heap_index]->data);
-
-  xbt_dynar_t equals = xbt_dynar_new(sizeof(heap_equality_t), heap_equality_free_voidp);
+  init_heap_information((xbt_mheap_t)s1->regions[heap_index]->data, (xbt_mheap_t)s2->regions[heap_index]->data, s1->to_ignore, s2->to_ignore);
 
   /* Compare binary global variables */
-  is_diff = compare_global_variables(s1->region_type[data_program_index], s1->regions[data_program_index]->data, s2->regions[data_program_index]->data, equals);
+  is_diff = compare_global_variables(s1->region_type[data_program_index], s1->regions[data_program_index]->data, s2->regions[data_program_index]->data);
   if(is_diff != 0){
     #ifdef MC_DEBUG
       xbt_os_timer_stop(timer);
@@ -357,14 +355,14 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     #endif
   }
 
-  #ifdef MC_VERBOSE
+  #ifdef MC_DEBUG
     if(is_diff == 0)
       xbt_os_timer_stop(timer);
     xbt_os_timer_start(timer);
   #endif
 
   /* Compare libsimgrid global variables */
-    is_diff = compare_global_variables(s1->region_type[data_libsimgrid_index], s1->regions[data_libsimgrid_index]->data, s2->regions[data_libsimgrid_index]->data, equals);
+    is_diff = compare_global_variables(s1->region_type[data_libsimgrid_index], s1->regions[data_libsimgrid_index]->data, s2->regions[data_libsimgrid_index]->data);
   if(is_diff != 0){
     #ifdef MC_DEBUG
       xbt_os_timer_stop(timer);
@@ -394,11 +392,50 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     xbt_os_timer_start(timer);
   #endif
 
+    /* Stacks comparison */
+    unsigned int  cursor = 0;
+    int diff_local = 0;
+    is_diff = 0;
+    
+    while(cursor < xbt_dynar_length(s1->stacks)){
+      diff_local = compare_local_variables(((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->local_variables->data);
+      if(diff_local > 0){
+        #ifdef MC_DEBUG
+          if(is_diff == 0){
+            xbt_os_timer_stop(timer);
+            mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer); 
+          }
+          XBT_DEBUG("Different local variables between stacks %d", cursor + 1);
+          errors++;
+          is_diff = 1;
+        #else
+        
+          #ifdef MC_VERBOSE
+            XBT_VERB("Different local variables between stacks %d", cursor + 1);
+          #endif
+          
+            reset_heap_information();
+            xbt_os_timer_free(timer);
+            xbt_os_timer_stop(global_timer);
+            mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
+            xbt_os_timer_free(global_timer);
+            
+            if(!raw_mem)
+              MC_UNSET_RAW_MEM;
+            
+            return 1;
+        #endif
+      }
+      cursor++;
+    }
+    
+    #ifdef MC_DEBUG
+      xbt_os_timer_start(timer);
+    #endif
+
   /* Compare heap */
-  xbt_dynar_t stacks1 = xbt_dynar_new(sizeof(stack_region_t), stack_region_free_voidp);
-  xbt_dynar_t stacks2 = xbt_dynar_new(sizeof(stack_region_t), stack_region_free_voidp);
  
-  if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[heap_index]->data, (xbt_mheap_t)s2->regions[heap_index]->data, &stacks1, &stacks2, equals)){
+  if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[heap_index]->data, (xbt_mheap_t)s2->regions[heap_index]->data)){
 
     #ifdef MC_DEBUG
       xbt_os_timer_stop(timer);
@@ -408,14 +445,12 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     #else
 
       xbt_os_timer_free(timer);
-      xbt_dynar_free(&stacks1);
-      xbt_dynar_free(&stacks2);
-      xbt_dynar_free(&equals);
  
       #ifdef MC_VERBOSE
         XBT_VERB("Different heap (mmalloc_compare)");
       #endif
        
+      reset_heap_information();
       xbt_os_timer_stop(global_timer);
       mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
       xbt_os_timer_free(global_timer);
@@ -431,52 +466,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
     #endif
   }
 
-  #ifdef MC_DEBUG
-    xbt_os_timer_start(timer);
-  #endif
-
-  /* Stacks comparison */
-  unsigned int  cursor = 0;
-  int diff_local = 0;
-  is_diff = 0;
-
-  while(cursor < xbt_dynar_length(stacks1)){
-    diff_local = compare_local_variables(((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, equals);
-    if(diff_local > 0){
-      #ifdef MC_DEBUG
-        if(is_diff == 0){
-          xbt_os_timer_stop(timer);
-          mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer); 
-        }
-        XBT_DEBUG("Different local variables between stacks %d", cursor + 1);
-        errors++;
-        is_diff = 1;
-      #else
-        xbt_dynar_free(&stacks1);
-        xbt_dynar_free(&stacks2);
-        xbt_dynar_free(&equals);
-        
-      #ifdef MC_VERBOSE
-        XBT_VERB("Different local variables between stacks %d", cursor + 1);
-      #endif
-          
-        xbt_os_timer_free(timer);
-        xbt_os_timer_stop(global_timer);
-        mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
-        xbt_os_timer_free(global_timer);
-        
-        if(!raw_mem)
-          MC_UNSET_RAW_MEM;
-        
-        return 1;
-      #endif
-    }
-    cursor++;
-  }
-
-  xbt_dynar_free(&stacks1);
-  xbt_dynar_free(&stacks2);
-  xbt_dynar_free(&equals);
+  reset_heap_information();
    
   xbt_os_timer_free(timer);
 
@@ -525,7 +515,7 @@ static int is_stack_ignore_variable(char *frame, char *var_name){
   return 0;
 }
 
-static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals){
+static int compare_local_variables(char *s1, char *s2){
   
   xbt_dynar_t tokens1 = xbt_str_split(s1, NULL);
   xbt_dynar_t tokens2 = xbt_str_split(s2, NULL);
@@ -534,37 +524,42 @@ static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals){
   unsigned int cursor = 0;
   void *addr1, *addr2;
   char *ip1 = NULL, *ip2 = NULL;
+  int res_compare = 0;
+  char *var_name;
   
   while(cursor < xbt_dynar_length(tokens1)){
     s_tokens1 = xbt_str_split(xbt_dynar_get_as(tokens1, cursor, char *), "=");
     s_tokens2 = xbt_str_split(xbt_dynar_get_as(tokens2, cursor, char *), "=");
     if(xbt_dynar_length(s_tokens1) > 1 && xbt_dynar_length(s_tokens2) > 1){
+      var_name = xbt_dynar_get_as(s_tokens1, 0, char *);
       if((strcmp(xbt_dynar_get_as(s_tokens1, 0, char *), "ip") == 0) && (strcmp(xbt_dynar_get_as(s_tokens2, 0, char *), "ip") == 0)){
         xbt_free(ip1);
         xbt_free(ip2);
         ip1 = strdup(xbt_dynar_get_as(s_tokens1, 1, char *));
         ip2 = strdup(xbt_dynar_get_as(s_tokens2, 1, char *));
       }
-      if(strcmp(xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *)) != 0){   
-        /* Ignore this variable ?  */
-        if(is_stack_ignore_variable(ip1, xbt_dynar_get_as(s_tokens1, 0, char *)) && is_stack_ignore_variable(ip2, xbt_dynar_get_as(s_tokens2, 0, char *))){
-          xbt_dynar_free(&s_tokens1);
-          xbt_dynar_free(&s_tokens2);
-          cursor++;
-          continue;
-        }
-        addr1 = (void *) strtoul(xbt_dynar_get_as(s_tokens1, 1, char *), NULL, 16);
-        addr2 = (void *) strtoul(xbt_dynar_get_as(s_tokens2, 1, char *), NULL, 16);
-        if(is_heap_equality(heap_equals, addr1, addr2) == 0){
-          if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
-            XBT_VERB("Variable %s is different between stacks in %s : %s - %s", xbt_dynar_get_as(s_tokens1, 0, char *), ip1, xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *));
-          xbt_dynar_free(&s_tokens1);
-          xbt_dynar_free(&s_tokens2);
-          xbt_dynar_free(&tokens1);
-          xbt_dynar_free(&tokens2);
-          xbt_free(ip1);
-          xbt_free(ip2);
-          return 1;
+      addr1 = (void *) strtoul(xbt_dynar_get_as(s_tokens1, 1, char *), NULL, 16);
+      addr2 = (void *) strtoul(xbt_dynar_get_as(s_tokens2, 1, char *), NULL, 16);
+      if(addr1 > std_heap && (char *)addr1 <= (char *)std_heap + STD_HEAP_SIZE && addr2 > std_heap && (char *)addr2 <= (char *)std_heap + STD_HEAP_SIZE){
+        res_compare = compare_area(addr1, addr2, NULL);
+        if(res_compare == 1){
+          if(is_stack_ignore_variable(ip1, xbt_dynar_get_as(s_tokens1, 0, char *)) && is_stack_ignore_variable(ip2, xbt_dynar_get_as(s_tokens2, 0, char *))){
+            xbt_dynar_free(&s_tokens1);
+            xbt_dynar_free(&s_tokens2);
+            cursor++;
+            continue;
+          }else {
+            #ifdef MC_VERBOSE
+              XBT_VERB("Different local variable : %s at addresses %p - %p", var_name, addr1, addr2);
+            #endif
+            xbt_dynar_free(&s_tokens1);
+            xbt_dynar_free(&s_tokens2);
+            xbt_dynar_free(&tokens1);
+            xbt_dynar_free(&tokens2);
+            xbt_free(ip1);
+            xbt_free(ip2);
+            return 1;
+          }
         }
       }
     }
@@ -610,37 +605,6 @@ static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2){
 
 }
 
-
-static int compare_stack(stack_region_t s1, stack_region_t s2, void *sp1, void *sp2, void *heap1, void *heap2, xbt_dynar_t equals){
-  
-  size_t k = 0;
-  size_t size_used1 = s1->size - ((char*)sp1 - (char*)s1->address);
-  size_t size_used2 = s2->size - ((char*)sp2 - (char*)s2->address);
-
-  int pointer_align;
-  void *addr_pointed1 = NULL, *addr_pointed2 = NULL;  
-  
-  while(k < size_used1){
-    if(memcmp((char *)s1->address + s1->size - k, (char *)s2->address + s2->size - k, 1) != 0){
-      pointer_align = ((size_used1 - k) / sizeof(void*)) * sizeof(void*);
-      addr_pointed1 = *((void **)(((char*)s1->address + (s1->size - size_used1)) + pointer_align));
-      addr_pointed2 = *((void **)(((char*)s2->address + (s2->size - size_used2)) + pointer_align));
-      if(is_heap_equality(equals, addr_pointed1, addr_pointed2) == 0){
-        if((addr_pointed1 > std_heap) && (addr_pointed1 < (void *)((char *)std_heap + STD_HEAP_SIZE)) && (addr_pointed2 > std_heap) && (addr_pointed2 < (void *)((char *)std_heap + STD_HEAP_SIZE))){
-          if(is_free_area(addr_pointed1, (xbt_mheap_t)heap1) == 0 || is_free_area(addr_pointed2, (xbt_mheap_t)heap2) == 0){
-            return 1;
-          }
-        }else{
-          return 1;
-        } 
-      }
-    } 
-    k++;
-  }
-  return 0;
-}
-
 int MC_compare_snapshots(void *s1, void *s2){
   
   MC_ignore_stack("self", "simcall_BODY_mc_snapshot");
index 555144c..1768a12 100644 (file)
@@ -80,6 +80,7 @@ static int is_visited_state(){
         if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
           xbt_dynar_remove_at(visited_states, cursor, NULL);
           xbt_dynar_insert_at(visited_states, cursor, &new_state);
+          XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num);
           if(raw_mem_set)
             MC_SET_RAW_MEM;
           else
@@ -96,6 +97,7 @@ static int is_visited_state(){
             if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
               xbt_dynar_remove_at(visited_states, previous_cursor, NULL);
               xbt_dynar_insert_at(visited_states, previous_cursor, &new_state);
+              XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num);
               if(raw_mem_set)
                 MC_SET_RAW_MEM;
               else
@@ -113,6 +115,7 @@ static int is_visited_state(){
             if(snapshot_compare(new_state->system_state, state_test->system_state) == 0){
               xbt_dynar_remove_at(visited_states, next_cursor, NULL);
               xbt_dynar_insert_at(visited_states, next_cursor, &new_state);
+              XBT_DEBUG("State %d already visited ! (equal to state %d)", new_state->num, state_test->num);
               if(raw_mem_set)
                 MC_SET_RAW_MEM;
               else
@@ -306,10 +309,6 @@ void MC_dpor(void)
           next_state->system_state = MC_take_snapshot();
         }
 
-      }else{
-
-        XBT_DEBUG("State already visited !");
-        
       }
 
       xbt_fifo_unshift(mc_stack_safety, next_state);
index e4f4f50..a974239 100644 (file)
@@ -122,8 +122,6 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr);
 static dw_frame_t get_frame_by_offset(xbt_dict_t all_variables, unsigned long int offset);
 static size_t data_bss_ignore_size(void *address);
 static void MC_get_global_variables(char *elf_file);
-static void heap_ignore_region_free(mc_heap_ignore_region_t r);
-static void heap_ignore_region_free_voidp(void *r);
 
 void MC_do_the_modelcheck_for_real() {
 
@@ -191,7 +189,6 @@ void MC_init(){
   get_libsimgrid_plt_section();
   get_binary_plt_section();
 
-  MC_ignore_data_bss(&end_raw_heap, sizeof(end_raw_heap));
   MC_ignore_data_bss(&mc_comp_times, sizeof(mc_comp_times));
   MC_ignore_data_bss(&mc_snapshot_comparison_time, sizeof(mc_snapshot_comparison_time)); 
 
@@ -746,12 +743,12 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) {
 
 /************ MC_ignore ***********/ 
 
-static void heap_ignore_region_free(mc_heap_ignore_region_t r){
+void heap_ignore_region_free(mc_heap_ignore_region_t r){
   if(r)
     xbt_free(r);
 }
 
-static void heap_ignore_region_free_voidp(void *r){
+void heap_ignore_region_free_voidp(void *r){
   heap_ignore_region_free((mc_heap_ignore_region_t) * (void **) r);
 }
 
@@ -999,6 +996,7 @@ void MC_new_stack_area(void *stack, char *name, void* context, size_t size){
   region->process_name = strdup(name);
   region->context = context;
   region->size = size;
+  region->block = ((char*)stack - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1;
   xbt_dynar_push(stacks_areas, &region);
   
   MC_UNSET_RAW_MEM;
@@ -1802,6 +1800,17 @@ static void MC_get_global_variables(char *elf_file){
        || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), ".bss") == 0)
        || (strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "stderr", 6) == 0)
        || (strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "counter", 7) == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapinfo1") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapinfo2") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapbase1") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapbase2") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapsize1") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapsize2") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heaplimit") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "ignore_done") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "s_heap") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "to_ignore1") == 0)
+       || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "to_ignore2") == 0)
        || ((size_t)strtoul(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 2, char*), NULL, 16) == 0))
       continue;
 
index 0a8fd2f..df27cd0 100644 (file)
@@ -41,6 +41,7 @@ typedef struct s_mc_snapshot{
   size_t *stack_sizes;
   xbt_dynar_t stacks;
   int nb_processes;
+  xbt_dynar_t to_ignore;
 } s_mc_snapshot_t, *mc_snapshot_t;
 
 typedef struct s_mc_snapshot_stack{
@@ -200,7 +201,6 @@ void get_libsimgrid_plt_section(void);
 void get_binary_plt_section(void);
 
 extern void *start_data_libsimgrid;
-extern void *end_raw_heap;
 extern void *start_data_binary;
 extern void *start_bss_binary;
 extern char *libsimgrid_path;
index aaa090f..601bf8e 100644 (file)
   inline static SIMCALL_FUNC_RETURN_TYPE(RES) simcall_BODY_##NAME(MAP(SIMCALL_ARG, ##__VA_ARGS__)) { \
     smx_process_t self = SIMIX_process_self(); \
     self->simcall.call = TYPE; \
-    memset(self->simcall.args, 0, sizeof(self->simcall.args));  \
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result)); \
+    memset(self->simcall.args, 0, sizeof(self->simcall.args)); \
     MAP_WITH_DEFAULT_ARGS(SIMCALL_INIT_FIELD, (), ##__VA_ARGS__) \
     if (self != simix_global->maestro_process) { \
       XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, \
index 2aa4c8e..133df65 100644 (file)
@@ -15,6 +15,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mm_diff, xbt,
 
 xbt_dynar_t mc_heap_comparison_ignore;
 xbt_dynar_t stacks_areas;
+void *maestro_stack_start, *maestro_stack_end;
 
 static void heap_area_pair_free(heap_area_pair_t pair);
 static void heap_area_pair_free_voidp(void *d);
@@ -22,11 +23,13 @@ static int add_heap_area_pair(xbt_dynar_t list, int block1, int fragment1, int b
 static int is_new_heap_area_pair(xbt_dynar_t list, int block1, int fragment1, int block2, int fragment2);
 static heap_area_t new_heap_area(int block, int fragment);
 
-static size_t heap_comparison_ignore_size(void *address);
+static size_t heap_comparison_ignore_size(xbt_dynar_t list, void *address);
 static void add_heap_equality(xbt_dynar_t equals, void *a1, void *a2);
 static void remove_heap_equality(xbt_dynar_t equals, int address, void *a);
 
-static char* is_stack(void *address);
+static int is_stack(void *address);
+static int is_block_stack(int block);
+static int equal_blocks(int b1, int b2);
 
 void mmalloc_backtrace_block_display(void* heapinfo, int block){
 
@@ -112,10 +115,11 @@ void mmalloc_backtrace_display(void *addr){
 void *s_heap = NULL, *heapbase1 = NULL, *heapbase2 = NULL;
 malloc_info *heapinfo1 = NULL, *heapinfo2 = NULL;
 size_t heaplimit = 0, heapsize1 = 0, heapsize2 = 0;
+xbt_dynar_t to_ignore1 = NULL, to_ignore2 = NULL;
 
-int ignore_done = 0;
+int ignore_done1 = 0, ignore_done2 = 0;
 
-void init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2){
+void init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t i1, xbt_dynar_t i2){
 
   heaplimit = ((struct mdesc *)heap1)->heaplimit;
 
@@ -129,10 +133,13 @@ void init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2){
 
   heapsize1 = heap1->heapsize;
   heapsize2 = heap2->heapsize;
+
+  to_ignore1 = i1;
+  to_ignore2 = i2;
   
 }
 
-int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stack1, xbt_dynar_t *stack2, xbt_dynar_t equals){
+int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){
 
   if(heap1 == NULL && heap1 == NULL){
     XBT_DEBUG("Malloc descriptors null");
@@ -149,14 +156,12 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
   size_t current_block = -1;    /* avoid "maybe uninitialized" warning */
   size_t current_fragment;
   void *addr_block1, *addr_block2, *addr_frag1, *addr_frag2;
-  void *snap_addr_block1, *snap_addr_block2;
-  char *stack_name;
   int nb_diff1 = 0, nb_diff2 = 0;
 
   xbt_dynar_t previous = xbt_dynar_new(sizeof(heap_area_pair_t), heap_area_pair_free_voidp);
 
   int equal, res_compare = 0;
-
+  
   /* Check busy blocks*/
 
   i1 = 1;
@@ -171,17 +176,16 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
     }
 
     addr_block1 = ((void*) (((ADDR2UINT(i1)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
-    snap_addr_block1 = ((void*) (((ADDR2UINT(i1)) - 1) * BLOCKSIZE + (char*)heapbase1));
 
     if(heapinfo1[i1].type == 0){  /* Large block */
       
-      if((xbt_dynar_length(*stack1) < xbt_dynar_length(stacks_areas)) && ((stack_name = is_stack(addr_block1)) != NULL)){
-        stack_region_t stack = xbt_new0(s_stack_region_t, 1);
-        stack->address = snap_addr_block1;
-        stack->process_name = strdup(stack_name);
-        stack->size = heapinfo1[i1].busy_block.busy_size;
-        xbt_dynar_push(*stack1, &stack);
-        res_compare = -1;
+      if(is_stack(addr_block1)){
+        for(k=0; k < heapinfo1[i1].busy_block.size; k++)
+          heapinfo1[i1+k].busy_block.equal_to = new_heap_area(i1, -1);
+        for(k=0; k < heapinfo2[i1].busy_block.size; k++)
+          heapinfo2[i1+k].busy_block.equal_to = new_heap_area(i1, -1);
+        i1 = i1 + heapinfo1[current_block].busy_block.size;
+        continue;
       }
 
       if(heapinfo1[i1].busy_block.equal_to != NULL){
@@ -199,26 +203,16 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
         if(heapinfo2[current_block].busy_block.equal_to == NULL){  
         
           addr_block2 = ((void*) (((ADDR2UINT(current_block)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
-          snap_addr_block2 = ((void*) (((ADDR2UINT(current_block)) - 1) * BLOCKSIZE + (char*)heapbase2));
-          
-          if((xbt_dynar_length(*stack2) < xbt_dynar_length(stacks_areas)) && ((stack_name = is_stack(addr_block2)) != NULL)){
-            stack_region_t stack = xbt_new0(s_stack_region_t, 1);
-            stack->address = snap_addr_block2;
-            stack->process_name = strdup(stack_name);
-            stack->size = heapinfo2[current_block].busy_block.busy_size;
-            xbt_dynar_push(*stack2, &stack);
-            res_compare = -1;
-          }
         
-          res_compare = compare_area(addr_block1, addr_block2, previous, equals);
+          res_compare = compare_area(addr_block1, addr_block2, previous);
         
-          if(res_compare == 0 || res_compare == -1){
+          if(res_compare == 0){
             for(k=1; k < heapinfo2[current_block].busy_block.size; k++)
               heapinfo2[current_block+k].busy_block.equal_to = new_heap_area(i1, -1);
             for(k=1; k < heapinfo1[current_block].busy_block.size; k++)
               heapinfo1[current_block+k].busy_block.equal_to = new_heap_area(i1, -1);
             equal = 1;
-            match_equals(previous, equals);
+            match_equals(previous);
             i1 = i1 + heapinfo1[current_block].busy_block.size;
           }
         
@@ -231,16 +225,6 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
       while(i2 <= heaplimit && !equal){
 
         addr_block2 = ((void*) (((ADDR2UINT(i2)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));        
-        snap_addr_block2 = ((void*) (((ADDR2UINT(i2)) - 1) * BLOCKSIZE + (char*)heapbase2));
-        
-        if((xbt_dynar_length(*stack2) < xbt_dynar_length(stacks_areas)) && ((stack_name = is_stack(addr_block2)) != NULL)){
-          stack_region_t stack = xbt_new0(s_stack_region_t, 1);
-          stack->address = snap_addr_block2;
-          stack->process_name = strdup(stack_name);
-          stack->size = heapinfo2[i2].busy_block.busy_size;
-          xbt_dynar_push(*stack2, &stack);
-          res_compare = -1;
-        }
            
         if(i2 == current_block){
           i2++;
@@ -257,15 +241,15 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
           continue;
         }
         
-        res_compare = compare_area(addr_block1, addr_block2, previous, equals);
+        res_compare = compare_area(addr_block1, addr_block2, previous);
         
-        if(res_compare == 0 || res_compare == -1){
+        if(res_compare == 0){
           for(k=1; k < heapinfo2[i2].busy_block.size; k++)
             heapinfo2[i2+k].busy_block.equal_to = new_heap_area(i1, -1);
           for(k=1; k < heapinfo1[i1].busy_block.size; k++)
             heapinfo1[i1+k].busy_block.equal_to = new_heap_area(i2, -1);
           equal = 1;
-          match_equals(previous, equals);
+          match_equals(previous);
           i1 = i1 + heapinfo1[i1].busy_block.size;
         }
 
@@ -276,7 +260,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
       }
 
       if(!equal){
-        XBT_DEBUG("Block %zu not found (size_used = %zu)", i1, heapinfo1[i1].busy_block.busy_size);
+        XBT_DEBUG("Block %zu not found (size_used = %zu, addr = %p)", i1, heapinfo1[i1].busy_block.busy_size, addr_block1);
         i1 = heaplimit + 1;
         nb_diff1++;
       }
@@ -306,11 +290,11 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
             addr_block2 = ((void*) (((ADDR2UINT(current_block)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
             addr_frag2 = (void*) ((char *)addr_block2 + (current_fragment << ((xbt_mheap_t)s_heap)->heapinfo[current_block].type));
 
-            res_compare = compare_area(addr_frag1, addr_frag2, previous, equals);
+            res_compare = compare_area(addr_frag1, addr_frag2, previous);
 
             if(res_compare == 0){
               equal = 1;
-              match_equals(previous, equals);
+              match_equals(previous);
             }
         
             xbt_dynar_reset(previous);
@@ -332,16 +316,16 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
               continue;
 
             if(heapinfo2[i2].busy_frag.equal_to[j2] != NULL)                
-              continue;              
+              continue;            
                           
             addr_block2 = ((void*) (((ADDR2UINT(i2)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
             addr_frag2 = (void*) ((char *)addr_block2 + (j2 << ((xbt_mheap_t)s_heap)->heapinfo[i2].type));
 
-            res_compare = compare_area(addr_frag1, addr_frag2, previous, equals);
+            res_compare = compare_area(addr_frag1, addr_frag2, previous);
             
             if(res_compare == 0){
               equal = 1;
-              match_equals(previous, equals);
+              match_equals(previous);
               xbt_dynar_reset(previous);
               break;
             }
@@ -355,7 +339,7 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
         }
 
         if(heapinfo1[i1].busy_frag.equal_to[j1] == NULL){
-          XBT_DEBUG("Block %zu, fragment %zu not found (size_used = %d)", i1, j1, heapinfo1[i1].busy_frag.frag_size[j1]);
+          XBT_DEBUG("Block %zu, fragment %zu not found (size_used = %d, address = %p)", i1, j1, heapinfo1[i1].busy_frag.frag_size[j1], addr_frag1);
           i2 = heaplimit + 1;
           i1 = heaplimit + 1;
           nb_diff1++;
@@ -412,6 +396,9 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
     i++; 
   }
 
+  if(current_block == heaplimit)
+    XBT_DEBUG("Number of blocks/fragments not found in heap1 : %d", nb_diff1);
+
   i = 1;
 
   while(i<=heaplimit){
@@ -428,8 +415,6 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
           }
         }
       }
-      xbt_free(heapinfo2[i].busy_block.equal_to);
-      heapinfo2[i].busy_block.equal_to = NULL;
     }
     if(heapinfo2[i].type > 0){
       addr_block2 = ((void*) (((ADDR2UINT(i)) - 1) * BLOCKSIZE + (char*)heapbase2));
@@ -446,6 +431,46 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
             }
           }
         }
+      }
+    }
+    i++; 
+  }
+
+  if(current_block == heaplimit)
+    XBT_DEBUG("Number of blocks/fragments not found in heap2 : %d", nb_diff2);
+
+  xbt_dynar_free(&previous);
+
+  return ((nb_diff1 > 0) || (nb_diff2 > 0));
+}
+
+void reset_heap_information(){
+
+  size_t i = 0, j;
+
+  while(i<=heaplimit){
+    if(heapinfo1[i].type == 0){
+      xbt_free(heapinfo1[i].busy_block.equal_to);
+      heapinfo1[i].busy_block.equal_to = NULL;
+    }
+    if(heapinfo1[i].type > 0){
+      for(j=0; j < (size_t) (BLOCKSIZE >> heapinfo1[i].type); j++){
+        xbt_free(heapinfo1[i].busy_frag.equal_to[j]);
+        heapinfo1[i].busy_frag.equal_to[j] = NULL;
+      }
+    }
+    i++; 
+  }
+
+  i = 0;
+
+  while(i<=heaplimit){
+    if(heapinfo2[i].type == 0){
+      xbt_free(heapinfo2[i].busy_block.equal_to);
+      heapinfo2[i].busy_block.equal_to = NULL;
+    }
+    if(heapinfo2[i].type > 0){
+      for(j=0; j < (size_t) (BLOCKSIZE >> heapinfo2[i].type); j++){
         xbt_free(heapinfo2[i].busy_frag.equal_to[j]);
         heapinfo2[i].busy_frag.equal_to[j] = NULL;
       }
@@ -453,13 +478,12 @@ int mmalloc_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t *stac
     i++; 
   }
 
-  xbt_dynar_free(&previous);
-  ignore_done = 0;
+  ignore_done1 = 0, ignore_done2 = 0;
   s_heap = NULL, heapbase1 = NULL, heapbase2 = NULL;
   heapinfo1 = NULL, heapinfo2 = NULL;
   heaplimit = 0, heapsize1 = 0, heapsize2 = 0;
+  to_ignore1 = NULL, to_ignore2 = NULL;
 
-  return ((nb_diff1 > 0) || (nb_diff2 > 0));
 }
 
 static heap_area_t new_heap_area(int block, int fragment){
@@ -471,16 +495,16 @@ static heap_area_t new_heap_area(int block, int fragment){
 }
 
 
-static size_t heap_comparison_ignore_size(void *address){
+static size_t heap_comparison_ignore_size(xbt_dynar_t ignore_list, void *address){
 
   unsigned int cursor = 0;
   int start = 0;
-  int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1;
+  int end = xbt_dynar_length(ignore_list) - 1;
   mc_heap_ignore_region_t region;
 
   while(start <= end){
     cursor = (start + end) / 2;
-    region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t);
+    region = (mc_heap_ignore_region_t)xbt_dynar_get_as(ignore_list, cursor, mc_heap_ignore_region_t);
     if(region->address == address)
       return region->size;
     if(region->address < address)
@@ -493,10 +517,10 @@ static size_t heap_comparison_ignore_size(void *address){
 }
 
 
-int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equals){
+int compare_area(void *area1, void* area2, xbt_dynar_t previous){
 
   size_t i = 0, pointer_align = 0, ignore1 = 0, ignore2 = 0;
-  void *address_pointed1, *address_pointed2;
+  void *addr_pointed1, *addr_pointed2;
   int res_compare;
   size_t block1, frag1, block2, frag2, size;
   int check_ignore = 0;
@@ -514,6 +538,9 @@ int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equ
   block1 = ((char*)area1 - (char*)((xbt_mheap_t)s_heap)->heapbase) / BLOCKSIZE + 1;
   block2 = ((char*)area2 - (char*)((xbt_mheap_t)s_heap)->heapbase) / BLOCKSIZE + 1;
 
+  if(is_block_stack((int)block1) && is_block_stack((int)block2))
+    return 0;
+
   if(((char *)area1 < (char*)((xbt_mheap_t)s_heap)->heapbase)  || (block1 > heapsize1) || (block1 < 1) || ((char *)area2 < (char*)((xbt_mheap_t)s_heap)->heapbase) || (block2 > heapsize2) || (block2 < 1))
     return 1;
 
@@ -525,6 +552,11 @@ int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equ
     if(heapinfo1[block1].type == -1){
       return 0;
     }else if(heapinfo1[block1].type == 0){
+      if(heapinfo1[block1].busy_block.equal_to != NULL){
+        if(equal_blocks(block1, block2)){
+          return 0;
+        }
+      }
       if(heapinfo1[block1].busy_block.size != heapinfo2[block2].busy_block.size)
         return 1;
       if(heapinfo1[block1].busy_block.busy_size != heapinfo2[block2].busy_block.busy_size)
@@ -539,7 +571,7 @@ int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equ
       area1_to_compare = addr_block1;
       area2_to_compare = addr_block2;
 
-      if((ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)) && heapinfo1[block1].busy_block.ignore == 1)
+      if(heapinfo1[block1].busy_block.ignore == 1 || heapinfo2[block2].busy_block.ignore == 1)
         check_ignore = 1;
     }else{
       frag1 = ((uintptr_t) (ADDR2UINT (area1) % (BLOCKSIZE))) >> heapinfo1[block1].type;
@@ -560,8 +592,8 @@ int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equ
 
       if(size == 0)
         return 0;
-
-      if((ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)) && heapinfo1[block1].busy_frag.ignore[frag1] == 1)
+      
+      if(heapinfo1[block1].busy_frag.ignore[frag1] == 1 || heapinfo2[block2].busy_frag.ignore[frag2] == 1)
         check_ignore = 1;
     }
   }else if((heapinfo1[block1].type > 0) && (heapinfo2[block2].type > 0)){
@@ -584,7 +616,7 @@ int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equ
     if(size == 0)
       return 0;
 
-    if((ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)) && heapinfo1[block1].busy_frag.ignore[frag1] == 1)
+    if(heapinfo1[block1].busy_frag.ignore[frag1] == 1 || heapinfo2[block2].busy_frag.ignore[frag2] == 1)
       check_ignore = 1;   
   }else{
     return 1;
@@ -592,12 +624,12 @@ int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equ
   
   while(i<size){
 
-    if((ignore_done < xbt_dynar_length(mc_heap_comparison_ignore)) && check_ignore){
-
-      if((ignore1 = heap_comparison_ignore_size((char *)area1 + i)) > 0){
-        if((ignore2 = heap_comparison_ignore_size((char *)area2 + i))  == ignore1){
+    if(check_ignore){
+      if((ignore_done1 < xbt_dynar_length(to_ignore1)) && ((ignore1 = heap_comparison_ignore_size(to_ignore1, (char *)area1 + i)) > 0)){
+        if((ignore_done2 < xbt_dynar_length(to_ignore2)) && ((ignore2 = heap_comparison_ignore_size(to_ignore2, (char *)area2 + i))  == ignore1)){
           i = i + ignore2;
-          ignore_done++;
+          ignore_done1++;
+          ignore_done2++;
           continue;
         }
       }
@@ -607,14 +639,19 @@ int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equ
 
       /* Check pointer difference */
       pointer_align = (i / sizeof(void*)) * sizeof(void*);
-      address_pointed1 = *((void **)((char *)area1_to_compare + pointer_align));
-      address_pointed2 = *((void **)((char *)area2_to_compare + pointer_align));
+      addr_pointed1 = *((void **)((char *)area1_to_compare + pointer_align));
+      addr_pointed2 = *((void **)((char *)area2_to_compare + pointer_align));
+      
+      if(addr_pointed1 > maestro_stack_start && addr_pointed1 < maestro_stack_end && addr_pointed2 > maestro_stack_start && addr_pointed2 < maestro_stack_end){
+        i = pointer_align + sizeof(void *);
+        continue;
+      }
 
-      res_compare = compare_area(address_pointed1, address_pointed2, previous, equals);
+      res_compare = compare_area(addr_pointed1, addr_pointed2, previous);
       
       if(res_compare == 1)
         return 1; 
-
+      
       i = pointer_align + sizeof(void *);
       
     }else{
@@ -625,7 +662,7 @@ int compare_area(void *area1, void* area2, xbt_dynar_t previous, xbt_dynar_t equ
   }
 
   if(match_pairs)
-    match_equals(previous, equals);
+    match_equals(previous);
 
   return 0;
   
@@ -675,66 +712,46 @@ static int is_new_heap_area_pair(xbt_dynar_t list, int block1, int fragment1, in
   return 1;
 }
 
-void match_equals(xbt_dynar_t list, xbt_dynar_t equals){
+void match_equals(xbt_dynar_t list){
 
   unsigned int cursor = 0;
   heap_area_pair_t current_pair;
   heap_area_t previous_area;
 
-  void *real_addr_block1, *real_addr_block2, *real_addr_frag1, *real_addr_frag2;
-
   xbt_dynar_foreach(list, cursor, current_pair){
 
     if(current_pair->fragment1 != -1){
-
-      real_addr_block1 = ((void*) (((ADDR2UINT((size_t)current_pair->block1)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
-      real_addr_frag1 = (void*) ((char *)real_addr_block1 + (current_pair->fragment1 << heapinfo1[current_pair->block1].type));
-      real_addr_block2 = ((void*) (((ADDR2UINT((size_t)current_pair->block2)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
-      real_addr_frag2 = (void*) ((char *)real_addr_block2 + (current_pair->fragment2 << heapinfo2[current_pair->block2].type));
-
+      
       if(heapinfo1[current_pair->block1].busy_frag.equal_to[current_pair->fragment1] != NULL){    
-        remove_heap_equality(equals, 1, real_addr_frag1);
         previous_area = heapinfo1[current_pair->block1].busy_frag.equal_to[current_pair->fragment1];
         xbt_free(heapinfo2[previous_area->block].busy_frag.equal_to[previous_area->fragment]);
         heapinfo2[previous_area->block].busy_frag.equal_to[previous_area->fragment] = NULL;
         xbt_free(previous_area); 
       }
       if(heapinfo2[current_pair->block2].busy_frag.equal_to[current_pair->fragment2] != NULL){        
-        remove_heap_equality(equals, 2, real_addr_frag2); 
         previous_area = heapinfo2[current_pair->block2].busy_frag.equal_to[current_pair->fragment2];
         xbt_free(heapinfo1[previous_area->block].busy_frag.equal_to[previous_area->fragment]);
         heapinfo1[previous_area->block].busy_frag.equal_to[previous_area->fragment] = NULL;
         xbt_free(previous_area);
       }
-      
-      if(real_addr_frag1 != real_addr_frag2)
-        add_heap_equality(equals, real_addr_frag1, real_addr_frag2);
 
       heapinfo1[current_pair->block1].busy_frag.equal_to[current_pair->fragment1] = new_heap_area(current_pair->block2, current_pair->fragment2);
       heapinfo2[current_pair->block2].busy_frag.equal_to[current_pair->fragment2] = new_heap_area(current_pair->block1, current_pair->fragment1);
 
     }else{
 
-      real_addr_block1 = ((void*) (((ADDR2UINT((size_t)current_pair->block1)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
-      real_addr_block2 = ((void*) (((ADDR2UINT((size_t)current_pair->block2)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
-
       if(heapinfo1[current_pair->block1].busy_block.equal_to != NULL){
-        remove_heap_equality(equals, 1, real_addr_block1);
         previous_area = heapinfo1[current_pair->block1].busy_block.equal_to;
         xbt_free(heapinfo2[previous_area->block].busy_block.equal_to);
         heapinfo2[previous_area->block].busy_block.equal_to = NULL; 
         xbt_free(previous_area);
       }
       if(heapinfo2[current_pair->block2].busy_block.equal_to != NULL){
-        remove_heap_equality(equals, 2, real_addr_block2);
         previous_area = heapinfo2[current_pair->block2].busy_block.equal_to;
         xbt_free(heapinfo1[previous_area->block].busy_block.equal_to);
         heapinfo1[previous_area->block].busy_block.equal_to = NULL;
         xbt_free(previous_area);
       }
-      
-      if(real_addr_block1 != real_addr_block2)
-        add_heap_equality(equals, real_addr_block1, real_addr_block2);
 
       heapinfo1[current_pair->block1].busy_block.equal_to = new_heap_area(current_pair->block2, current_pair->fragment2);
       heapinfo2[current_pair->block2].busy_block.equal_to = new_heap_area(current_pair->block1, current_pair->fragment1);
@@ -873,16 +890,28 @@ int mmalloc_linear_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){
   
 }
 
-static char* is_stack(void *address){
+static int is_stack(void *address){
   unsigned int cursor = 0;
   stack_region_t stack;
 
   xbt_dynar_foreach(stacks_areas, cursor, stack){
     if(address == stack->address)
-      return stack->process_name;
+      return 1;
   }
 
-  return NULL;
+  return 0;
+}
+
+static int is_block_stack(int block){
+  unsigned int cursor = 0;
+  stack_region_t stack;
+
+  xbt_dynar_foreach(stacks_areas, cursor, stack){
+    if(block == stack->block)
+      return 1;
+  }
+
+  return 0;
 }
 
 static void add_heap_equality(xbt_dynar_t equals, void *a1, void *a2){
@@ -1001,7 +1030,15 @@ int is_free_area(void *area, xbt_mheap_t heap){
   }
 
   return 0;
-  
-
+}
 
+static int equal_blocks(b1, b2){
+  if(heapinfo1[b1].busy_block.equal_to != NULL){
+    if(heapinfo2[b2].busy_block.equal_to != NULL){
+      if(((heap_area_t)(heapinfo1[b1].busy_block.equal_to))->block == b2 && ((heap_area_t)(heapinfo2[b2].busy_block.equal_to))->block == b1)
+        return 1;
+    }
+  }
+  return 0;
 }