Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
Public Member Functions | Public Attributes | Static Public Attributes | Properties | Private Member Functions | Private Attributes | List of all members
miasm2.expression.expression.ExprOp Class Reference
+ Inheritance diagram for miasm2.expression.expression.ExprOp:
+ Collaboration diagram for miasm2.expression.expression.ExprOp:

Public Member Functions

def __init__
 
def __str__
 
def get_r
 
def get_w
 
def __contains__
 
def is_function_call
 
def is_associative
 
def is_commutative
 
def visit
 
def copy
 
def depth
 
def graph_recursive
 
def set_size
 
def __getitem__
 
def get_size
 
def __repr__
 
def __hash__
 
def pre_eq
 
def __eq__
 
def __ne__
 
def __add__
 
def __sub__
 
def __div__
 
def __mod__
 
def __mul__
 
def __lshift__
 
def __rshift__
 
def __xor__
 
def __or__
 
def __and__
 
def __neg__
 
def __invert__
 
def replace_expr
 
def canonize
 
def msb
 
def zeroExtend
 
def signExtend
 
def graph
 
def set_mask
 

Public Attributes

 arg
 

Static Public Attributes

 is_term = False
 
 is_simp = False
 
 is_canon = False
 
 is_eval = False
 

Properties

 op = property(lambda self: self._op)
 
 args = property(lambda self: self._args)
 
 size = property(lambda self: self._size)
 
 mask = property(lambda self: ExprInt(-1, self.size))
 

Private Member Functions

def _exprhash
 
def _exprrepr
 

Private Attributes

 _args
 
 _size
 

Detailed Description

An ExprOp stand for an operation between Expr

Use cases:
 - var1 XOR var2
 - var1 + var2 + var3
 - parity bit(var1)

Definition at line 718 of file expression.py.

Constructor & Destructor Documentation

def miasm2.expression.expression.ExprOp.__init__ (   self,
  op,
  args 
)
Create an ExprOp
@op: str, operation
@*args: Expr, operand list

Definition at line 728 of file expression.py.

729  def __init__(self, op, *args):
730  """Create an ExprOp
731  @op: str, operation
732  @*args: Expr, operand list
733  """
734 
735  sizes = set([arg.size for arg in args])
736 
737  if len(sizes) != 1:
738  # Special cases : operande sizes can differ
739  if op not in ["segm"]:
740  raise ValueError(
741  "sanitycheck: ExprOp args must have same size! %s" %
742  ([(str(arg), arg.size) for arg in args]))
743 
744  if not isinstance(op, str):
745  raise ValueError("ExprOp: 'op' argument must be a string")
747  self._op, self._args = op, tuple(args)
748 
749  # Set size for special cases
750  if self._op in [
751  '==', 'parity', 'fcom_c0', 'fcom_c1', 'fcom_c2', 'fcom_c3',
752  'fxam_c0', 'fxam_c1', 'fxam_c2', 'fxam_c3',
753  "access_segment_ok", "load_segment_limit_ok", "bcdadd_cf",
754  "ucomiss_zf", "ucomiss_pf", "ucomiss_cf"]:
755  sz = 1
756  elif self._op in [TOK_INF, TOK_INF_SIGNED,
757  TOK_INF_UNSIGNED, TOK_INF_EQUAL,
758  TOK_INF_EQUAL_SIGNED, TOK_INF_EQUAL_UNSIGNED,
759  TOK_EQUAL, TOK_POS,
760  TOK_POS_STRICT,
761  ]:
762  sz = 1
763  elif self._op in ['mem_16_to_double', 'mem_32_to_double',
764  'mem_64_to_double', 'mem_80_to_double',
765  'int_16_to_double', 'int_32_to_double',
766  'int_64_to_double', 'int_80_to_double']:
767  sz = 64
768  elif self._op in ['double_to_mem_16', 'double_to_int_16',
769  'float_trunc_to_int_16', 'double_trunc_to_int_16']:
770  sz = 16
771  elif self._op in ['double_to_mem_32', 'double_to_int_32',
772  'float_trunc_to_int_32', 'double_trunc_to_int_32',
773  'double_to_float']:
774  sz = 32
775  elif self._op in ['double_to_mem_64', 'double_to_int_64',
776  'float_trunc_to_int_64', 'double_trunc_to_int_64',
777  'float_to_double']:
778  sz = 64
779  elif self._op in ['double_to_mem_80', 'double_to_int_80',
780  'float_trunc_to_int_80',
781  'double_trunc_to_int_80']:
782  sz = 80
783  elif self._op in ['segm']:
784  sz = self._args[1].size
785  else:
786  if None in sizes:
787  sz = None
788  else:
789  # All arguments have the same size
790  sz = list(sizes)[0]
792  self._size = sz

Member Function Documentation

