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, void *heap1, void *heap2, xbt_dynar_t equals);
static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2);
+static size_t ignore(void *address);
+
+static size_t ignore(void *address){
+ unsigned int cursor = 0;
+ int start = 0;
+ int end = xbt_dynar_length(mc_comparison_ignore) - 1;
+ mc_ignore_region_t region;
+
+ while(start <= end){
+ cursor = (start + end) / 2;
+ region = (mc_ignore_region_t)xbt_dynar_get_as(mc_comparison_ignore, cursor, mc_ignore_region_t);
+ if(region->address == address)
+ return region->size;
+ if(region->address < address)
+ start = cursor + 1;
+ if(region->address > address)
+ end = cursor - 1;
+ }
+
+ return 0;
+}
static int data_program_region_compare(void *d1, void *d2, size_t size){
int distance = 0;
static int data_libsimgrid_region_compare(void *d1, void *d2, size_t size){
int distance = 0;
- size_t i = 0;
+ size_t i = 0, ignore_size = 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){
+ if((ignore_size = ignore((char *)start_data_libsimgrid+i)) > 0){
+ i = i + ignore_size;
+ continue;
+ }
pointer_align = (i / sizeof(void*)) * sizeof(void*);
addr_pointed1 = *((void **)((char *)d1 + pointer_align));
addr_pointed2 = *((void **)((char *)d2 + pointer_align));
xbt_fifo_t mc_stack_liveness = NULL;
mc_snapshot_t initial_snapshot_liveness = NULL;
int compare;
-xbt_dynar_t mc_binary_local_variables = NULL;
-extern xbt_dynar_t mmalloc_ignore;
+/* Local */
+xbt_dict_t mc_local_variables = NULL;
+
+/* Ignore mechanism */
+extern xbt_dynar_t mc_comparison_ignore;
extern xbt_dynar_t stacks_areas;
xbt_automaton_t _mc_property_automaton = NULL;
-static void MC_assert_pair(int prop);
-static e_dw_location_type get_location(char *expr, dw_location_t entry);
+/* Static functions */
-static void MC_get_binary_local_variables(void);
-static void print_local_variables(xbt_dynar_t list);
+static void MC_assert_pair(int prop);
+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);
void MC_do_the_modelcheck_for_real() {
if (!_surf_mc_property_file || _surf_mc_property_file[0]=='\0') {
/************ MC_ignore ***********/
-void MC_ignore_init(){
- MC_SET_RAW_MEM;
- mmalloc_ignore = xbt_dynar_new(sizeof(mc_ignore_region_t), NULL);
- stacks_areas = xbt_dynar_new(sizeof(stack_region_t), NULL);
- MC_UNSET_RAW_MEM;
-}
-
void MC_ignore(void *address, size_t size){
MC_SET_RAW_MEM;
+
+ if(mc_comparison_ignore == NULL)
+ mc_comparison_ignore = xbt_dynar_new(sizeof(mc_ignore_region_t), NULL);
mc_ignore_region_t region = NULL;
region = xbt_new0(s_mc_ignore_region_t, 1);
region->address = address;
region->size = size;
- region->block = ((char*)address - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1;
- if(((xbt_mheap_t)std_heap)->heapinfo[region->block].type == 0){
- region->fragment = -1;
- }else{
- region->fragment = ((uintptr_t) (ADDR2UINT (address) % (BLOCKSIZE))) >> ((xbt_mheap_t)std_heap)->heapinfo[region->block].type;
+ if((address >= std_heap) && (address <= (void*)((char *)std_heap + STD_HEAP_SIZE))){
+
+ region->block = ((char*)address - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1;
+
+ if(((xbt_mheap_t)std_heap)->heapinfo[region->block].type == 0){
+ region->fragment = -1;
+ }else{
+ region->fragment = ((uintptr_t) (ADDR2UINT (address) % (BLOCKSIZE))) >> ((xbt_mheap_t)std_heap)->heapinfo[region->block].type;
+ }
+
}
unsigned int cursor = 0;
mc_ignore_region_t current_region;
- xbt_dynar_foreach(mmalloc_ignore, cursor, current_region){
+ xbt_dynar_foreach(mc_comparison_ignore, cursor, current_region){
if(current_region->address > address)
break;
}
- xbt_dynar_insert_at(mmalloc_ignore, cursor, ®ion);
+ xbt_dynar_insert_at(mc_comparison_ignore, cursor, ®ion);
MC_UNSET_RAW_MEM;
}
void MC_new_stack_area(void *stack, char *name){
+
+ if(stacks_areas == NULL)
+ stacks_areas = xbt_dynar_new(sizeof(stack_region_t), NULL);
+
MC_SET_RAW_MEM;
stack_region_t region = NULL;
region = xbt_new0(s_stack_region_t, 1);
extern char *xbt_binary_name;
-xbt_dynar_t mmalloc_ignore;
+xbt_dynar_t mc_comparison_ignore;
xbt_dynar_t stacks_areas;
static void heap_area_pair_free(heap_area_pair_t pair);
static int compare_area(void *area1, void* area2, size_t size, xbt_dynar_t previous, int check_ignore);
static void match_equals(xbt_dynar_t list, xbt_dynar_t *equals);
-static int in_mmalloc_ignore(int block, int fragment);
+static int in_mc_comparison_ignore(int block, int fragment);
static size_t heap_comparison_ignore(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);
add_heap_area_pair(previous, current_block, -1, current_block, -1);
- if(ignore_done < xbt_dynar_length(mmalloc_ignore)){
- if(in_mmalloc_ignore((int)current_block, -1))
+ if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+ if(in_mc_comparison_ignore((int)current_block, -1))
res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 1);
else
res_compare = compare_area(addr_block1, addr_block2, heapinfo1[current_block].busy_block.busy_size, previous, 0);
/* Comparison */
add_heap_area_pair(previous, i1, -1, i2, -1);
- if(ignore_done < xbt_dynar_length(mmalloc_ignore)){
- if(in_mmalloc_ignore((int)i1, -1))
+ if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+ if(in_mc_comparison_ignore((int)i1, -1))
res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 1);
else
res_compare = compare_area(addr_block1, addr_block2, heapinfo1[i1].busy_block.busy_size, previous, 0);
add_heap_area_pair(previous, current_block, current_fragment, current_block, current_fragment);
- if(ignore_done < xbt_dynar_length(mmalloc_ignore)){
- if(in_mmalloc_ignore((int)current_block, (int)current_fragment))
+ if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+ if(in_mc_comparison_ignore((int)current_block, (int)current_fragment))
res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[current_block].busy_frag.frag_size[current_fragment], previous, 1);
else
res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[current_block].busy_frag.frag_size[current_fragment], previous, 0);
/* Comparison */
add_heap_area_pair(previous, i1, j1, i2, j2);
- if(ignore_done < xbt_dynar_length(mmalloc_ignore)){
- if(in_mmalloc_ignore((int)i1, (int)j1))
+ if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+ if(in_mc_comparison_ignore((int)i1, (int)j1))
res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[i1].busy_frag.frag_size[j1], previous, 1);
else
res_compare = compare_area(addr_frag1, addr_frag2, heapinfo1[i1].busy_frag.frag_size[j1], previous, 0);
return area;
}
-static int in_mmalloc_ignore(int block, int fragment){
+static int in_mc_comparison_ignore(int block, int fragment){
unsigned int cursor = 0;
int start = 0;
- int end = xbt_dynar_length(mmalloc_ignore) - 1;
+ int end = xbt_dynar_length(mc_comparison_ignore) - 1;
mc_ignore_region_t region;
while(start <= end){
cursor = (start + end) / 2;
- region = (mc_ignore_region_t)xbt_dynar_get_as(mmalloc_ignore, cursor, mc_ignore_region_t);
+ region = (mc_ignore_region_t)xbt_dynar_get_as(mc_comparison_ignore, cursor, mc_ignore_region_t);
if(region->block == block){
if(region->fragment == fragment)
return 1;
static size_t heap_comparison_ignore(void *address){
unsigned int cursor = 0;
int start = 0;
- int end = xbt_dynar_length(mmalloc_ignore) - 1;
+ int end = xbt_dynar_length(mc_comparison_ignore) - 1;
mc_ignore_region_t region;
while(start <= end){
cursor = (start + end) / 2;
- region = (mc_ignore_region_t)xbt_dynar_get_as(mmalloc_ignore, cursor, mc_ignore_region_t);
+ region = (mc_ignore_region_t)xbt_dynar_get_as(mc_comparison_ignore, cursor, mc_ignore_region_t);
if(region->address == address)
return region->size;
if(region->address < address)
if(add_heap_area_pair(previous, block_pointed1, -1, block_pointed2, -1)){
- if(ignore_done < xbt_dynar_length(mmalloc_ignore)){
- if(in_mmalloc_ignore(block_pointed1, -1))
+ if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+ if(in_mc_comparison_ignore(block_pointed1, -1))
res_compare = compare_area(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size, previous, 1);
else
res_compare = compare_area(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size, previous, 0);
if(add_heap_area_pair(previous, block_pointed1, frag_pointed1, block_pointed2, frag_pointed2)){
- if(ignore_done < xbt_dynar_length(mmalloc_ignore)){
- if(in_mmalloc_ignore(block_pointed1, frag_pointed1))
+ if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+ if(in_mc_comparison_ignore(block_pointed1, frag_pointed1))
res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 1);
else
res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 0);
if(add_heap_area_pair(previous, block_pointed1, frag_pointed1, block_pointed2, frag_pointed2)){
- if(ignore_done < xbt_dynar_length(mmalloc_ignore)){
- if(in_mmalloc_ignore(block_pointed1, frag_pointed1))
+ if(ignore_done < xbt_dynar_length(mc_comparison_ignore)){
+ if(in_mc_comparison_ignore(block_pointed1, frag_pointed1))
res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 1);
else
res_compare = compare_area(addr_frag_pointed1, addr_frag_pointed2, heapinfo1[block_pointed1].busy_frag.frag_size[frag_pointed1], previous, 0);