diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-07-22 14:26:43 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-08-04 17:04:24 +0200 |
| commit | 19084a5729fd2ba5a0a13e19a82f12760d1861c9 (patch) | |
| tree | 78589fa7ba52d39f0d5e71f73e59639bfae42bec | |
| parent | 2e7e6f0536704cbcd40fba9d0308a73a1da92346 (diff) | |
| download | miasm-19084a5729fd2ba5a0a13e19a82f12760d1861c9.tar.gz miasm-19084a5729fd2ba5a0a13e19a82f12760d1861c9.zip | |
TypeMngr: generate name for unnamed structs/unions
| -rw-r--r-- | miasm2/core/ctypesmngr.py | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/miasm2/core/ctypesmngr.py b/miasm2/core/ctypesmngr.py index eeffb696..761689a8 100644 --- a/miasm2/core/ctypesmngr.py +++ b/miasm2/core/ctypesmngr.py @@ -118,10 +118,12 @@ class CTypeStruct(CTypeBase): """C type for structure""" def __init__(self, name, fields=None): + assert name is not None self.name = name if fields is None: fields = () - for _, field in fields: + for field_name, field in fields: + assert field_name is not None assert isinstance(field, CTypeBase) self.fields = tuple(fields) super(CTypeStruct, self).__init__() @@ -146,10 +148,12 @@ class CTypeUnion(CTypeBase): """C type for union""" def __init__(self, name, fields=None): + assert name is not None self.name = name if fields is None: fields = [] - for _, field in fields: + for field_name, field in fields: + assert field_name is not None assert isinstance(field, CTypeBase) self.fields = tuple(fields) super(CTypeUnion, self).__init__() @@ -292,6 +296,7 @@ class FuncNameIdentifier(c_ast.NodeVisitor): class CAstTypes(object): """Store all defined C types and typedefs""" INTERNAL_PREFIX = "__GENTYPE__" + ANONYMOUS_PREFIX = "__ANONYMOUS__" def __init__(self, knowntypes=None, knowntypedefs=None): if knowntypes is None: @@ -342,10 +347,20 @@ class CAstTypes(object): self.cpt += 1 return self.INTERNAL_PREFIX + "%d" % cpt + def gen_anon_name(self): + """Generate name for anonymous strucs/union""" + cpt = self.cpt + self.cpt += 1 + return self.ANONYMOUS_PREFIX + "%d" % cpt + def is_generated_name(self, name): """Return True if the name is internal""" return name.startswith(self.INTERNAL_PREFIX) + def is_anonymous_name(self, name): + """Return True if the name is anonymous""" + return name.startswith(self.ANONYMOUS_PREFIX) + def add_type(self, type_id, type_obj): """Add new C type @type_id: Type descriptor (CTypeBase instance) @@ -521,7 +536,11 @@ class CAstTypes(object): args = [] if ast.decls: for arg in ast.decls: - args.append((arg.name, self.ast_to_typeid(arg))) + if arg.name is None: + arg_name = self.gen_anon_name() + else: + arg_name = arg.name + args.append((arg_name, self.ast_to_typeid(arg))) decl = CTypeStruct(name, args) return decl @@ -531,7 +550,11 @@ class CAstTypes(object): args = [] if ast.decls: for arg in ast.decls: - args.append((arg.name, self.ast_to_typeid(arg))) + if arg.name is None: + arg_name = self.gen_anon_name() + else: + arg_name = arg.name + args.append((arg_name, self.ast_to_typeid(arg))) decl = CTypeUnion(name, args) return decl |