case DW_TAG_structure_type:
case DW_TAG_union_type:
if(subtype->byte_size == 0){ /*declaration of the type, need the complete description */
- dw_type_t full_type = xbt_dict_get_or_null(other_info->types_by_name, subtype->name);
- if(full_type) {
- type = full_type;
- } else {
subtype = xbt_dict_get_or_null(other_info->types_by_name, subtype->name);
switch_types = 1;
- }
}
elm_size = subtype->byte_size;
break;
// The pointers are both in the heap:
if(addr_pointed1 > std_heap && (char *)addr_pointed1 < (char*) std_heap + STD_HEAP_SIZE){
if(!(addr_pointed2 > std_heap && (char *)addr_pointed2 < (char*) std_heap + STD_HEAP_SIZE))
- xbt_die("Die");
+ return 1;
return compare_heap_area(addr_pointed1, addr_pointed2, NULL, info, other_info, type->dw_type_id, pointer_level);
}
// The pointers are both in the current object R/W segment:
else if(addr_pointed1 > start_data && (char*)addr_pointed1 <= (char *)start_data + region_size){
if(!(addr_pointed2 > start_data && (char*)addr_pointed2 <= (char *)start_data + region_size))
- xbt_die("Die");
+ return 1;
if(type->dw_type_id == NULL)
return (addr_pointed1 != addr_pointed2);
else
xbt_os_walltimer_start(timer);
#endif
+ int hash_result = 0;
if(MC_USE_SNAPSHOT_HASH) {
- if(s1->hash != s2->hash) {
+ hash_result = (s1->hash != s2->hash);
+ if(hash_result) {
XBT_VERB("(%d - %d) Different hash : 0x%" PRIx64 "--0x%" PRIx64, num1, num2, s1->hash, s2->hash);
+#ifndef MC_DEBUG
return 1;
+#endif
} else {
XBT_VERB("(%d - %d) Same hash : 0x%" PRIx64, num1, num2, s1->hash);
}
#endif
#ifdef MC_VERBOSE
- if(errors==0)
+ if(errors || hash_result)
+ XBT_VERB("(%d - %d) Difference found", num1, num2);
+ else
XBT_VERB("(%d - %d) No difference found", num1, num2);
#endif
- return errors > 0;
+
+#if defined(MC_DEBUG) && defined(MC_VERBOSE) && MC_USE_SNAPSHOT_HASH
+ // * false positive SHOULD be avoided.
+ // * There MUST not be any false negative.
+
+ XBT_VERB("(%d - %d) State equality hash test is %s %s", num1, num2,
+ (hash_result!=0) == (errors!=0) ? "true" : "false",
+ !hash_result ? "positive" : "negative");
+#endif
+
+ return errors > 0 || hash_result;
}