-static int is_stack_ignore_variable(char *frame, char *var_name){
-
- unsigned int cursor = 0;
- int start = 0;
- int end = xbt_dynar_length(mc_stack_comparison_ignore) - 1;
- mc_stack_ignore_variable_t current_var;
-
- while(start <= end){
- cursor = (start + end) / 2;
- current_var = (mc_stack_ignore_variable_t)xbt_dynar_get_as(mc_stack_comparison_ignore, cursor, mc_stack_ignore_variable_t);
- if(strcmp(current_var->frame, frame) == 0){
- if(strcmp(current_var->var_name, var_name) == 0)
- return 1;
- if(strcmp(current_var->var_name, var_name) < 0)
- start = cursor + 1;
- if(strcmp(current_var->var_name, var_name) > 0)
- end = cursor - 1;
- }
- if(strcmp(current_var->frame, frame) < 0)
- start = cursor + 1;
- if(strcmp(current_var->frame, frame) > 0)
- end = cursor - 1;
- }
-
- return 0;
-}
-
-static int compare_local_variables(char *s1, char *s2, xbt_dynar_t heap_equals){
-
- xbt_dynar_t tokens1 = xbt_str_split(s1, NULL);
- xbt_dynar_t tokens2 = xbt_str_split(s2, NULL);
-
- xbt_dynar_t s_tokens1, s_tokens2;
- unsigned int cursor = 0;
- void *addr1, *addr2;
- char *ip1 = NULL, *ip2 = NULL;
-
- 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){
- if((strcmp(xbt_dynar_get_as(s_tokens1, 0, char *), "ip") == 0) && (strcmp(xbt_dynar_get_as(s_tokens2, 0, char *), "ip") == 0)){
- ip1 = strdup(xbt_dynar_get_as(s_tokens1, 1, char *));
- ip2 = strdup(xbt_dynar_get_as(s_tokens2, 1, char *));
- /*if(XBT_LOG_ISENABLED(mc_compare, xbt_log_priority_verbose))
- XBT_VERB("Instruction pointer : %s, Instruction pointer : %s", ip1, ip2);*/
- }
- 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 : %s - %s", xbt_dynar_get_as(s_tokens1, 0, char *), 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);
- return 1;
- }
- }
- }
- xbt_dynar_free(&s_tokens1);
- xbt_dynar_free(&s_tokens2);
- cursor++;
- }
-
- xbt_dynar_free(&tokens1);
- xbt_dynar_free(&tokens2);
- 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, 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;