about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--example/ida/symbol_exec.py3
-rw-r--r--miasm2/expression/expression_helper.py23
-rw-r--r--test/expression/expression_helper.py13
3 files changed, 29 insertions, 10 deletions
diff --git a/example/ida/symbol_exec.py b/example/ida/symbol_exec.py
index b1601cef..c7aff5b5 100644
--- a/example/ida/symbol_exec.py
+++ b/example/ida/symbol_exec.py
@@ -16,7 +16,8 @@ class symbolicexec_t(idaapi.simplecustviewer_t):
 
     def expand(self, linenum):
         element = self.line2eq[linenum]
-        expanded = Variables_Identifier(element[1])
+        expanded = Variables_Identifier(element[1],
+                                        var_prefix="%s_v" % element[0])
         self.line2eq = self.line2eq[0:linenum] + \
             expanded.vars.items() + \
             [(element[0], expanded.equation)] + \
diff --git a/miasm2/expression/expression_helper.py b/miasm2/expression/expression_helper.py
index 2f0bd4e7..c94bc353 100644
--- a/miasm2/expression/expression_helper.py
+++ b/miasm2/expression/expression_helper.py
@@ -17,7 +17,6 @@
 #
 
 # Expressions manipulation functions
-import re
 import itertools
 import collections
 import random
@@ -210,16 +209,20 @@ class Variables_Identifier(object):
     - original expression with variables translated
     """
 
-    var_identifier = re.compile("v\d+")
+    # Attribute used to distinguish created variables from original ones
+    is_var_ident = "is_var_ident"
 
-    def __init__(self, expr):
+    def __init__(self, expr, var_prefix="v"):
         """Set the expression @expr to handle and launch variable identification
-        process"""
+        process
+        @expr: Expr instance
+        @var_prefix: (optional) prefix of the variable name, default is 'v'"""
 
         # Init
         self.var_indice = itertools.count()
         self.var_asked = set()
         self._vars = {} # VarID -> Expr
+        self.var_prefix = var_prefix
 
         # Launch recurrence
         self.find_variables_rec(expr)
@@ -282,12 +285,12 @@ class Variables_Identifier(object):
 
     @classmethod
     def is_var_identifier(cls, expr):
-        "Return True iff expr seems to be a variable identifier"
+        "Return True iff @expr is a variable identifier"
         if not isinstance(expr, m2_expr.ExprId):
             return False
 
-        match = cls.var_identifier.match(expr.name)
-        return match is not None and match.group(0) == expr.name
+        return hasattr(expr, cls.is_var_ident) and \
+            getattr(expr, cls.is_var_ident) == True
 
     def find_variables_rec(self, expr):
         """Recursive method called by find_variable to expand @expr.
@@ -301,8 +304,10 @@ class Variables_Identifier(object):
 
             if (expr not in self._vars.values()):
                 # Create var
-                identifier = m2_expr.ExprId("v%s" % self.var_indice.next(),
-                                    size = expr.size)
+                identifier = m2_expr.ExprId("%s%s" % (self.var_prefix,
+                                                      self.var_indice.next()),
+                                            size = expr.size)
+                setattr(identifier, self.__class__.is_var_ident, True)
                 self._vars[identifier] = expr
 
             # Recursion stop case
diff --git a/test/expression/expression_helper.py b/test/expression/expression_helper.py
index 3ff6f5da..e1674fdc 100644
--- a/test/expression/expression_helper.py
+++ b/test/expression/expression_helper.py
@@ -35,6 +35,19 @@ class TestExpressionExpressionHelper(unittest.TestCase):
             new_expr = new_expr.replace_expr({var_id: var_value})
         self.assertEqual(exprf, new_expr)
 
+        # Test prefix
+        vi = Variables_Identifier(exprf, var_prefix="prefix_v")
+
+        # Use __str__
+        print vi
+
+        # Test the result
+        new_expr = vi.equation
+        ## Force replace in the variable dependency order
+        for var_id, var_value in reversed(vi.vars.items()):
+            new_expr = new_expr.replace_expr({var_id: var_value})
+        self.assertEqual(exprf, new_expr)
+
 if __name__ == '__main__':
     testcase = TestExpressionExpressionHelper
     testsuite = unittest.TestLoader().loadTestsFromTestCase(testcase)