def miasm2.expression.expression.Expr.__add__ (   self,
  a 
)
inherited

Definition at line 192 of file expression.py.

193  def __add__(self, a):
194  return ExprOp('+', self, a)

+ Here is the caller graph for this function:

def miasm2.expression.expression.Expr.__and__ (   self,
  a 
)
inherited

Definition at line 219 of file expression.py.

220  def __and__(self, a):
221  return ExprOp('&', self, a)

+ Here is the caller graph for this function:

def miasm2.expression.expression.ExprOp.__contains__ (   self,
  e 
)

Definition at line 826 of file expression.py.

827  def __contains__(self, e):
828  if self == e:
829  return True
830  for arg in self._args:
831  if arg.__contains__(e):
832  return True
833  return False
def miasm2.expression.expression.Expr.__div__ (   self,
  a 
)
inherited

Definition at line 198 of file expression.py.

199  def __div__(self, a):
200  return ExprOp('/', self, a)
def miasm2.expression.expression.Expr.__eq__ (   self,
  other 
)
inherited

Definition at line 183 of file expression.py.

184  def __eq__(self, other):
185  res = self.pre_eq(other)
186  if res is not None:
187  return res
188  return repr(self) == repr(other)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

def miasm2.expression.expression.Expr.__getitem__ (   self,
  i 
)
inherited

Definition at line 138 of file expression.py.

139  def __getitem__(self, i):
140  if not isinstance(i, slice):
141  raise TypeError("Expression: Bad slice: %s" % i)
142  start, stop, step = i.indices(self.size)
143  if step != 1:
144  raise ValueError("Expression: Bad slice: %s" % i)
145  return ExprSlice(self, start, stop)
def miasm2.expression.expression.Expr.__hash__ (   self)
inherited

Definition at line 165 of file expression.py.

166  def __hash__(self):
167  if self._hash is None:
168  self._hash = self._exprhash()
169  return self._hash

+ Here is the call graph for this function:

def miasm2.expression.expression.Expr.__invert__ (   self)
inherited

Definition at line 225 of file expression.py.

226  def __invert__(self):
227  s = self.size
228  return ExprOp('^', self, ExprInt(mod_size2uint[s](size2mask(s))))

+ Here is the call graph for this function:

def miasm2.expression.expression.Expr.__lshift__ (   self,
  a 
)
inherited

Definition at line 207 of file expression.py.

208  def __lshift__(self, a):
209  return ExprOp('<<', self, a)
def miasm2.expression.expression.Expr.__mod__ (   self,
  a 
)
inherited

Definition at line 201 of file expression.py.

202  def __mod__(self, a):
203  return ExprOp('%', self, a)
def miasm2.expression.expression.Expr.__mul__ (   self,
  a 
)
inherited

Definition at line 204 of file expression.py.

205  def __mul__(self, a):
206  return ExprOp('*', self, a)

+ Here is the caller graph for this function:

def miasm2.expression.expression.Expr.__ne__ (   self,
  a 
)
inherited

Definition at line 189 of file expression.py.

190  def __ne__(self, a):
191  return not self.__eq__(a)

+ Here is the call graph for this function:

def miasm2.expression.expression.Expr.__neg__ (   self)
inherited

Definition at line 222 of file expression.py.

223  def __neg__(self):
224  return ExprOp('-', self)
def miasm2.expression.expression.Expr.__or__ (   self,
  a 
)
inherited

Definition at line 216 of file expression.py.

217  def __or__(self, a):
218  return ExprOp('|', self, a)

+ Here is the caller graph for this function:

def miasm2.expression.expression.Expr.__repr__ (   self)
inherited

Definition at line 160 of file expression.py.

161  def __repr__(self):
162  if self._repr is None:
163  self._repr = self._exprrepr()
164  return self._repr

+ Here is the call graph for this function:

def miasm2.expression.expression.Expr.__rshift__ (   self,
  a 
)
inherited

Definition at line 210 of file expression.py.

211  def __rshift__(self, a):
212  return ExprOp('>>', self, a)
def miasm2.expression.expression.ExprOp.__str__ (   self)

Definition at line 796 of file expression.py.

797  def __str__(self):
798  if self.is_associative():
799  return '(' + self._op.join([str(arg) for arg in self._args]) + ')'
800  if (self._op.startswith('call_func_') or
801  len(self._args) > 2 or
802  self._op in ['parity', 'segm']):
803  return self._op + '(' + ', '.join([str(arg) for arg in self._args]) + ')'
804  if len(self._args) == 2:
805  return ('(' + str(self._args[0]) +
806  ' ' + self.op + ' ' + str(self._args[1]) + ')')
807  else:
808  return reduce(lambda x, y: x + ' ' + str(y),
809  self._args,
810  '(' + str(self._op)) + ')'

+ Here is the call graph for this function:

