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))
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
    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"
Beispiel #6
0
    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))]