From 1c91f6ac86ab8f68f85aacb190ab854e5aa78a84 Mon Sep 17 00:00:00 2001 From: Ayrton Date: Fri, 24 Nov 2023 15:45:38 -0700 Subject: [PATCH] Generation errors fixed or gracefully handled --- ast_generator/ast_generator.py | 26 +++++++++++++++++++++++- ast_generator/test/config.yaml | 17 +++++++++------- ast_generator/test/test_ast_generator.py | 16 +++++++++++++++ fuzzer.py | 5 +++++ gazprea_fuzzer.py | 13 +++++++++--- 5 files changed, 66 insertions(+), 11 deletions(-) diff --git a/ast_generator/ast_generator.py b/ast_generator/ast_generator.py index 3106c3c..19b8e7d 100644 --- a/ast_generator/ast_generator.py +++ b/ast_generator/ast_generator.py @@ -156,6 +156,8 @@ class AstGenerator: self.generate_return(return_type=return_type, return_value=return_value) if self.settings['generation-options']['generate-dead-code']: self.generate_statements(exclude='declaration') + + self.print_all_current_scope_vars() self.pop_scope() self.current_ast_element = parent @@ -643,7 +645,7 @@ class AstGenerator: self.comp_op_numline, self.comp_op_cutoffs, self.comp_op_options, - comparison=True) + comparison=True) #, evals=self.get_truth()) def push_scope(self, xml_element: ET.Element = None): scope = Scope(self.current_scope) @@ -899,3 +901,25 @@ class AstGenerator: self.generate_binary(op, random.choice([GAZ_INT_KEY, GAZ_FLOAT_KEY])) else: self.generate_binary(op, random.choice(expr_type)) + + def print_all_current_scope_vars(self): + for key, value in self.current_scope.symbols.items(): + if isinstance(value, Variable): + self.print_variable(value) + + def print_variable(self, var: Variable): + """ + @brief generate an outstream for a variable + + @param var: the variable to print + @return: + """ + parent = self.current_ast_element + + args = [ + ("type", GAZ_OUT_STREAM), + ] + self.make_element(GAZ_STREAM_TAG, args) + self.current_ast_element.append(var.xml) + + self.current_ast_element = parent diff --git a/ast_generator/test/config.yaml b/ast_generator/test/config.yaml index 65cb2cf..5ad7b7a 100644 --- a/ast_generator/test/config.yaml +++ b/ast_generator/test/config.yaml @@ -9,7 +9,7 @@ generation-options: max-globals: 5 # maximum number of global variables properties: max-range-length: 5 # maximum length of ranges, vectors and tuples, (AxA matrices can exist) - use-english-words: True # use english words instead of random names (this may limit the maximum number of names) + use-english-words: True # use english words instead of random names (if we run out, we switch to random) id-length: # length of identifiers min: 1 max: 5 @@ -68,12 +68,12 @@ statement-weights: # set to 0 for any statements y in-stream: 5 type-weights: - value-types: - integer: 50 - real: 50 - boolean: 50 - character: 50 - void: 10 + atomic-types: + int: 50 # TODO change these to the gaz types + float: 50 + bool: 50 + char: 50 + void: 0 # TODO add support for void composite-types: vector: 20 tuple: 5 @@ -90,6 +90,9 @@ misc-weights: type-qualifier-weights: const: 10 var: 60 + conditional-eval: + true: 50 + false: 50 block-termination-probability: 0.2 # probability for a block to terminate diff --git a/ast_generator/test/test_ast_generator.py b/ast_generator/test/test_ast_generator.py index f69949d..98fc68d 100644 --- a/ast_generator/test/test_ast_generator.py +++ b/ast_generator/test/test_ast_generator.py @@ -309,6 +309,22 @@ class TestGeneration(unittest.TestCase): return res + def test_print_all_current_scope_vars(self): + self.ast_gen.ast = ET.Element("block") + self.ast_gen.current_ast_element = self.ast_gen.ast + self.ast_gen.generate_declaration(mut='var') + self.ast_gen.generate_declaration(mut='var') + self.ast_gen.generate_declaration(mut='var') + self.ast_gen.generate_declaration(mut='var') + + self.ast_gen.print_all_current_scope_vars() + + print(ET.tostring(self.ast_gen.ast)) + + streams = self.ast_gen.ast.findall("stream") + + self.assertEqual(4, len(streams)) + def write_ast(self): dom = xml.dom.minidom.parseString(ET.tostring(self.ast_gen.ast).decode('utf-8')) pretty: str = dom.toprettyxml() diff --git a/fuzzer.py b/fuzzer.py index 1e89255..8d4b3ec 100644 --- a/fuzzer.py +++ b/fuzzer.py @@ -28,6 +28,11 @@ class GazpreaFuzzer: self.ground_truth = None self.out = None + try: + os.makedirs('debug/ast') + except FileExistsError: + pass + def fuzz(self): self.generator.generate_ast() self.write_ast() # FIXME sometimes this is none diff --git a/gazprea_fuzzer.py b/gazprea_fuzzer.py index 1ad7d78..e7d2722 100644 --- a/gazprea_fuzzer.py +++ b/gazprea_fuzzer.py @@ -61,6 +61,7 @@ class Fuzzer(): pass i = 0 + min_i = 0 while i < self.batch: try: self.fuzzer.fuzz() @@ -71,8 +72,10 @@ class Fuzzer(): "".format(r)) with open(f"{fuzzer_asterr}/{r}.xml", 'w') as f: f.write(xml.dom.minidom.parseString(ET.tostring(self.fuzzer.ast).decode('utf-8')).toprettyxml()) - - i -= 1 + if i - 1 >= min_i: + i -= 1 + else: + i = min_i continue dom = xml.dom.minidom.parseString(ET.tostring(self.fuzzer.ast).decode('utf-8')) pretty: str = dom.toprettyxml() @@ -89,7 +92,10 @@ class Fuzzer(): os.system("rm -f {}/{}_{}.py".format(fuzzer_ground_truth, self.file_name, i)) os.system("rm -f {}/{}_{}.py".format(fuzzer_outputs, self.file_name, i)) warnings.warn("Runtime error encountered, retrying") - i -= 1 + if i - 1 >= min_i: + i -= 1 + else: + i = min_i continue except KeyboardInterrupt: r = random.randint(0, 1000000) @@ -109,6 +115,7 @@ class Fuzzer(): # with open("fuzzer/outputs/{}.out".format(i), 'w') as f: # f.write(self.fuzzer.out) i += 1 + min_i = i if __name__ == '__main__':