def miasm2.expression.expression.Expr.__sub__ (   self,
  a 
)
inherited

Definition at line 195 of file expression.py.

196  def __sub__(self, a):
197  return ExprOp('+', self, ExprOp('-', a))
def miasm2.expression.expression.Expr.__xor__ (   self,
  a 
)
inherited

Definition at line 213 of file expression.py.

214  def __xor__(self, a):
215  return ExprOp('^', self, a)

+ Here is the caller graph for this function:

def miasm2.expression.expression.ExprOp._exprhash (   self)
private

Definition at line 818 of file expression.py.

819  def _exprhash(self):
820  h_hargs = [hash(arg) for arg in self._args]
821  return hash((EXPROP, self._op, tuple(h_hargs)))

+ Here is the caller graph for this function:

def miasm2.expression.expression.ExprOp._exprrepr (   self)
private

Definition at line 822 of file expression.py.

823  def _exprrepr(self):
824  return "%s(%r, %s)" % (self.__class__.__name__, self._op,
825  ', '.join(repr(arg) for arg in self._args))

+ Here is the caller graph for this function:

def miasm2.expression.expression.Expr.canonize (   self)
inherited

Definition at line 247 of file expression.py.

248  def canonize(self):
249  "Canonize the Expression"
250 
251  def must_canon(e):
252  return not e.is_canon
253 
254  def canonize_visitor(e):
255  if e.is_canon:
256  return e
257  if isinstance(e, ExprOp):
258  if e.is_associative():
259  # ((a+b) + c) => (a + b + c)
260  args = []
261  for arg in e.args:
262  if isinstance(arg, ExprOp) and e.op == arg.op:
263  args += arg.args
264  else:
265  args.append(arg)
266  args = canonize_expr_list(args)
267  new_e = ExprOp(e.op, *args)
268  else:
269  new_e = e
270  elif isinstance(e, ExprCompose):
271  new_e = ExprCompose(canonize_expr_list_compose(e.args))
272  else:
273  new_e = e
274  new_e.is_canon = True
275  return new_e
276 
277  return self.visit(canonize_visitor, must_canon)

+ Here is the call graph for this function:

def miasm2.expression.expression.ExprOp.copy (   self)

Definition at line 853 of file expression.py.

854  def copy(self):
855  args = [arg.copy() for arg in self._args]
856  return ExprOp(self._op, *args)
def miasm2.expression.expression.ExprOp.depth (   self)

Definition at line 857 of file expression.py.

858  def depth(self):
859  depth = [arg.depth() for arg in self._args]
860  return max(depth) + 1
def miasm2.expression.expression.ExprOp.get_r (   self,
  mem_read = False,
  cst_read = False 
)

Definition at line 811 of file expression.py.

812  def get_r(self, mem_read=False, cst_read=False):
813  return reduce(lambda elements, arg:
814  elements.union(arg.get_r(mem_read, cst_read)), self._args, set())
def miasm2.expression.expression.Expr.get_size (   self)
inherited

Definition at line 146 of file expression.py.

147  def get_size(self):
148  raise DeprecationWarning("use X.size instead of X.get_size()")
def miasm2.expression.expression.ExprOp.get_w (   self)

Definition at line 815 of file expression.py.

816  def get_w(self):
817  raise ValueError('op cannot be written!', self)
def miasm2.expression.expression.Expr.graph (   self)
inherited
Return a DiGraph instance standing for Expr tree
Instance's display functions have been override for better visibility
Wrapper on graph_recursive

Definition at line 319 of file expression.py.

320  def graph(self):
321  """Return a DiGraph instance standing for Expr tree
322  Instance's display functions have been override for better visibility
323  Wrapper on graph_recursive"""
324 
325  # Create recursively the graph
326  graph = DiGraphExpr()
327  self.graph_recursive(graph)
328 
329  return graph

+ Here is the call graph for this function:

def miasm2.expression.expression.ExprOp.graph_recursive (   self,
  graph 
)

Definition at line 861 of file expression.py.

862  def graph_recursive(self, graph):
863  graph.add_node(self)
864  for arg in self._args:
865  arg.graph_recursive(graph)
866  graph.add_uniq_edge(self, arg)
867 
def miasm2.expression.expression.ExprOp.is_associative (   self)

Definition at line 837 of file expression.py.

838  def is_associative(self):
839  "Return True iff current operation is associative"
840  return (self._op in ['+', '*', '^', '&', '|'])

+ Here is the caller graph for this function:

def miasm2.expression.expression.ExprOp.is_commutative (   self)

Definition at line 841 of file expression.py.

842  def is_commutative(self):
843  "Return True iff current operation is commutative"
844  return (self._op in ['+', '*', '^', '&', '|'])
def miasm2.expression.expression.ExprOp.is_function_call (   self)

Definition at line 834 of file expression.py.

