From: Marion Guthmuller Date: Sat, 29 Sep 2012 20:31:04 +0000 (+0200) Subject: model-checker : move functions about snapshot comparison in a separate file mc_compare.c X-Git-Tag: v3_8~127 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/bf667234dc6219eb5ee398d5dca36a3a16ec340f?hp=5ff134b7494ccde579f32d4db4cbf5ea4db0bf3f model-checker : move functions about snapshot comparison in a separate file mc_compare.c --- diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index a16e83ec90..8c2aab70cb 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -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 diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index 9360df8983..550e2cd42d 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -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 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; inum_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 index 0000000000..5e7db16994 --- /dev/null +++ b/src/mc/mc_compare.c @@ -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 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; inum_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; +} diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 17f89ce79c..fbca8a57ef 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -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; diff --git a/src/mc/test/compare_snapshot.c b/src/mc/test/compare_snapshot.c index b97a629832..d8ad53be3a 100644 --- a/src/mc/test/compare_snapshot.c +++ b/src/mc/test/compare_snapshot.c @@ -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);