- }
-
- /* Hamming distance on different blocks */
- distance = 0;
-
- //for(k=0;k<mdp1->heapinfo[i].busy_block.size * BLOCKSIZE;k++){
- for(k=0;k<mdp1->heapinfo[i].busy_block.busy_size;k++){
- if((((char *)addr_block1) + k != 0) && (((char *)addr_block2) + k != 0)){
- 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);
- pointer_align = (k / sizeof(void*)) * sizeof(void*);
- address_pointed1 = *((void **)((char *)addr_block1 + pointer_align));
- address_pointed2 = *((void **)((char *)addr_block2 + pointer_align));
- if(((address_pointed1 > (void *)s_heap) && (address_pointed1 < mdp1->breakval)) && ((address_pointed2 > (void *)s_heap) && (address_pointed2 < mdp2->breakval))){
- block_pointed1 = ((char*)address_pointed1 - (char*)((struct mdesc*)s_heap)->heapbase) % BLOCKSIZE;
- block_pointed2 = ((char*)address_pointed2 - (char*)((struct mdesc*)s_heap)->heapbase) % BLOCKSIZE;
- //fprintf(stderr, "Blocks pointed : %d - %d\n", block_pointed1, block_pointed2);
- if((block_pointed1 == 0) && (block_pointed2 == 0)){
- 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;
- if(mdp1->heapinfo[block_pointed1].type == mdp2->heapinfo[block_pointed2].type){
- if(mdp1->heapinfo[block_pointed1].type == 0){ // Large block
- if(mdp1->heapinfo[block_pointed1].busy_block.busy_size == mdp2->heapinfo[block_pointed2].busy_block.busy_size){
- addr_block_pointed1 = (char*)heapbase1 + ((block_pointed1 - 1)*BLOCKSIZE);
- addr_block_pointed2 = (char*)heapbase2 + ((block_pointed2 - 1)*BLOCKSIZE);
- if(memcmp(addr_block_pointed1, addr_block_pointed2, mdp1->heapinfo[block_pointed1].busy_block.busy_size) != 0){
- distance++;
- }else{
- fprintf(stderr, "False difference detected\n");
- }
- }else{
- distance++;
- }
- }else{ // Fragmented block
- addr_block_pointed1 = (char*)mdp1 + ((char *)address_pointed1 - (char *)s_heap);
- addr_block_pointed2 = (char*)mdp2 + ((char *)address_pointed2 - (char *)s_heap);
- if(mdp1->heapinfo[block_pointed1].busy_frag.frag_size[0] == mdp2->heapinfo[block_pointed2].busy_frag.frag_size[0]){
- if(memcmp(addr_block_pointed1, addr_block_pointed2, mdp1->heapinfo[block_pointed1].busy_frag.frag_size[0]) != 0){
- fprintf(stderr, "Pointed fragments are different \n");
- distance++;
- }else{
- fprintf(stderr, "False difference detected\n");
- }
- }else{
- fprintf(stderr, "Different size of pointed fragments\n");
- distance ++;
- }
- }
- }else{
- fprintf(stderr, "Pointers on blocks with different types \n");
+ }
+
+ /* Hamming distance on different blocks */
+ distance = 0;
+
+
+ for(k=0;k<mdp1->heapinfo[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);
+
+ 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 ! \n");
+ fflush(NULL);
+ distance++;
+ continue;
+ }*/
+
+ if(((char *) address_pointed1 > (char*)((struct mdesc*)s_heap)->heapbase) && (block_pointed1 < mdp1->heapsize) && (block_pointed1 >= 1)){
+ addr_block_pointed1 = ((void*) (((ADDR2UINT((size_t)block_pointed1)) - 1) * BLOCKSIZE + (char*)heapbase1));
+ if(((char *) address_pointed2 > (char*)((struct mdesc*)s_heap)->heapbase) && (block_pointed2 < mdp2->heapsize) && (block_pointed2 >= 1)){
+ addr_block_pointed2 = ((void*) (((ADDR2UINT((size_t)block_pointed2)) - 1) * BLOCKSIZE + (char*)heapbase2));
+ }else{
+ addr_block_pointed2 = addr_block2;
+ block_pointed2 = i;
+ }
+ }else{
+ addr_block_pointed1 = addr_block1;
+ block_pointed1 = i;
+ if(((char *) address_pointed2 > (char*)((struct mdesc*)s_heap)->heapbase) && (block_pointed2 < mdp2->heapsize) && (block_pointed2 >= 1)){
+ addr_block_pointed2 = ((void*) (((ADDR2UINT((size_t)block_pointed2)) - 1) * BLOCKSIZE + (char*)heapbase2));
+ }else{
+ fprintf(stderr, "Unknown pointers ! \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));
+
+ if(mdp1->heapinfo[block_pointed1].type == mdp2->heapinfo[block_pointed2].type){
+
+ if(mdp1->heapinfo[block_pointed1].type == 0){ // Large block
+
+ if(mdp1->heapinfo[block_pointed1].busy_block.busy_size == mdp2->heapinfo[block_pointed2].busy_block.busy_size){
+
+ if(memcmp(addr_block_pointed1, addr_block_pointed2, mdp1->heapinfo[block_pointed1].busy_block.busy_size) != 0){