835  def is_function_call(self):
836  return self._op.startswith('call')
def miasm2.expression.expression.Expr.msb (   self)
inherited

Definition at line 278 of file expression.py.

279  def msb(self):
280  "Return the Most Significant Bit"
281  s = self.size
282  return self[s - 1:s]

+ Here is the caller graph for this function:

def miasm2.expression.expression.Expr.pre_eq (   self,
  other 
)
inherited
Return True if ids are equal;
False if instances are obviously not equal
None if we cannot simply decide

Definition at line 170 of file expression.py.

171  def pre_eq(self, other):
172  """Return True if ids are equal;
173  False if instances are obviously not equal
174  None if we cannot simply decide"""
175 
176  if id(self) == id(other):
177  return True
178  if self.__class__ is not other.__class__:
179  return False
180  if hash(self) != hash(other):
181  return False
182  return None

+ Here is the caller graph for this function:

def miasm2.expression.expression.Expr.replace_expr (   self,
  dct = None 
)
inherited
Find and replace sub expression using dct
@dct: dictionnary of Expr -> *

Definition at line 233 of file expression.py.

234  def replace_expr(self, dct=None):
235  """Find and replace sub expression using dct
236  @dct: dictionnary of Expr -> *
237  """
238  if dct is None:
239  dct = {}
240 
241  def my_replace(e, dct):
242  if e in dct:
243  return dct[e]
244  return e
245 
246  return self.visit(lambda e: my_replace(e, dct))

+ Here is the call graph for this function:

def miasm2.expression.expression.Expr.set_mask (   self,
  value 
)
inherited

Definition at line 330 of file expression.py.

331  def set_mask(self, value):
332  raise ValueError('mask is not mutable')
def miasm2.expression.expression.Expr.set_size (   self,
  value 
)
inherited

Definition at line 125 of file expression.py.

126  def set_size(self, value):
127  raise ValueError('size is not mutable')
def miasm2.expression.expression.Expr.signExtend (   self,
  size 
)
inherited
Sign extend to size
@size: int

Definition at line 295 of file expression.py.

296  def signExtend(self, size):
297  """Sign extend to size
298  @size: int
299  """
300  assert(self.size <= size)
301  if self.size == size:
302  return self
303  ad_size = size - self.size
304  c = ExprCompose([(self, 0, self.size),
305  (ExprCond(self.msb(),
306  ExprInt(size2mask(ad_size), ad_size),
307  ExprInt(0, ad_size)),
308  self.size, size)
309  ])
310  return c

+ Here is the call graph for this function:

def miasm2.expression.expression.ExprOp.visit (   self,
  cb,
  tv = None 
)

Definition at line 846 of file expression.py.

847  def visit(self, cb, tv=None):
848  args = [arg.visit(cb, tv) for arg in self._args]
849  modified = any([arg[0] != arg[1] for arg in zip(self._args, args)])
850  if modified:
851  return ExprOp(self._op, *args)
852  return self

+ Here is the caller graph for this function:

def miasm2.expression.expression.Expr.zeroExtend (   self,
  size 
)
inherited
Zero extend to size
@size: int

Definition at line 283 of file expression.py.

284  def zeroExtend(self, size):
285  """Zero extend to size
286  @size: int
287  """
288  assert(self.size <= size)
289  if self.size == size:
290  return self
291  ad_size = size - self.size
292  n = ExprInt(0, ad_size)
293  return ExprCompose([(self, 0, self.size),
294  (n, self.size, size)])

Member Data Documentation

miasm2.expression.expression.ExprOp._args
private

Definition at line 746 of file expression.py.

miasm2.expression.expression.ExprOp._size
private

Definition at line 791 of file expression.py.

miasm2.expression.expression.Expr.arg
inherited

Definition at line 129 of file expression.py.

miasm2.expression.expression.Expr.is_canon = False
staticinherited

Definition at line 119 of file expression.py.

miasm2.expression.expression.Expr.is_eval = False
staticinherited

Definition at line 120 of file expression.py.

miasm2.expression.expression.Expr.is_simp = False
staticinherited

Definition at line 118 of file expression.py.

miasm2.expression.expression.Expr.is_term = False
staticinherited

Definition at line 117 of file expression.py.

Property Documentation

miasm2.expression.expression.ExprOp.args = property(lambda self: self._args)
static

Definition at line 794 of file expression.py.

miasm2.expression.expression.Expr.mask = property(lambda self: ExprInt(-1, self.size))
staticinherited

Definition at line 333 of file expression.py.

miasm2.expression.expression.ExprOp.op = property(lambda self: self._op)
static

Definition at line 793 of file expression.py.

miasm2.expression.expression.Expr.size = property(lambda self: self._size)
staticinherited

Definition at line 131 of file expression.py.


The documentation for this class was generated from the following file: