语法引导修复/转换包
tourniquet的Python项目详细描述
止血带
一个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 1是FixPattern
的开始。FixPattern
描述了
修理。这意味着人类提供了
修理。在
Location 2显示了DSL中的一些不同类型。这条线描述的是 带有两个变量的than语句,所有变量信息都自动从 叮当作响。在
Location 3是匹配器函数匹配的任何源,也是从 叮当作响。在
Location 4是如何将程序分析工具与止血带集成的示例。
FixPattern
正在尝试执行一个基本的if...else
语句,其中else
case返回一些
价值观。返回值具有语义属性,返回任意整数通常不是
好主意。这意味着您可以使用一些程序分析技术来
推断一个合适的返回码实际上可能是什么,或者简单地请求一个人来干预。在
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)
自动修补程序将返回True
或False
,这取决于您是否成功地找到一个修补程序来修复所有测试用例。最终
我们将支持有一个测试用例目录等,这仍然是早期的开发。在
查看止血带的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
贡献者
- 卡森哈蒙(carson.harmon@trailofbits.com)
- 埃文·苏丹尼克(evan.sultanik@trailofbits.com)
- 威廉·伍德拉夫(william@trailofbits.com)
致谢
所描述的项目或工作由空军研究实验室(AFRL)赞助,并且 DARPA根据合同FA8750-19-C-0004。任何意见、发现和结论或建议 本材料所表达的是作者的观点,并不一定反映作者的观点 空军研究实验室(AFRL)和DARPA。在
发行声明:批准公开发行,发行不限
- 项目
标签: