From ce7baba2507ebdcfeab667fde0eb7f11fc35b6c2 Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Fri, 13 Aug 2021 01:48:17 +0200 Subject: [PATCH] Fix random errors in parser type lookup super().__init__() needed to be explicitly called for superclass instance variable to be initialized --- gdb-port/parser-type-instrumentation-gdb.py | 42 +++++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py index 074c052..122f076 100644 --- a/gdb-port/parser-type-instrumentation-gdb.py +++ b/gdb-port/parser-type-instrumentation-gdb.py @@ -57,8 +57,7 @@ class VTTypes: class HParserEnv: def __init__(self, parser, top_level_parse): - print("HParserEnv constructed") # DEBUG - self.vt_types = top_level_parse.vt_types # Memoize parser type list + self.top_level_parse = top_level_parse # parser is expected to be a Parser object def name_from_vtable(self, parser): @@ -67,10 +66,12 @@ class HParserEnv: # perhaps using gdb.Value would be the best vtable_p = gdb.parse_and_eval("((HParser*) " + str(parser_addr) + ")->vtable") try: - name = parser_name_defaults[self.vt_types.lookup_by_address(vtable_p).name] + name = parser_name_defaults[self.top_level_parse.vt_types.lookup_by_address(vtable_p).name] # if lookup_by_address() returns None except AttributeError: name = "(Unknown parser type (vtable symbol not found in lookup)" + print("Lookup fail for: " + str(hex(parser_addr))) # DEBUG + print("vt_types: " + str(self.top_level_parse.vt_types)) # DEBUG except KeyError: name = "(Unknown parser type (vtable exists but has no default name associated)" @@ -105,6 +106,7 @@ class BindEnv(HParserEnv): self.continuation = int(continuation_p) env_p = gdb.parse_and_eval("((HBindEnv *) parser->env)->env") self.env = int(env_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(hex(self.continuation)), str(hex(self.env))]) @@ -115,6 +117,10 @@ class BitsEnv(HParserEnv): self.length = gdb.parse_and_eval("((HBitsEnv *) parser->env)->length") self.signedp = gdb.parse_and_eval("((HBitsEnv *) parser->env)->signedp") + super().__init__(parser, top_level_parse) + + def __str__(self): + return str([str(self.length), str(self.signedp)]) class ButNotEnv(HParserEnv): def __init__(self, parser, top_level_parse): @@ -124,6 +130,7 @@ class ButNotEnv(HParserEnv): self.p1 = top_level_parse.add_or_get_parser(p1_p) p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2") self.p2 = top_level_parse.add_or_get_parser(p2_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.p1), str(self.p2)]) @@ -141,6 +148,7 @@ class ActionEnv(HParserEnv): self.action = int(action) user_data_p = gdb.parse_and_eval("((HParseAction*) parser->env)->user_data") self.user_data_p = int(user_data_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(hex(self.action)), str(hex(self.user_data_p))]) @@ -152,6 +160,7 @@ class AndEnv(HParserEnv): member_parser_p = gdb.parse_and_eval("(HParser*) parser->env"); parser_obj = top_level_parse.add_or_get_parser(member_parser_p) self.member_parser = parser_obj + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser)]) @@ -162,6 +171,7 @@ class ChEnv(HParserEnv): self.ch_arg = gdb.parse_and_eval("(uint8_t) parser->env") self.ch_value = int(self.ch_arg) + super().__init__(parser, top_level_parse) def __str__(self): return str(self.ch_value) @@ -171,6 +181,7 @@ class CharsetEnv(HParserEnv): self.parser = parser self.charset_arg = gdb.parse_and_eval("(HCharset) parser->env") + super().__init__(parser, top_level_parse) def __str__(self): return str(self.charset_arg) @@ -209,6 +220,7 @@ class DifferenceEnv(HParserEnv): self.p1 = top_level_parse.add_or_get_parser(p1_p) p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2") self.p2 = top_level_parse.add_or_get_parser(p2_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.p1), str(self.p2)]) @@ -216,6 +228,7 @@ class DifferenceEnv(HParserEnv): class EndEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) def __str__(self): return "[]" @@ -228,6 +241,7 @@ class EndiannessEnv(HParserEnv): self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) endianness_val = gdb.parse_and_eval("((HParseEndianness *) parser->env)->endianness") self.endianness = int(endianness_val) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(self.endianness)]) @@ -235,6 +249,7 @@ class EndiannessEnv(HParserEnv): class EpsilonEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) def __str__(self): return "[]" @@ -247,6 +262,7 @@ class IgnoreEnv(HParserEnv): ignore_obj = top_level_parse.add_or_get_parser(ignored_p) self.member_parser = ignore_obj + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser)]) @@ -261,6 +277,7 @@ class IgnoreSeqEnv(HParserEnv): seq_len = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->len") which = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->which") self.which = int(which) + super().__init__(parser, top_level_parse) for index in range(0, seq_len): parser_p = gdb.parse_and_eval("((HIgnoreSeq*) parser->env)->parsers[" + str(index) + "]") @@ -282,6 +299,7 @@ class IndirectEnv(HParserEnv): self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) touched = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->touched") self.touched = bool(touched) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(self.touched)]) @@ -296,6 +314,7 @@ class IntRangeEnv(HParserEnv): self.lower = int(lower_val) upper_val = gdb.parse_and_eval("((HRange*) parser->env)->upper") self.upper = int(upper_val) + super().__init__(parser, top_level_parse) def __str__(self): @@ -310,6 +329,7 @@ class LengthValueEnv(HParserEnv): value_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->value") self.value_parser = top_level_parse.add_or_get_parser(value_parser_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.length_parser), str(self.value_parser)]) @@ -323,6 +343,7 @@ class ManyEnv(HParserEnv): # TODO: resolve these pointers, make parser objects self.separator = gdb.parse_and_eval("((HRepeat *) parser->env)->sep") self.p = gdb.parse_and_eval("((HRepeat *) parser->env)->p") + super().__init__(parser, top_level_parse) def __str__(self): return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count) @@ -334,6 +355,7 @@ class NotEnv(HParserEnv): member_p = gdb.parse_and_eval("(HParser*) parser->env") member_obj = top_level_parse.add_or_get_parser(member_p) self.member_parser = member_obj + super().__init__(parser, top_level_parse) def __str__(self): return str(self.member_parser) @@ -341,6 +363,7 @@ class NotEnv(HParserEnv): class NothingEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) def __str__(self): return "[]" @@ -352,6 +375,7 @@ class OptionalEnv(HParserEnv): member_p = gdb.parse_and_eval("(HParser*) parser->env") member_obj = top_level_parse.add_or_get_parser(member_p) self.member_parser = member_obj + super().__init__(parser, top_level_parse) def __str__(self): return str(self.member_parser) @@ -371,6 +395,7 @@ class PermutationEnv(HParserEnv): #[gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]") for index in range(0, num_parsers)] # TODO: maybe the loop can be replaced with a list comprehension #[top_level_parse.add_or_get_parser(gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) +"]")) for index in range(0, num_parsers)] + super().__init__(parser, top_level_parse) for index in range(0, num_parsers): parser_p = gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]") @@ -391,6 +416,7 @@ class SeekEnv(HParserEnv): whence_val = gdb.parse_and_eval("((HSeek *) parser->env)->whence") self.whence = int(whence_val) #TODO: enum for whence? + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.offset), str(self.whence)]) @@ -401,6 +427,7 @@ class SkipEnv(HParserEnv): skip_val = gdb.parse_and_eval("((uintptr_t) parser->env)") self.skip = int(skip_val) + super().__init__(parser, top_level_parse) def __str__(self): return str(self.skip) @@ -408,6 +435,7 @@ class SkipEnv(HParserEnv): class TellEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) def __str__(self): return "[]" @@ -415,7 +443,7 @@ class TellEnv(HParserEnv): # TODO: numeric parameter passed to parse_and_eval class SequenceEnv(HParserEnv): def __init__(self, parser, top_level_parse): - super().__init__(parser, top_level_parse) # TODO: maybe move self.parser to base class. otherwise, is this needed? + super().__init__(parser, top_level_parse) self.parser = parser self.member_parsers = [] @@ -447,6 +475,7 @@ class TokenEnv(HParserEnv): str_len = gdb.parse_and_eval("((HToken *) parser->env)->len") self.str_len = int(str_len) #TODO: get str_len bytes from memory and save it + super().__init__(parser, top_level_parse) def __str__(self): return str(hex(self.token)) @@ -454,6 +483,7 @@ class TokenEnv(HParserEnv): class UnimplemenetedEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) def __str__(self): return "[]" @@ -467,6 +497,7 @@ class GetEnv(HParserEnv): self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key") self.key = int(key_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(hex(self.key))]) @@ -479,6 +510,7 @@ class PutEnv(HParserEnv): self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key") self.key = int(key_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(hex(self.key))]) @@ -489,6 +521,7 @@ class WhitespaceEnv(HParserEnv): member_parser_p = gdb.parse_and_eval("(HParser *) parse->env") self.member_parser = top_level_parse.add_or_get_parser(member_parser_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser)]) @@ -501,6 +534,7 @@ class XorEnv(HParserEnv): self.p1 = top_level_parse.add_or_get_parser(p1_p) p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2") self.p2 = top_level_parse.add_or_get_parser(p2_p) + super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.p1), str(self.p2)]) -- GitLab