- switch(mdp1->heapinfo[i].type){ //FIXME deal with type<0 == free
- case 0 :
- if(mdp1->heapinfo[i].busy_block.size != mdp2->heapinfo[i].busy_block.size){
- if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
- XBT_DEBUG("Different size of a large cluster");
- errors++;
- }else{
- return 1;
- }
- }else{
- if(memcmp(addr_block1, addr_block2, (mdp1->heapinfo[i].busy_block.size * BLOCKSIZE)) != 0){
- if(XBT_LOG_ISENABLED(xbt_mm_legacy, xbt_log_priority_debug)){
- XBT_DEBUG("Different data in block %zu (size = %zu) (addr_block1 = %p (current = %p) - addr_block2 = %p)", i, mdp1->heapinfo[i].busy_block.size, addr_block1, (char *)std_heap_addr + sizeof(struct mdesc) + ((i-1) * BLOCKSIZE), addr_block2);
- errors++;
+ /* Hamming distance on different blocks */
+ distance = 0;
+
+
+ for(k=0;k<heapinfo1[i].busy_block.busy_size;k++){
+
+ if(memcmp(((char *)addr_block1) + k, ((char *)addr_block2) + k, 1) != 0){
+
+ fprintf(stderr, "Different byte (offset=%d) (%p - %p) in block %zu\n", k, (char *)addr_block1 + k, (char *)addr_block2 + k, i); fflush(NULL);
+
+ /* Check if pointer difference */
+ pointer_align = (k >> sizeof(void*)) * sizeof(void*);
+ address_pointed1 = *((void **)((char *)addr_block1 + pointer_align));
+ address_pointed2 = *((void **)((char *)addr_block2 + pointer_align));
+
+ fprintf(stderr, "Addresses pointed : %p - %p \n", address_pointed1, address_pointed2);
+
+ /* Get block number */
+ block_pointed1 = ((char*)address_pointed1 - (char*)((struct mdesc*)s_heap)->heapbase) / BLOCKSIZE + 1;
+ block_pointed2 = ((char*)address_pointed2 - (char*)((struct mdesc*)s_heap)->heapbase) / BLOCKSIZE + 1;
+
+ fprintf(stderr, "Blocks pointed : %d - %d\n", block_pointed1, block_pointed2);
+
+ if((char *) address_pointed1 < (char*)((struct mdesc*)s_heap)->heapbase || block_pointed1 > mdp1->heapsize || block_pointed1 < 1 || (char *) address_pointed2 < (char*)((struct mdesc*)s_heap)->heapbase || block_pointed2 > mdp2->heapsize || block_pointed2 < 1) {
+ fprintf(stderr, "Unknown pointer(s) ! \n");
+ fflush(NULL);
+ distance++;
+ continue;
+ }
+
+ addr_block_pointed1 = ((void*) (((ADDR2UINT((size_t)block_pointed1)) - 1) * BLOCKSIZE + (char*)heapbase1));
+ addr_block_pointed2 = ((void*) (((ADDR2UINT((size_t)block_pointed2)) - 1) * BLOCKSIZE + (char*)heapbase2));
+
+ fprintf(stderr, "Addr blocks pointed : %p - %p\n", addr_block_pointed1, addr_block_pointed2);
+
+ if(heapinfo1[block_pointed1].type == heapinfo2[block_pointed2].type){
+
+ if(heapinfo1[block_pointed1].type == 0){ // Large block
+
+ if(heapinfo1[block_pointed1].busy_block.busy_size == heapinfo2[block_pointed2].busy_block.busy_size){
+
+ if(memcmp(addr_block_pointed1, addr_block_pointed2, heapinfo1[block_pointed1].busy_block.busy_size) != 0){
+ distance++;
+ }else{
+ fprintf(stderr, "False difference detected\n");
+ }
+