def parse_loc_key(t): assert len(t) == 2 loc_key, size = LocKey(t[0]), t[1] return ExprLoc(loc_key, size)
def add_location(self, name=None, offset=None, strict=True): """Add a new location in the locationDB. Returns the corresponding LocKey. If @name is set, also associate a name to this new location. If @offset is set, also associate an offset to this new location. Strict mode (set by @strict, default): If a location with @offset or @name already exists, an error will be raised. Otherwise: If a location with @offset or @name already exists, the corresponding LocKey may be updated and will be returned. """ # Deprecation handling if is_int(name): assert offset is None or offset == name warnings.warn( "Deprecated API: use 'add_location(offset=)' instead." " An additional 'name=' can be provided to also " "associate a name (there is no more default name)") offset = name name = None # Argument cleaning offset_loc_key = None if offset is not None: offset = int(offset) offset_loc_key = self.get_offset_location(offset) # Test for collisions name_loc_key = None if name is not None: name_loc_key = self.get_name_location(name) if strict: if name_loc_key is not None: raise ValueError("An entry for %r already exists (%r), and " "strict mode is enabled" % (name, name_loc_key)) if offset_loc_key is not None: raise ValueError("An entry for 0x%x already exists (%r), and " "strict mode is enabled" % (offset, offset_loc_key)) else: # Non-strict mode if name_loc_key is not None: known_offset = self.get_offset_location(name_loc_key) if known_offset != offset: raise ValueError( "Location with name '%s' already have an offset: 0x%x " "(!= 0x%x)" % (name, offset, known_offset)) # Name already known, same offset -> nothing to do return name_loc_key elif offset_loc_key is not None: if name is not None: # Check for already known name are checked above return self.add_location_name(offset_loc_key, name) # Offset already known, no name specified return offset_loc_key # No collision, this is a brand new location loc_key = LocKey(self._loc_key_num) self._loc_key_num += 1 self._loc_keys.add(loc_key) if offset is not None: assert offset not in self._offset_to_loc_key self._offset_to_loc_key[offset] = loc_key self._loc_key_to_offset[loc_key] = offset if name is not None: self._name_to_loc_key[name] = loc_key self._loc_key_to_names[loc_key] = set([name]) return loc_key
from miasm2.expression.parser import str_to_expr from miasm2.expression.expression import ExprInt, ExprId, ExprSlice, ExprMem, \ ExprCond, ExprCompose, ExprOp, ExprAff, ExprLoc, LocKey for expr_test in [ ExprInt(0x12, 32), ExprId('test', 32), ExprLoc(LocKey(12), 32), ExprSlice(ExprInt(0x10, 32), 0, 8), ExprMem(ExprInt(0x10, 32), 32), ExprCond(ExprInt(0x10, 32), ExprInt(0x11, 32), ExprInt(0x12, 32)), ExprCompose(ExprInt(0x10, 16), ExprInt(0x11, 8), ExprInt(0x12, 8)), ExprInt(0x11, 8) + ExprInt(0x12, 8), ExprAff(ExprId('EAX', 32), ExprInt(0x12, 32)), ]: print 'Test: %s' % expr_test assert str_to_expr(repr(expr_test)) == expr_test