语法引导修复/转换包

tourniquet的Python项目详细描述


止血带

CI

一个Python库,便于C/C++语法指导的程序转换/修复。 这仍然是非常早期的发展。在

安装

PyPI

止血带可通过PyPI获得:

$ pip install tourniquet

您需要一个相对较新的CMake和LLVM(支持9、10和11)。在

Docker

止血带也可以在Docker容器中构建和运行:

^{pr2}$

输入ipython实例和import tourniquet

语法引导程序修复TL;DR

修复程序很难,而自动修复最流行的技术之一就是搜索。如果你熟悉 模糊化,基本上是相反的。在模糊化中,你是在变异输入导致崩溃,但在基于搜索的程序中 修复你正在改变程序直到你通过一些特定的测试。在

这种基于搜索的方法的一个巨大的缺点是搜索空间很大,而且其中大多数是突变的 毫无用处。语法引导程序修复的思想是提出一些通常有用的语法模式和 把它们用于你的搜索空间。这意味着您的搜索空间更小(受语法模式的限制),并且 你关注的是那些可能修复你面前的bug的候选补丁。在

止血带到底是什么?在

止血带是一个库和特定领域的语言语法指导程序修复。当前工具有 它们内部的硬编码修复模式,使得人类很难交互和调整它们。止血带的目的是 让它快速和容易地创建修复模板,可以立即用来尝试和修复错误。我们计划使用 止血带和程序分析工具一起,允许人类创建具有语义意义的修复模式。在

领域特定语言

与编写单独的树转换过程或其他类型的源代码操作不同,止血带使 描述一个修复的部分语法和部分语义,让计算机来完成其余的工作。这里有一个简单的 示例模板:

classYourSemanticAnalysis(Expression):defconcretize(self,_db,_location):yield"SOME_ERROR_CONSTANT"defyour_matcher_func(line,col):returnTruedemo_template=PatchTemplate(FixPattern(# Location 1IfStmt(LessThanExpr(Variable(),Variable()),# Location 2NodeStmt()# Location 3),ElseStmt(ReturnStmt(YourSemanticAnalysis())# Location 4)),your_matcher_func# Location 5)

Location 1FixPattern的开始。FixPattern描述了 修理。这意味着人类提供了 修理。在

Location 2显示了DSL中的一些不同类型。这条线描述的是 带有两个变量的than语句,所有变量信息都自动从 叮当作响。在

Location 3是匹配器函数匹配的任何源,也是从 叮当作响。在

Location 4是如何将程序分析工具与止血带集成的示例。 FixPattern正在尝试执行一个基本的if...else语句,其中elsecase返回一些 价值观。返回值具有语义属性,返回任意整数通常不是 好主意。这意味着您可以使用一些程序分析技术来 推断一个合适的返回码实际上可能是什么,或者简单地请求一个人来干预。在

Location 5用于匹配器。火柴人是一个 获取源行和列信息并返回True或{},如果FixPatern是 适用于该源位置。这里的想法是我们将特定类型的修复与 特定类型的错误。我们打算用其他一些工具 (例如Manticore)来帮助确定bug类。在

使用止血带

# Create a new Tourniquet instancedemo=Tourniquet("test.db")# Extract info from its AST into the databasedemo.collect_info("demo_prog.c")# Create a new patch templatedemo_template=PatchTemplate(FixPattern(IfStmt(LessThanExpr(Variable(),Variable()),NodeStmt())),lambdax,y:True,)# Add the template to the tourniquet instancedemo.register_template("demo_template",demo_template)# Tell Tourniquet you want to see results from this program, with this template,# matching against some locationlocation=Location("demo_prog.c",SourceCoordinate(44,3))samples=demo.concretize_template("demo_template",location)# Look at all the patch candidates!print(list(samples))# Attempt to automatically repair the program using that template# Specify the file, some testcases, and the location information againdemo.auto_patch("demo_template"[("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",1),("password",0)],location)

自动修补程序将返回TrueFalse,这取决于您是否成功地找到一个修补程序来修复所有测试用例。最终 我们将支持有一个测试用例目录等,这仍然是早期的开发。在

查看止血带的API documentation了解更多细节。在

发展

安装venv以能够运行make命令

$ docker build -t trailofbits/tourniquet .
$ docker run -it trailofbits/tourniquet
root@b9f3a28655b6:/tourniquet# apt-get install -y python3-venv
root@b9f3a28655b6:/tourniquet# python3 -m venv env
root@b9f3a28655b6:/tourniquet# make test

贡献者

致谢

所描述的项目或工作由空军研究实验室(AFRL)赞助,并且 DARPA根据合同FA8750-19-C-0004。任何意见、发现和结论或建议 本材料所表达的是作者的观点,并不一定反映作者的观点 空军研究实验室(AFRL)和DARPA。在

发行声明:批准公开发行,发行不限

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

推荐PyPI第三方库


热门话题
java如何逐帧读取视频?   在java中使用制表符格式化字符串和字符串数组   从socket引发的java NullPointerException。getInputStream()   java中的Spring错误。lang.IllegalAccessError:试图访问类   java在soapweb服务中编写restapi   java如何中断这个线程?   java如何使reactiveCrudepository@Tailable中的方法   日期Java日历。设置没有给出正确的结果   java switch语句不起作用   java为什么ByteBuffer的绝对读取不被认为是线程安全的?   mongodb如何在java中将数据从Mongo DB导出为excel格式   用于构建OpenJDK的jvm说明   获取目录大小的java方法返回不同的结果   在Java中不使用内置函数计算e^x   java编写和读取名称中包含日期的文件   C#中的二维阵列性能。NET与Java   java组织。springframework。豆。工厂UnsatifiedPendencyException:创建名为“ServicePersonalUrgenceAsImplementAcion”的bean时出错   java确认电子邮件创建模板并将其与对象组合   java修改的空心星形模式输出网格模式