Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : move functions about snapshot comparison in a separate file mc_compare.c
authorMarion Guthmuller <marion.guthmuller@loria.fr>
Sat, 29 Sep 2012 20:31:04 +0000 (22:31 +0200)
committerMarion Guthmuller <marion.guthmuller@loria.fr>
Fri, 5 Oct 2012 17:19:15 +0000 (19:19 +0200)
buildtools/Cmake/DefinePackages.cmake
src/mc/mc_checkpoint.c
src/mc/mc_compare.c [new file with mode: 0644]
src/mc/mc_private.h
src/mc/test/compare_snapshot.c

index a16e83e..8c2aab7 100644 (file)
@@ -379,6 +379,7 @@ set(JEDULE_SRC
 
 set(MC_SRC
   src/mc/mc_checkpoint.c
+  src/mc/mc_compare.c
   src/mc/mc_dpor.c
   src/mc/mc_global.c
   src/mc/mc_liveness.c
index 9360df8..550e2cd 100644 (file)
@@ -158,152 +158,6 @@ void MC_free_snapshot(mc_snapshot_t snapshot)
   xbt_free(snapshot);
 }
 
-static int data_program_region_compare(void *d1, void *d2, size_t size){
-  int distance = 0;
-  size_t i = 0;
-  
-  for(i=0; i<size; i++){
-    if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
-      XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in data program region", i, (char *)d1 + i, (char *)d2 + i);
-      distance++;
-    }
-  }
-  
-  XBT_DEBUG("Hamming distance between data program regions : %d", distance);
-
-  return distance;
-}
-
-static int data_libsimgrid_region_compare(void *d1, void *d2, size_t size){
-  int distance = 0;
-  size_t i = 0;
-  int pointer_align;
-  void *addr_pointed1 = NULL, *addr_pointed2 = NULL;
-
-  for(i=0; i<size; i++){
-    if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
-      pointer_align = (i / sizeof(void*)) * sizeof(void*);
-      addr_pointed1 = *((void **)((char *)d1 + pointer_align));
-      addr_pointed2 = *((void **)((char *)d2 + pointer_align));
-      if((addr_pointed1 > start_plt && addr_pointed1 < end_plt) || (addr_pointed2 > start_plt && addr_pointed2 < end_plt)){
-        continue;
-      }else{
-        XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in data libsimgrid region", i, (char *)d1 + i, (char *)d2 + i);
-        XBT_DEBUG("Addresses pointed : %p - %p\n", addr_pointed1, addr_pointed2);
-        distance++;
-      }
-    }
-  }
-  
-  XBT_DEBUG("Hamming distance between data libsimgrid regions : %d", distance); fflush(NULL);
-  
-  return distance;
-}
-
-static int heap_region_compare(void *d1, void *d2, size_t size);
-
-static int heap_region_compare(void *d1, void *d2, size_t size){
-  
-  int distance = 0;
-  size_t i = 0;
-  
-  for(i=0; i<size; i++){
-    if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
-      //XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in heap region", i, (char *)d1 + i, (char *)d2 + i);
-      distance++;
-    }
-  }
-  
-  XBT_DEBUG("Hamming distance between heap regions : %d (total size : %zu)", distance, size);
-
-  return distance;
-}
-
-int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
-
-  int errors = 0, i;
-  //int dist = 0;
-
-  
-  if(s1->num_reg != s2->num_reg){
-    XBT_DEBUG("Different num_reg (s1 = %u, s2 = %u)", s1->num_reg, s2->num_reg);
-    return 1;
-  }
-
-  for(i=0 ; i< s1->num_reg ; i++){
-    
-    if(s1->regions[i]->type != s2->regions[i]->type){
-      XBT_INFO("Different type of region");
-      errors++;
-    }
-    
-    switch(s1->regions[i]->type){
-    case 0 :
-      /* Compare heapregion */
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_DEBUG("Different size of heap (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-        errors++;
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_DEBUG("Different start addr of heap (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-        errors++;
-      }
-      if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[i]->data, (xbt_mheap_t)s2->regions[i]->data)){
-        XBT_DEBUG("Different heap (mmalloc_compare)");
-        errors++; 
-      }
-      /*if(heap_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-        XBT_DEBUG("Different memcmp for heap");
-        errors++;
-        }*/
-      /*if((dist = mmalloc_linear_compare_heap((xbt_mheap_t)s1->regions[i]->data, (xbt_mheap_t)s2->regions[i]->data)) > 0){
-        XBT_DEBUG("Different heap (mmalloc_linear_compare) : %d", dist);
-        errors++; 
-        }*/
-      break;
-    case 1 :
-      /* Compare data libsimgrid region */
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_DEBUG("Different size of libsimgrid (data) (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-        errors++;
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_DEBUG("Different start addr of libsimgrid (data) (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-        errors++;
-      }
-      if(data_libsimgrid_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-        XBT_DEBUG("Different memcmp for data in libsimgrid");
-        errors++;
-      }
-      break;
-
-    case 2 :
-       /* Compare data program region */
-      if(s1->regions[i]->size != s2->regions[i]->size){
-        XBT_DEBUG("Different size of data program (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
-        //errors++;
-        return 1;
-      }
-      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
-        XBT_DEBUG("Different start addr of data program (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
-        //errors++;
-        return 1;
-      }
-      if(data_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
-        XBT_DEBUG("Different memcmp for data in program");
-        //errors++;
-        return 1;
-      }
-      break;
-    }
-
-  }
-
-
-  return errors > 0;
-  
-}
 
 void get_plt_section(){
 
diff --git a/src/mc/mc_compare.c b/src/mc/mc_compare.c
new file mode 100644 (file)
index 0000000..5e7db16
--- /dev/null
@@ -0,0 +1,240 @@
+/* Copyright (c) 2008-2012 Da SimGrid Team. All rights reserved.            */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "mc_private.h"
+
+#include "xbt/mmalloc.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_compare, mc,
+                                "Logging specific to mc_compare");
+
+static int data_program_region_compare(void *d1, void *d2, size_t size);
+static int data_libsimgrid_region_compare(void *d1, void *d2, size_t size);
+static int heap_region_compare(void *d1, void *d2, size_t size);
+
+static int compare_local_variables(xbt_strbuff_t s1, xbt_strbuff_t s2);
+static int compare_stack(stack_region_t s1, stack_region_t s2, void *sp1, void *sp2, xbt_dynar_t equals);
+static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2);
+
+static int data_program_region_compare(void *d1, void *d2, size_t size){
+  int distance = 0;
+  size_t i = 0;
+  
+  for(i=0; i<size; i++){
+    if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
+      XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in data program region", i, (char *)d1 + i, (char *)d2 + i);
+      distance++;
+    }
+  }
+  
+  XBT_DEBUG("Hamming distance between data program regions : %d", distance);
+
+  return distance;
+}
+
+static int data_libsimgrid_region_compare(void *d1, void *d2, size_t size){
+  int distance = 0;
+  size_t i = 0;
+  int pointer_align;
+  void *addr_pointed1 = NULL, *addr_pointed2 = NULL;
+
+  for(i=0; i<size; i++){
+    if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
+      pointer_align = (i / sizeof(void*)) * sizeof(void*);
+      addr_pointed1 = *((void **)((char *)d1 + pointer_align));
+      addr_pointed2 = *((void **)((char *)d2 + pointer_align));
+      if((addr_pointed1 > start_plt && addr_pointed1 < end_plt) || (addr_pointed2 > start_plt && addr_pointed2 < end_plt)){
+        continue;
+      }else{
+        XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in data libsimgrid region", i, (char *)d1 + i, (char *)d2 + i);
+        XBT_DEBUG("Addresses pointed : %p - %p\n", addr_pointed1, addr_pointed2);
+        distance++;
+      }
+    }
+  }
+  
+  XBT_DEBUG("Hamming distance between data libsimgrid regions : %d", distance); fflush(NULL);
+  
+  return distance;
+}
+
+static int heap_region_compare(void *d1, void *d2, size_t size){
+  
+  int distance = 0;
+  size_t i = 0;
+  
+  for(i=0; i<size; i++){
+    if(memcmp(((char *)d1) + i, ((char *)d2) + i, 1) != 0){
+      XBT_DEBUG("Different byte (offset=%zu) (%p - %p) in heap region", i, (char *)d1 + i, (char *)d2 + i);
+      distance++;
+    }
+  }
+  
+  XBT_DEBUG("Hamming distance between heap regions : %d (total size : %zu)", distance, size);
+
+  return distance;
+}
+
+int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){
+
+  int errors = 0, i;
+  xbt_dynar_t stacks1 = xbt_dynar_new(sizeof(stack_region_t), NULL);
+  xbt_dynar_t stacks2 = xbt_dynar_new(sizeof(stack_region_t), NULL);
+  xbt_dynar_t equals = xbt_dynar_new(sizeof(heap_equality_t), NULL);
+  
+  if(s1->num_reg != s2->num_reg){
+    XBT_DEBUG("Different num_reg (s1 = %u, s2 = %u)", s1->num_reg, s2->num_reg);
+    return 1;
+  }
+
+  for(i=0 ; i< s1->num_reg ; i++){
+    
+    if(s1->regions[i]->type != s2->regions[i]->type){
+      XBT_INFO("Different type of region");
+      errors++;
+    }
+    
+    switch(s1->regions[i]->type){
+    case 0 :
+      /* Compare heapregion */
+      if(s1->regions[i]->size != s2->regions[i]->size){
+        XBT_DEBUG("Different size of heap (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
+        return 1;
+      }
+      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
+        XBT_DEBUG("Different start addr of heap (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
+        return 1;
+      }
+      if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[i]->data, (xbt_mheap_t)s2->regions[i]->data, &stacks1, &stacks2, &equals)){
+        XBT_DEBUG("Different heap (mmalloc_compare)");
+        return 1; 
+      }
+      break;
+    case 1 :
+      /* Compare data libsimgrid region */
+      if(s1->regions[i]->size != s2->regions[i]->size){
+        XBT_DEBUG("Different size of libsimgrid (data) (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
+        return 1;
+      }
+      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
+        XBT_DEBUG("Different start addr of libsimgrid (data) (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
+        return 1;
+      }
+      if(data_libsimgrid_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
+        XBT_DEBUG("Different memcmp for data in libsimgrid");
+        return 1;
+      }
+      break;
+
+    case 2 :
+      /* Compare data program region */
+      if(s1->regions[i]->size != s2->regions[i]->size){
+        XBT_DEBUG("Different size of data program (s1 = %zu, s2 = %zu)", s1->regions[i]->size, s2->regions[i]->size);
+        return 1;
+      }
+      if(s1->regions[i]->start_addr != s2->regions[i]->start_addr){
+        XBT_DEBUG("Different start addr of data program (s1 = %p, s2 = %p)", s1->regions[i]->start_addr, s2->regions[i]->start_addr);
+        return 1;
+      }
+      if(data_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){
+        XBT_DEBUG("Different memcmp for data in program");
+        return 1;
+      }
+      break;
+    }
+
+  }
+
+  /* Stacks comparison */
+  unsigned int cursor = 1;
+  stack_region_t stack_region1, stack_region2;
+  void *stack_pointer1, *stack_pointer2;
+
+  while(cursor < xbt_dynar_length(stacks1)){
+    stack_region1 = (stack_region_t)(xbt_dynar_get_as(stacks1, cursor, stack_region_t));
+    stack_region2 = (stack_region_t)(xbt_dynar_get_as(stacks2, cursor, stack_region_t));
+    stack_pointer1 = ((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->stack_pointer;
+    stack_pointer2 = ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->stack_pointer;
+    if(compare_stack(stack_region1, stack_region2, stack_pointer1, stack_pointer2, equals) > 0)
+      return 1;
+    cursor++;
+  }
+
+  return 0;
+  
+}
+
+static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2){
+
+  unsigned int cursor = 0;
+  int start = 0;
+  int end = xbt_dynar_length(equals) - 1;
+  heap_equality_t current_equality;
+
+  while(start <= end){
+    cursor = (start + end) / 2;
+    current_equality = (heap_equality_t)xbt_dynar_get_as(equals, cursor, heap_equality_t);
+    if(current_equality->address1 == a1){
+      if(current_equality->address2 == a2)
+        return 1;
+      if(current_equality->address2 < a2)
+        start = cursor + 1;
+      if(current_equality->address2 > a2)
+        end = cursor - 1;
+    }
+    if(current_equality->address1 < a1)
+      start = cursor + 1;
+    if(current_equality->address1 > a1)
+      end = cursor - 1; 
+  }
+
+  return 0;
+
+}
+
+
+static int compare_stack(stack_region_t s1, stack_region_t s2, void *sp1, void *sp2, xbt_dynar_t equals){
+  
+  int k = 0, nb_diff = 0;
+  long size_used1 = (long)s1->size - (long)((char*)sp1 - (char*)s1->address);
+  long size_used2 = (long)s2->size - (long)((char*)sp2 - (char*)s2->address);
+
+  int pointer_align;
+  void *addr_pointed1 = NULL, *addr_pointed2 = NULL;
+
+  if(size_used1 == size_used2){
+
+    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){
+          XBT_DEBUG("Difference at offset %d (%p - %p)", k, (char *)s1->address + s1->size - k, (char *)s2->address + s2->size - k);
+          nb_diff++;
+        }
+      } 
+      k++;
+    }
+
+  }else{
+    XBT_DEBUG("Different size used between stacks");
+    return 1;
+  }
+
+  return nb_diff;
+}
+
+static int compare_local_variables(xbt_strbuff_t s1, xbt_strbuff_t s2){
+
+  if(strcmp(s1->data, s2->data) != 0){
+    XBT_DEBUG("%s", s1->data);
+    XBT_DEBUG("%s", s2->data);
+    return 1;
+  }
+  
+  return 0;
+} 
index 17f89ce..fbca8a5 100644 (file)
@@ -213,6 +213,8 @@ extern xbt_fifo_t mc_stack_liveness;
 extern mc_snapshot_t initial_snapshot_liveness;
 extern xbt_automaton_t _mc_property_automaton;
 extern int compare;
