基于通用regexp的变异工具

universalmutator的Python项目详细描述


这是一个纯粹基于regexp指定的代码行重写的工具,用于生成变异,包括 由语言或项目的特殊规则辅助的多语言规则。

有关该项目的更多信息,请参阅2018年ICSE工具文件:https://agroce.github.io/icse18t.pdf

Aguest blog post为TRAIL位显示了如何使用通用变量来帮助改进使用C/A3}和LbFuffer-C++API API模糊化的努力。

universalmutator支持从python的TSTL测试工具中提取覆盖率信息以指导变异。

如何使用

要使用此功能,您只需执行以下操作:

pip install universalmutator

然后

mutate --help

简单示例用法

mutate foo.py

mutate foo.swift

如果安装了适当的编译器,应该生成一堆有效的、非平凡冗余的变体。

更复杂的例子

有时,变异的代码需要用比简单的编译器调用更复杂的命令来构建,当然,您需要帮助发现哪些变异是被杀死的而不是被杀死的。例如,要对包含在programming rusthttp://shop.oreilly.com/product/0636920040385.do)中的mandelbrot绘图示例的突变体进行变异和测试,只需执行以下操作:

git clone https://github.com/ProgrammingRust/mandelbrot
cd mandelbrot
cargo build
target/debug/mandelbrot origmandel.png 1000x750 -1.20,0.35 -1,0.20
mkdir mutants
mutate src/main.rs --mutantDir mutants --noCheck
analyze_mutants src/main.rs "cargo clean; cargo build; rm mandel.png; target/debug/mandelbrot mandel.png 1000x750 -1.20,0.35 -1,0.20; diff mandel.png origmandel.png" --mutantDir mutants

(如果你编辑^ {< CD5>}来降低最大线程数,使用8,而不是90。),这不会使用任何普通的编译器等价物,但仍然会杀死大约1000个突变体中的60%个。被杀死的突变文件名将在killed.txt中,而非被杀死的突变文件名将在not-killed.txt中。

使用类似maven的东西是非常相似的,除了您可能可以将复杂的构建/清理内容编辑为“mvn测试”或类似的内容。

当前支持的语言

如果你告诉它是“c”或其他东西,这个工具可能会改变其他东西,但是有基于文件结尾和特定规则支持的自动检测:

C
C++
Java
Python
Swift
Rust
Go
Solidity
Vyper

除C、C++和GO外,默认情况下都会尝试编译该突变。 文件并使用TCE检测冗余。当然,构建依赖关系 可能会破坏此过程,在这种情况下,nocheck将关闭tce 把所有的变种都放在目录里,用 真正的构建过程。从长远来看,我们计划与 标准的构建系统来避免这个问题,并且使用自动化测试 生成系统,例如 Python或针鼹 (https://github.com/trailofbits/echidna)。然而,即使现在 analyze_mutants设置 你的自动测试生成器。

变异固化代码

universalmutator最常用于smart 用坚实的语言写的合同。它支持一些特殊的 在这种情况下特别有用的功能。

首先, solidity库通常只使用internal函数编写 ---如果您 自行编译一个库,不产生非冗余的突变体。 为了处理这种情况,mutate可以使用--compile选项 指定另一个文件(使用库的协定,或 用于检查突变体是否 冗余。

其次,交换相邻的代码行是一种很少使用的变异。 在稳固的上下文中非常有吸引力的运算符,因为 交换状态更改操作和需求可能会显示 测试无法检测到 re-entrancy 脆弱性。测试可能会注意到没有支票,但是 不是一个错误的排序,这些突变可能会揭示这一点。添加代码 对突变进行交换,只需将--swap添加到mutate调用。注意 这种交换在任何语言中都有效;它们特别吸引人 对于智能合约。

更多信息

有关更多信息,请再次参见ICSE18上的https://agroce.github.io/icse18t.pdf--demo/tool论文。

这个项目的部分目的是看看突变能有多快被应用到新语言,一个工具的工作量有多大 卸载到编译器/测试分析工具。

作者:Alex Groce、Josie Holmes、Darko Marinov、August Shi、Lingming Zhang

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java http响应未定义   java在单个数组中添加浮点值和字符串值,并使用它们进行写入。CSV文件   映射中的java重复列引发实体异常,但没有重复列   java为什么是线程。stop()方法不安全吗?   如何在java中从trycatch块返回数组?   java如何使用多个线程作为客户端,每个线程都在switch语句中执行一项任务   Android GridView上的java滚动位置跳转   java丰富:listShuttle格式   Java中的macos评测本机方法奇怪的结果   这个Java程序需要是两个独立的文件吗   无法使用selenium Java或JavascriptExecutor发送密钥/单击   java如何配置Jetty在类更改时重新加载WebAppContext   java我不能发布com。安卓截击服务器错误   java如何在使用addOnScrollListener时显示滚动条   java如何避免数据模型贫乏?存储库可以注入实体吗?   没有集合的java选择排序。在ArrayList中排序   macos在MacOSX上升级JDK   java如何使用jpa模板编写查询