From 015317004fee8cb5584097e26dd6d8db411915a1 Mon Sep 17 00:00:00 2001
From: Guillaume Petiot <guillaume.petiot@cea.fr>
Date: Thu, 31 Jan 2013 10:19:52 +0000
Subject: [PATCH] [e-acsl] fix _get_exact

---
 .../share/e-acsl/memory_model/e_acsl_bittree.c      | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_bittree.c b/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_bittree.c
index df1d159cc30..6d78a7cfc94 100644
--- a/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_bittree.c
+++ b/src/plugins/e-acsl/share/e-acsl/memory_model/e_acsl_bittree.c
@@ -296,7 +296,7 @@ void __add_element (struct _block * ptr) {
 	
 	curr->is_leaf = 0;
 	curr->mask = mask(new_node->addr, ptr->ptr);
-	curr->addr = (void*)((unsigned long)and(new_node, ptr) & curr->mask);
+	/*curr->addr = (void*)((unsigned long)and(new_node, ptr) & curr->mask);*/
 
 	/* smaller at left, higher at right */
 	if(new_node->addr < ptr->ptr) {
@@ -330,9 +330,14 @@ struct _block * __get_exact (void * ptr) {
     assert(tmp->left != NULL && tmp->right != NULL);
     
     /* visit child with greatest common prefix */
-    tmp = /*((tmp->mask >> 1) & ( ~ tmp->mask ) & (unsigned long)ptr)*/
-      ((unsigned long)ptr >= (unsigned long)tmp->right->addr) ?
-      tmp->right : tmp->left;
+    if(((unsigned long)tmp->right->addr & (unsigned long)tmp->right->mask)
+       == ((unsigned long)ptr & (unsigned long)tmp->right->mask))
+      tmp = tmp->right;
+    else if(((unsigned long)tmp->left->addr & (unsigned long)tmp->left->mask)
+	    == ((unsigned long)ptr & (unsigned long)tmp->left->mask))
+      tmp = tmp->left;
+    else
+      return NULL;
   }
 }
 
-- 
GitLab