hkhlaaf/T2型
文件夹和文件
存储库文件导航
====================================== =====T2临时逻辑验证器====== ====================================== 在这个目录中,您可以找到T2时序逻辑证明程序的源代码。 T2旨在证明程序的时间属性,如安全性、, 终止,或逻辑CTL中指定的属性。 在本文档中,我们首先讨论如何使用该工具并解释如何构建 然后,我们对实现进行了大致概述,最后列出了 工具的开发人员并指出一些相关的研究论文。 ----------- T2号楼 ----------- 窗户 ~~~~~~~ 要构建T2,我们建议使用Visual Studio(2013或更高版本),但您可以 也请遵循下面提供的Mono说明。 在Visual Studio中,使用了 NuGet包是通过Visual Studio管理的,不需要 手动下载(即跳过步骤(4))。 要使用附带的libz3.dll,您需要安装Visual Studio 2015 C++运行时来自 https://www.microsoft.com/en-us/download/details.aspx?id=48145 使用Mono(适用于Linux和MacOS) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 要构建T2,您首先需要构建。 z3/spacer的NET绑定 使用单声道。 为此,您需要从“spacer-t2”分支获取z3源 属于 https://bitbucket.org/spacer/code网站 (参见步骤(1))。 安装一些需要的。 NET库,您需要NuGet,您可以 从…获得 http://nuget.org/nuget.exe . 让$NUGET作为NUGET.exe下载的路径,$Z3DIR为中的目录 要存储Z3源代码的目录,以及$T2DIR 你想存储T2信号源。 您可以设置这些环境变量 通过在shell中“export NUGET=/path/to/NUGET.exe”。 然后按照这些 步骤: (0)安装生成过程所需的软件,获取T2源: *克++ *蟒蛇 *单声道。 网络4.0 *X构建 *fsharp(fsharp) 在Debian(>>squezy)或Ubuntu(>=14.04 LTS)系统上,这就足够了: $sudo apt-get安装build-essential python mono-complete mono-xbuild fsharp 在OS X上,从安装Mono MDK for Mac OS http://www.mono-project.com/download/ 并安装XCode开发工具(例如,通过在中执行“gcc” 终端——如果还没有,OSX将提供安装XCode)。 要下载T2源代码: $mkdir-p“$T2DIR” $git克隆 https://github.com/mmjb/T2.git网址 $export T2DIR=“$T2DIR/T2” (1) 构建z3。 在Linux上,以下配方检索z3源并构建z3: $mkdir-p“$Z3DIR” $pushd“$Z3DIR” $git克隆 https://bitbucket.org/spacer/code网站 $cd代码 $git结账空格-t2 $ ./ 配置 $cd版本 $制造 $popd美元 在OS X上,您需要强制执行32位构建(为了与Mono兼容): $mkdir-p“$Z3DIR” $pushd“$Z3DIR” $git克隆 https://bitbucket.org/spacer/code网站 $cd代码 $git检查垫片-t2 $ ./ 配置 $cd版本 $perl-i-pe的/-D_AMD64_/-arch i386/; s/LINK_EXTRA_FLAGS=/$&-arch i386/'配置.mk $制造 $popd美元 (2) 构建。 z3的NET绑定: $pushd“$Z3DIR/code/src/api/dotnet/” $xbuild微软。 Z3.c项目 $popd美元 (3) 更新z3及其。 T2源树中的NET绑定: $cp“$Z3DIR/src/api/dotnet/obj/Debug/Microsoft.Z3.*”“$T2DIR/scr/” $cp“$Z3DIR/build/libz3.*”“$T2DIR/src/” (4) 通过NuGet获取所需的软件包(可能需要先导入证书): $mozroots--导入--同步 $pushd“$T2DIR/src” $mono$NUGET恢复 $chmod+x包/FsLexYacc.*/build/*exe $popd美元 (5) 构建T2,在调试模式下: $pushd“$T2DIR/src”&&xbuild&&popd 在版本配置中: $pushd“$T2DIR/src”&&xbuild/property:Configuration=Release&&popd (6) 按如下方式运行T2(对于发布版本,将“Debug”替换为“Release”) $mono“$T2DIR/src/bin/Debug/T2.exe” 例如,要执行测试套件: $pushd“$T2DIR/test”&&mono“$T2DIR/src/bin/Debug/T2.exe”-测试 ---------- 运行T2 ---------- T2从命令行运行,以下命令行参数是 用于定义证明目标: -input_t2<字符串>: T2语法中输入文件的路径。 例如,请参阅test/*.t2。 -终止: 尝试证明(不)终止。 -安全<int>: 尝试证明位置<int>的不可达性。 -ctl<ctl_Formula>: 尝试证明<CTL_Formula>适用于该程序。 公式格式如下: -路径和时间量词用方括号括起来, 例如[AG]、[EF]和[AW]。 -量词后面的子公式必须包含在 括号,例如[AG](x>0)和[EF]([AG],y<x))。 有关更多CTL公式示例,请参阅programTests.fs或解析器 absparse.fsy中的定义。 -ctlstar<ctlstar_Formula>: 尝试证明<CTLStar_Formula>适用于该程序。 公式格式如下: -E F(G((tt>0)||(A F(尾波==0))) -一次可以配对一个路径和一个时间量词, 用空格隔开,后跟段落,例如。 E F(x==0)、E F(G(tt>0))和A F(G(E F(x==0))。 -量词后面的子公式必须包含在 括号,如上所示。 有关更多CTL公式示例,请参阅programTests.fs或解析器 absparse.fsy中的定义。 -公平性<fairness_Condition>: 尝试在<Fairness_Condition>下证明终止/a CTL公式。 <Fairness_Condition>的格式为“(<P>,<Q>)”,其中 如果计算中有无限多个状态,那么计算是不公平的 满足<P>,而<Q>只满足有限次。 例如“(P==1,Q==1)”,更多示例可以是 在programTests.fs中找到。 修改T2输出行为的常用选项: -超时<int>: 设置超时(秒)。 -打印(_P): 打印结果说明(仅用于终止)。 -日志: 启用详细日志记录。 这将打印大量输出,并且可能 非开发人员很难理解。 Windows上T2的典型调用和输出如下所示: $src/bin/Debug/T2.exe-input_T2 test/testsuite/small02.T2-安全10000-超时42 安全证明成功 $src/bin/Debug/T2.exe-input_T2 test/testsuite/small01.T2-终止-print_proof 终止证明成功 使用了以下特定于切点的词典排序函数: *对于切入点7,使用以下秩函数/界限(按优先级降序): -RF x,绑定2 $src/bin/Debug/T2.exe-input_T2测试/testsuite/heidy1.T2-CTL“[AG](x_1>=y_1)” 临时证明成功 $src/bin/Debug/T2.exe-input_T2 test/bakery.T2-CTL“[AG](NONCRITICAL<=0||([AF](CRITICAL>0))”-公平“(P==1,Q==1)” 临时证明成功 请注意,T2在证明失败且启用日志记录时创建“缺陷”文件。 可以使用sdvdefect.exe(SDV附带)查看defect.tt文件 分发)。 ------------- 开发T2 ------------- 在下面,我们稍微讨论了实现的几个部分 更详细地解释高级算法(来自我们的论文)是如何实现的 在T2中实现。 基础知识、胶水和测试: ~~~~~~~~~~~~~~~~~~~~~~~ 实施: *主.fs: T2程序校准器的顶级文件。 *programTests.fs,测试/*: T2测试套件和oru示例集合的实现。 *参数.fs: 工具的命令行参数,以及存储参数的位置。 *对数英尺: 用于控制日志记录的中央机制。 *utils.fs、gensym.fs: Helper函数和现有F#数据结构的本地扩展。 *absflex.fsl、absparse.fsy、parseError.fs: 用于解析T2文件的F#Lexer/Yacc文件。 *z.fs: F#函数连接到Z3决策过程。 程序的表示 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 我们使用非常简单的程序表示,使用控制流图 用线性算术表示的“假设”和“分配”命令注释 超过整数。 不支持递归、过程、并发、堆、非线性。 为了处理更复杂的程序,我们使用SLAyer[8]或Thor等工具 [17] ,可用于生成有用程序的算术抽象 证明终止。 在文献中我们知道如何处理 递归/过程(例如[10])、并发(例如[10)和非线性 算术(例如[16]),但这些功能在T2中没有实现。 实施: *程序.fs: 算术、非递归程序的简单表示。 *反例.fs: 处理反例的例程,反例是程序的序列 命令。 *分析.fs: 各种标准编译器级程序分析工具(例如live variable 分析)。 *变量fs: 程序变量的表示。 *输入.fs: 用于将程序表示加载到工具中的接口。 *输出.fs: 以其他格式输出(中间)程序的方法集合。 *术语.fs: 表示术语的数据类型。 *公式.fs、关系.fs和稀疏线.fs: 表示线性公式和关系的数据类型。 许多计算是 在基于变量映射的项的稀疏表示上实现 对应系数。 通常,这与线性 不等式,其中术语的含义是小于或等于0。 例如,“2*x<=4*y”表示为一个映射m,其中m.[x]=2, 米[y]=-4。 *支配者.fs,scc.fs: 使用[33]中的技术计算支配者,强连接 组件计算。 终止证明算法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在这里,该工具实现了基于TERMINATOR的终止证明方法 (例如[6,22,23])进行了一些修改,如[1]和[3]所述。 对于那些 不太精通正式方法文学最好的开始可能是 通过阅读[6]。 该技术的思想是减少对 逐步演变的安全问题的终止论据。 这个 根据反例对当前终止参数进行细化 来自安全标准器,这导致了套索反例的形式。 T2实现了[1,3]中的优化/扩展/修改 修改原始技术以搜索词典终止 从依赖-对-对方法到 终止证明。 实施: *终止.fs: 包含函数“provider”中的主终止证明循环, 如原始基于细化的终止文件[6,22,23]所述。 它还集成了词典终止证明的优化 在此设置中,如[1,3]所述。 *套索.fs: 实现分析反例套索所需的子流程 细化终止参数,如[1,3,22,23]所述。 *仪器.fs: 提供基于细化所需的程序修改程序 终止分析。 初始转换由“instrument_F”(F~ finally)执行, 和后续修改步骤(用于更改的终止参数) 位于instrument_*_RF和switch_to_*函数中。 *等级功能.fs: 实现实际的秩函数合成算法(基于Farkas的 引理),见[24,25,26,27]。 *recurrentsets.fs: 基于[36]的基本非终结证明技术,适用于 套索设置。 时态逻辑(CTL)证明算法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ T2的这个版本包含了描述的分支时间逻辑验证器 [34]中。 对于那些不熟悉时序逻辑验证的人 无限状态系统,请参阅[7],其中一种技术可以减少 描述了一个程序分析问题的时态属性验证。 在这个无限状态程序的CTL模型检查器中,我们采用了众所周知的 自下而上的有限状态CTL模型检查策略[35]到无限状态 使用前置条件合成的程序。 我们利用技术来证明 综合先决条件的程序的安全性、终止性和非终止性 断言输入属性的CTL子公式的满足性,然后 使用剩余证明中的前提条件。 因此,我们的实现不会 需要明确考虑嵌套时间量词的情况。 实施: *终止.fs: 函数“bottomUp”中的主循环驱动证明过程。 它首先初始化前置条件映射,然后调用自身 递归用于每个CTL子公式。 然后使用程序“校准仪” 将反例返回到用于合成的子公式 前提条件。 然后每个程序位置的几个前提条件可以是 同时计算。 此过程还传播找到的前提条件 在整个图中,没有显式地重新计算它们,如中所述 [34]. *仪器.fs: 将模型检查简化为安全检查 程序“instrument_(X|F|G|…)”基础良好,由 程序“合并程序和属性”。 安全/可达性校准仪 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 在这里,我们使用麦克米兰的“带插值的惰性抽象”技术来 证明安全性(也称可达性)。 在我们证明的主要应用中 终止安全问题是终止有效性的编码 论点。 我们的版本是增量的,随着防终止搜索的建立 可达性问题,然后根据发现的反例,对 可达性问题并重新检查它。 实施: *可达性.fs: 基于国际刑警组织的安全/可达性验证程序遵循[28]的策略。 *priostack.fs: 安全校验器中使用的优先级堆栈实现。 *interpolantSequence.fs: 基于Farkas引理的插值合成 [29]中的技术。 *symex.fs: 惰性抽象过程中使用的符号执行 抽象解释 ~~~~~~~~~~~~~~~~~~~~~~~ 我们使用了几种抽象解释技术[31]。 特别是 重要的是在 套索分析。 实施: *IIntAbsDom.fs: 抽象域的接口(即[31])。 *间隔IntDomain.fs: 间隔域。 见[32]。 *八角2.fs: 八角形域。 见[30]。 ------ 人 ------ 以下人员对此版本的T2做出了贡献: *Josh Berdine(MSR研究员) *玛丽·博克(伦敦玛丽女王大学为期12周的本科生实习生) *Marc Brockschmidt(MSR研究员) *陈洪毅(路易斯安那州立大学12周博士实习生) *Nathan Chong(帝国理工学院为期12周的博士实习生) *拜伦·库克(伦敦大学学院MSR研究员) *Ruslan Ledesma Garza(慕尼黑技术大学12周博士实习生) *Mihaela Gheorghiu(多伦多大学12周博士实习生) *Samin Ishtiaq(MSR研究员) *Heidy Khlaaf(伦敦大学学院博士承包商) *Zachary Kincaid(多伦多大学12周博士实习生) *马特·刘易斯(牛津大学12周博士实习生) *Abigail See(剑桥大学为期12周的本科生实习生) *Vlad Shcherbina(莫斯科国立大学12周博士实习生) *Christoph Wintersteiger(MSR研究员) ---------- 工具书类 ---------- [1] 通过合作实现更好的终止证明 Marc Brockschmidt、Byron Cook、Carsten Fuhs 2013年CAV [2] 程序中不确定性的推理 拜伦·库克和埃里克·科斯金 2013年PLDI [3] 拉姆齐vs.词典终止证明 拜伦·库克(Byron Cook)、阿比盖尔·西(Abigail See)和弗洛里安·祖勒(Florian Zuleger) 2013年TACAS [4] 作为程序分析任务的时间属性验证(扩展版本 拜伦·库克(Byron Cook)、埃里克·科斯基宁(Eric Koskinen)、莫西·瓦迪(Moshe Vardi) 系统设计中的形式方法(CAV特刊),2012年 [5] 非线性命令序列终止性的证明 Domagoj Babic、Byron Cook、Alan J.Hu、Zvonimir Rakamaric 计算的形式方面(SEFM特刊),2012年 [6] 证明程序终止(评论文章) 拜伦·库克、安德烈亚斯·波德尔斯基、安德烈·里巴尔琴科 ACM通信,第54卷第5期,2011年5月 [7] 作为程序分析任务的时间属性验证 拜伦·库克、埃里克·科斯基宁、莫西·瓦尔迪 2011年CAV [8] SLAyer:系统级代码的内存安全 Josh Berdine、Byron Cook、Samin Ishtiaq 2011年CAV [9] 使用决策谓词进行预测 拜伦·库克和埃里克·科斯金 2011年POPL [10] 终止汇总:不退回! 拜伦·库克、安德烈亚斯·波德尔斯基、安德烈·里巴尔琴科 FMSD(2009)35:369-387 [11] 证明非阻塞算法不会阻塞 Alexey Gotsman、Byron Cook、Matthew Parkinson和Viktor Vafeiadis 2009年POPL [12] 项目终止原则 拜伦·库克 2008年马克托伯多夫暑期学校笔记 [13] 证明有条件终止 拜伦·库克等人 CAV 2008 [14] 对摘要进行排名 Aziem Chawdhary等人 2008年员工持股计划 [15] 证明螺纹终止 拜伦·库克、安德烈亚斯·波德尔斯基和安德烈·里巴尔琴科 PLDI 2007年 [16] 通过分歧证明终止 Domagoj Babic、Byron Cook、Alan Hu、Zvonimir Rakamaric 2007年SEFM [17] 形状分析的算术强化 斯蒂芬·马吉尔、乔什·伯丁、埃德蒙·克拉克和拜伦·库克。 SAS 2007 [18] 证明程序最终会有好处 拜伦·库克等人 2007年POPL [19] 不变性分析的方差分析 Josh Berdine等人 2007年POPL [20] 具有变形堆的程序的自动终止证明 乔什·伯丁、拜伦·库克、迪诺·迪斯特法诺和彼得·奥赫恩 2006年 [21]终结者:超越安全(简短的工具描述文件) 拜伦·库克、安德烈亚斯·波德尔斯基和安德烈·里巴尔琴科 CAV 2006 [22]系统代码的终止证明 拜伦·库克、安德烈亚斯·波德尔斯基和安德烈·里巴尔琴科 PLDI 2006年 [23]终端抽象细化 拜伦·库克、安德烈亚斯·波德尔斯基、安德烈·里巴尔琴科 萨斯2005 [24]线性秩函数合成的一种完备方法 安德烈亚斯·波德尔斯基(Andreas Podelski)、安德烈·里巴尔琴科(Andrey Rybalchenko) VMCAI 2004年 [25]多维排名、程序终止和复杂性界限 流程图程序。 Christophe Alias、Alain Darte、Paul Feautrier和Laure Gonnord。 SAS 2010 [26]亚伦·布拉德利,佐哈尔·曼纳,亨尼·西普马 多等级原则。 ICALP 2005年 [27]亚伦·布拉德利、佐哈尔·曼纳、亨尼·西普马 具有可达性的线性排序 CAV 2005 [28]带插值的惰性抽象 肯·麦克米兰 CAV 2006 [29]插值的约束求解 Andrey Rybalchenko,Viorica Sofronie-Stokkermans公司 VMCAI 2007年 [30]八角形抽象域 安托万矿山 高阶和符号计算19(1):31-100(2006) [31]抽象解释:用于静态分析的统一晶格模型 不动点的构造或近似程序 Patrick Cousot、Radhia Cousot POPL 1977年 [32]程序动态属性的静态确定 Patrick Cousot、Radhia Cousot 国际研讨会。 编程,1976年 [33]在流程图中查找支配者的快速算法 托马斯·伦戈尔和罗伯特·恩德雷·塔尔扬 托普拉斯1(1):121–1411979 [34]针对无限状态程序的更快时间推理 拜伦·库克(Byron Cook)、海蒂·赫拉夫(Heidy Khlaaf)和尼尔·皮特曼(Nir Piterman)。 FMCAD 2014。 出现。 [35]使用分支时间-时间逻辑设计和合成同步骨架 E.克拉克和E.爱默生 课程逻辑研讨会,1981年。 [36]自动检测Java字节码的非终止和NullPointerException M.Brockschmidt和T.Stroeder以及C.Otto和J.Giesl FoVeOOS 2011