+extern void *start_plt;
+extern void *end_plt;
 
 typedef struct s_mc_pair{
   mc_snapshot_t system_state;
index b97a629..d8ad53b 100644 (file)
@@ -49,8 +49,9 @@ static void test2()
 
   MC_UNSET_RAW_MEM;
 
-  char* t = malloc(5);
-
+  char* t = malloc(50);
+  t = strdup("toto");
   MC_SET_RAW_MEM;
 
   /* Save second snapshot */
@@ -88,6 +89,7 @@ static void test3()
   MC_UNSET_RAW_MEM;
 
   char *t = malloc(5);
+  t = strdup("toto");
   free(t);
 
   MC_SET_RAW_MEM;
@@ -117,6 +119,7 @@ static void test4()
   fprintf(stderr, "\n**************** TEST 4 ****************\n\n");
 
   char *t = malloc(5);
+  t = strdup("toto");
 
   MC_SET_RAW_MEM;
 
@@ -237,6 +240,9 @@ void MC_test_snapshot_comparison(){
   MC_take_snapshot_liveness(initial); 
   MC_UNSET_RAW_MEM;
 
+  /* Get .plt section (start and end addresses) for data libsimgrid comparison */
+  get_plt_section();
+
   test1();
 
   MC_restore_snapshot(initial);