-
- if(addr_pointed1 > std_heap && (char *)addr_pointed1 < (char*) std_heap + STD_HEAP_SIZE && addr_pointed2 > std_heap && (char *)addr_pointed2 < (char*) std_heap + STD_HEAP_SIZE){
- return compare_heap_area(addr_pointed1, addr_pointed2, NULL, types, other_types, type->dw_type_id, pointer_level);
- }else if(addr_pointed1 > start_data && (char*)addr_pointed1 <= (char *)start_data + region_size && addr_pointed2 > start_data && (char*)addr_pointed2 <= (char *)start_data + region_size){
- if(type->dw_type_id == NULL)
- return (addr_pointed1 != addr_pointed2);
- else
- return compare_areas_with_type(addr_pointed1, addr_pointed2, types, other_types, type->dw_type_id, region_size, region_type, start_data, pointer_level);
- }else{
- return (addr_pointed1 != addr_pointed2);
+
+ // Some cases are not handled here:
+ // * the pointers lead to different areas (one to the heap, the other to the RW segment ...);
+ // * a pointer leads to the read-only segment of the current object;
+ // * a pointer lead to a different ELF object.
+
+ if (addr_pointed1 > std_heap
+ && addr_pointed1 < mc_snapshot_get_heap_end(snapshot1)) {
+ if (!
+ (addr_pointed2 > std_heap
+ && addr_pointed2 < mc_snapshot_get_heap_end(snapshot2)))
+ return 1;
+ // The pointers are both in the heap:
+ return compare_heap_area(addr_pointed1, addr_pointed2, snapshot1,
+ snapshot2, NULL, type->subtype, 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))
+ return 1;
+ if (type->dw_type_id == NULL)
+ return (addr_pointed1 != addr_pointed2);
+ else {
+ void *translated_addr_pointer1 =
+ mc_translate_address((uintptr_t) addr_pointed1, snapshot1);
+ void *translated_addr_pointer2 =
+ mc_translate_address((uintptr_t) addr_pointed2, snapshot2);
+ return compare_areas_with_type(translated_addr_pointer1,
+ translated_addr_pointer2, snapshot1,
+ snapshot2, type->subtype, region_size,
+ region_type, start_data,
+ pointer_level);
+ }
+ }
+
+ else {
+ return (addr_pointed1 != addr_pointed2);