diff options
| -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 |