else: from .GrammarFuzzer import GrammarFuzzer, all_terminals, display_tree if __package__ is None or __package__ == "": from Grammars import is_valid_grammar, EXPR_GRAMMAR, START_SYMBOL, crange, syntax_diagram else: from .Grammars import is_valid_grammar, EXPR_GRAMMAR, START_SYMBOL, crange, syntax_diagram if __package__ is None or __package__ == "": from Grammars import opts, exp_string, exp_opt, set_opts else: from .Grammars import opts, exp_string, exp_opt, set_opts PROBABILISTIC_EXPR_GRAMMAR = { "<start>": ["<expr>"], "<expr>": [("<term> + <expr>", opts(prob=0.1)), ("<term> - <expr>", opts(prob=0.2)), "<term>"], "<term>": [("<factor> * <term>", opts(prob=0.1)), ("<factor> / <term>", opts(prob=0.1)), "<factor>"], "<factor>": [ "+<factor>", "-<factor>", "(<expr>)", "<leadinteger>", "<leadinteger>.<integer>" ], "<leadinteger>": ["<leaddigit><integer>", "<leaddigit>"], # Benford's law: frequency distribution of leading digits "<leaddigit>": [ ("1", opts(prob=0.301)), ("2", opts(prob=0.176)), ("3", opts(prob=0.125)), ("4", opts(prob=0.097)),
def set_prob(grammar, symbol, expansion, prob): """Set the probability of the given expansion of grammar[symbol]""" set_opts(grammar, symbol, expansion, opts(prob=prob))
def float_grammar_with_range(start, end): float_grammar = extend_grammar(FLOAT_GRAMMAR) set_opts(float_grammar, "<float>", "<_float>", opts(pre=lambda: start + random.random() * (end - start))) return float_grammar
def int_grammar_with_range(start, end): int_grammar = extend_grammar(INT_GRAMMAR) set_opts(int_grammar, "<int>", "<_int>", opts(pre=lambda: random.randint(start, end))) return int_grammar
print(urlparse_fuzzer.fuzz()) # ## Synthesizing Oracles if __name__ == "__main__": print('\n## Synthesizing Oracles') if __package__ is None or __package__ == "": from GeneratorGrammarFuzzer import GeneratorGrammarFuzzer, ProbabilisticGeneratorGrammarFuzzer else: from .GeneratorGrammarFuzzer import GeneratorGrammarFuzzer, ProbabilisticGeneratorGrammarFuzzer URLPARSE_ORACLE_GRAMMAR = extend_grammar( URLPARSE_GRAMMAR, { "<call>": [("assert urlparse('<url>').geturl() == '<url>'", opts(post=lambda url_1, url_2: [None, url_1]))] }) if __name__ == "__main__": urlparse_oracle_fuzzer = GeneratorGrammarFuzzer(URLPARSE_ORACLE_GRAMMAR) test = urlparse_oracle_fuzzer.fuzz() print(test) if __name__ == "__main__": exec(test) URLPARSE_ORACLE_GRAMMAR = extend_grammar( URLPARSE_GRAMMAR, { "<call>": [( "result = urlparse('<scheme>://<host><path>?<params>')\n"
from Grammars import is_valid_grammar, EXPR_GRAMMAR, START_SYMBOL, crange, syntax_diagram else: from .Grammars import is_valid_grammar, EXPR_GRAMMAR, START_SYMBOL, crange, syntax_diagram if __package__ is None or __package__ == "": from Grammars import opts, exp_string, exp_opt, set_opts else: from .Grammars import opts, exp_string, exp_opt, set_opts PROBABILISTIC_EXPR_GRAMMAR = { "<start>": ["<expr>"], "<expr>": [("<term> + <expr>", opts(prob=0.1)), ("<term> - <expr>", opts(prob=0.2)), "<term>"], "<term>": [("<factor> * <term>", opts(prob=0.1)), ("<factor> / <term>", opts(prob=0.1)), "<factor>" ], "<factor>": ["+<factor>", "-<factor>", "(<expr>)", "<leadinteger>", "<leadinteger>.<integer>"], "<leadinteger>": ["<leaddigit><integer>", "<leaddigit>"],
# ### Functions Called Before Expansion if __name__ == "__main__": print('\n### Functions Called Before Expansion') import random def high_charge(): return random.randint(10000000, 90000000) / 100.0 if __name__ == "__main__": CHARGE_GRAMMAR.update({ "<float>": [("<integer>.<digit><digit>", opts(pre=high_charge))], }) def apply_twice(function, x): return function(function(x)) if __name__ == "__main__": apply_twice(lambda x: x * x, 2) if __name__ == "__main__": CHARGE_GRAMMAR.update({ "<float>": [("<integer>.<digit><digit>", opts(pre=lambda: random.randint(10000000, 90000000) / 100.0))]