文法生成器:基于文法的随机测试生成器
grammarinator的Python项目详细描述
antlrv4基于语法的测试生成器
grammariator是创建测试用例的随机测试生成器/模糊器 根据输入ANTLRv4语法。背后的动机 基于语法的方法是利用 可用ANTLR v4 grammars。
安装
快捷方式:
pip3 install grammarinator
或者克隆项目并运行setuptools:
python3 setup.py install
用法
作为第一步,grammariator接受一个ANTLR v4语法并创建一个测试 python3中的生成器脚本。这样的生成器可以在以后的子类中 如果需要,可以进一步定制。
创建测试生成器的示例用法:
grammarinator-process <grammar-file(s)> -o <output-directory> --no-actions
注释
语法分析器使用ANTLR v4语法格式作为输入,这使得 现有语法(词法分析器和语法分析器规则)易于重用。但是,因为 一个fuzzer和一个解析器内在不同的目标,内联代码 (操作和条件、头和成员块)很可能不是 可重用,甚至阻止正确执行。第一次实验 现有语法文件^ {TT1}$支持命令行 选项--no-actions,在fuzzer期间跳过所有此类代码块 一代人。一旦内联代码被调整为模糊化,这个选项可能会被忽略。
在生成并可选地定制了一个fuzzer之后,可以执行它 通过grammarinator-generate脚本或通过实例化它 手动操作。
grammarinator-generate:
的示例用法grammarinator-generate -l <unlexer> -p <unparser> -r <start-rule> -d <max-depth> \ -o <output-pattern> -n <number-of-tests> \ -t <one-or-more-transformer>
注释
现实生活中的语法经常使用递归规则来表示某些模式。 然而,当使用这样的规则进行生成时,我们很容易在 意外的深度调用堆栈。使用--max-depth或-d选项,这个 深度——以及生成的测试用例的大小——是可以控制的。
antlr文法的另一个特点是它们支持所谓的 隐藏的标记。这些规则通常描述目标的这些元素 基本上可以放在任何地方而不破坏语法的语言。这个 最常见的例子是注释或空白。但是,当使用这些 语法-不明确定义空格可能出现或可能不出现的位置 在规则中-要生成测试用例,我们必须插入缺少的空格 手动操作。这可以通过应用各种变压器(使用^{tt7})来实现$ 选项)到输出测试的树表示。简单的变压器- 在每个unparser规则之后插入一个空格-由语法分析器提供 (grammarinator.runtime.simple_space_transformer)。
最后,我们不能忘记语法的最初目的 是各种输入的语法验证。因此,这些 语法只编码语法期望,而不是语义规则。如果我们 仍然想在生成的测试中添加语义知识,那么我们可以 从生成的fuzzer继承自定义fuzzer并重新定义方法 以编码所需的 知识(例如:HTMLCustomUnparser)。
工作示例
存储库包含生成html文件的最小example。给它 尝试一下,先运行处理器:
grammarinator-process examples/grammars/HTMLLexer.g4 \ examples/grammars/HTMLParser.g4 -o examples/fuzzer/
然后,使用生成器生成测试用例:
grammarinator-generate -l examples/fuzzer/HTMLCustomUnlexer.py \ -p examples/fuzzer/HTMLCustomUnparser.py -r htmlDocument \ -o examples/tests/test_%d.html -t HTMLUnparser.html_space_transformer -n 100 -d 20
兼容性
grammaringator测试时间:
- Linux(ubuntu 16.04/18.04)
- Mac OS X(Sierra 10.12/高Sierra 10.13/莫哈韦10.14)
引文
关于grammaringator的背景发表在(r.hodovan,a.kiss,t.gyimothy: “语法师:基于语法的开源模糊器”,A-test 2018)。
版权和许可
有执照的在bsd 3子句License下。