CN105103135A - 保护程序的方法 - Google Patents

保护程序的方法 Download PDF

Info

Publication number
CN105103135A
CN105103135A CN201480010722.3A CN201480010722A CN105103135A CN 105103135 A CN105103135 A CN 105103135A CN 201480010722 A CN201480010722 A CN 201480010722A CN 105103135 A CN105103135 A CN 105103135A
Authority
CN
China
Prior art keywords
program
point
branch
definition
situation
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201480010722.3A
Other languages
English (en)
Other versions
CN105103135B (zh
Inventor
多米尼克·波利尼亚诺
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Individual
Original Assignee
Individual
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Individual filed Critical Individual
Publication of CN105103135A publication Critical patent/CN105103135A/zh
Application granted granted Critical
Publication of CN105103135B publication Critical patent/CN105103135B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3664Environments for testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/3017Runtime instruction translation, e.g. macros
    • G06F9/30178Runtime instruction translation, e.g. macros of compressed or encrypted instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3808Instruction prefetching for instruction reuse, e.g. trace cache, branch target cache

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Storage Device Security (AREA)

Abstract

一种保护一第一程序的方法,该第一程序包括有限数量的程序点和与程序点相关的定义程序点段落的演化规则,包含·一多退出情况的定义,以及当一第二程序被使用在第一程序的定义中,对于第二程序的每个退出情况,通过第一程序一个特定的程序点对一个分支的定义,或者一个不可能分支声明;以及·一个关于一组待证明属性的定义,每一个都与一个或多个第一程序的基本构成元素关联,所述一属性组包含作为特定属性的不可能分支;·该属性组的形式证明的建立。

Description

保护程序的方法
本发明涉及一种保护程序的方法及实施了该方法的计算机软件产品。
保护程序在本文件中应理解为,为了保证与规格,或者运行限制,或者其他被证明是正确的(本地)属性(如下文定义)一致而编写的程序。
因此,例如,在***自动控制设备中,比如一枚火箭,一辆火车......为了避免危及其***或环境,确保程序完全在其运行范围内执行是必要的。
这在复杂的***中特别重要因为,由于其复杂性,很难通过专家分析。这种困难可能由ArianV火箭首次飞行期间发生的意外所说明,经过鉴定,发现是由于推力发动机控制电脑的问题.事实上,后者是为上一代威力较小,加速度强度也较小的ArianeIV火箭开发的。此计算机转移到ArianeV火箭上没有考虑这个新的参数,导致电脑接收加速信息,加速信息触发了意料之外的寄存器溢出及引擎控制***的故障。
因此,对于执行域以及对于在该域执行被完美定义,归档及认证对于严苛的***对于显得非常重要。
目前采用的技术主要是基于一阶逻辑或高阶逻辑的数学规则,例如,质量成本(Coq)。他们存在于使用软件工具以使用特定的编程语言试图在数学意义上证明。这些软件程序在文献中被称为"检验器"。
这些检验器的运行根本上主要在于将学习程序转录为待证逻辑判断(如“证明责任”)。另一种可能性是为了描述程序,使用逻辑语言本身,如Coq,表示属性和证明,从而避免了转化为逻辑断言的需要。
然而,在算法意义上检索逻辑证据的复杂性的提高速度大于研究程序的复杂性。在计算机辅助证明时,为了引导检验器,用户发现很难使用直觉良好的运行程序。这些技术因此,在等严苛和复杂的程序上运行时,例如控制计划和/或复杂的***,涉及安全的工作,变得非常困难并且造成时间和资源的大量消耗。因此,当该需求变得越来越重要,并且研究团队已经在这个课题上工作了至少30年,这些证明技术仍然维持在实验室或者被用于对运行安全具有极端苛刻要求的领域,如航天、铁路。因此,在本案例中,一个软件工程使得将这些程序切分成可以由检验器管理的组件。
其因此有利于获得一种可以在复杂程序上采纳使用的保护程序的方法。从现在开始,"证明"一词(或"形式证明")将作为"形式验证"的同义词使用,如,基于常规方法的验证,以及单词“逻辑验证”在经典逻辑***中(predicate逻辑、高阶逻辑)的特殊情况。
为了解决一个或多个上述的缺点,一种保护第一程序的方法,该第一程序包含一定数量的程序点,以及与程序点相关的演化规则,并且一程序点到另一程序点定义段落,包括:
·一多退出退出情况的定义,以及,当第二程序在第一程序的定义上被使用/请求,就每一个第二程序的退出,朝向第一程序特定程序点的一分支的定义,或者一个分支不可能性的声明;以及
·一一组待证属性的定义,每个关联到一个或多个第一程序的基本元素,所述属性组包含一个作为特定属性的不可能分支;
·该属性组的形式证明的建立。
因此,通过使用本质上包含在程序中的路径逻辑,使降低检验器将要执行的片段的尺寸及复杂程度成为可能。
这些特征或特定的实施例可以单独或组合使用,如下:
·演化规则、退出点和定义执行轨迹或逻辑轨迹的树形结构的分支(即定义树状结构的执行跟踪或逻辑轨迹(如每个逻辑轨道代表一通常有限的执行轨迹组与案例与分支的同样选择相对应),一检验器使用已创建的树形结构在第一程序的点传播限制,并且使用程序中明示或暗示同余的传递闭包(如可传递同余闭包)用以证明至少一个的第一个程序的属性(即为了保护第一程序);
·第一程序包含一个循环,一检验器,自动在一个程序点引导其通过使用与潜在近似版本的执行路线生成一个常量,其中代表循环执行的部分已经被类似的步骤代替;
·一个分支,声明为“不可能”通过分析通往转移的树形结构路线图得以证明
·对第一程序的保护是基于对第三程序展示与第一程序的功能区别,和(或)不只是单纯的第一程序的摘要;
·建立在至少一个第一程序的本地属性(如与程序组件相关联的属性,包括潜在的程序本身)以及至少一个第三程序的本地属性之间的定向对应,即充分关系,这样证明一第一程序的一本地属性,只要该对应关系存在,与第一程序属性对应的第三程序的属性组的证明就是充分的。
·第三程序被修改转化,使它能够获得第一程序,这样第一程序的保护是基于第三程序的保护的;
·第一程序被修改转化,使它能够获得第三程序,这样第一程序的保护是基于第三程序的保护的;
·第一程序被修改转化,使它能够获得第三程序,并且定向于第一和第三程序至少一个相关属性之间建立多个充分关系;
·第一程序被修改转化,使它能够获得第三程序,并且在第一和第三程序至少一个相关属性之间建立多个充分关系;
·至少一个第三程序的变量通过取自于第一程序变量的(逻辑)值被实例化,用以在第一程序和第三程序之间创建至少一个充分关系;或作为一种保护第一程序的方法和(或)
·至少一个属性是由第四程序定义的。
根据本发明的第二方面,一种计算机软件产品,包括当所述计算机软件产品在计算机上运行时实现上述方法的软件说明。
在特定实施例中,可单独使用或组合使用;
·退出退出情况其包括一用户界面,采用了允许用户定义退出退出情况和关联分支以及待证属性的;
·该用户界面被调整为可以定义一不可能分支;和(或)
·用户界面被调整为可以定义一特定分支的入口条件以及限制退出退出情况。
·该工具以利用一些不可能转换或本地已被证明的属性的事实的一方法生成执行代码,以最优化生成的代码。
本发明将在阅读以下通过举例和引用配套图的说明后被更好的理解,其中:
-图1是一计算机***实施本发明一个实施示例图,和
-图2是一个运行本发明一个实施例的流程图。
事先说明,值得注意的是,下文中,为了澄清的词汇、术语"程序"或"程序保障"或者"待证的程序"将专门用于指代被保护计算机软件。其他参与或执行保护方法步骤的计算机软件将被称为"软件"或者"计算机软件"或者"软件工具"。
参照图1,一计算机***1包括用以计算和存储的方法3,以及人机接口设备5,通常的屏幕类型、键盘和鼠标。它还包括以硬盘形式、固态硬盘或其他经典数据储存形式的存储方法7。
人机界面被调整为允许一用户给予运行在计算机***1的计算机软件指令,并查看该软件所提供的分析结果。
人机接口5的形式为一带有相关的工具的程序开发环境。因此,它包含文本编辑类型、解析器、编译器等软件。写在Java中的Eclipse环境就是这样一种环境的例子。
在保护方法的第一步骤中,步骤11,一程序在人机界面被介绍给用户。此程序被以经典的以包含指令的文字文件方式介绍,或者执行一种高级语言排序控制的形式。虽然其在此后会被表现,某些语言相比其他语言更适合执行该保护方法,程序可以是已经通过通常编程语言如C,C++,ADA,Java,Php,Erlang,Python,assembler等编写的。
值得注意的是该方法也可以适用更多的状态机器类型的图形语言。
该程序通常由一组运行命令组成,每个命令都代表性的与一个程序点关联。这些命令通过结构指令进行组合,例如选择("if...then...else"),循环("while...do")等。结构也可以以图形方式表示。分支以及与程序点相关的注释通常可以被考虑作为给定程序点的演化规则。
值得注意的,对程序的这一定义使其具有递归的可能:需要保护的第一程序在第二程序等中被使用/引用。
对于一个程序/子程序或运行的命令,运行范围及执行限制以及步骤13中定义的关联的分支。
一运行时约束包括在定义一个域中的程序,命令具有均匀的行为。例如,在一个运行的命令或程序在除法组成的简单的例子中,两个域被自然的定义:正常执行,除数等于零。每个域是与特定的程序关联,并定义该分支后的分支。例如,正常执行会导致以下命令中的程序的执行,其中该命令是根据该程序的“正常”的结构中使用,而在所述除数等于零的情况下会导致另一种类型的分支,例如错误,特殊处理的分支.每个运行时约束和其相关的分支,因此定义一个路径规则。这通常导致定义的程序有多个退出退出情况。这样定义的程序,如果在第二程序中使用会因此有关联到在第二程序分支的退出退出情况。
这些路径规则的定义可能以不同的方式进行。
第一种方式存在于程序的人机界面和/或编程语言提供工具;允许用户“手动”定义这些路径规则。
第二种方式包括存在于使用库和序列识别软件,它将自动定义这些路径规则。例如,此识别软件可搜索如上述定义的包含在程序内部的除法并且应用该路径规则于其中。
第三种方式,那这将最进一步说明,存在于每个程序或每个有限数量退出退出情况的命令的定义,例如只在使用的时候选择相关的案例(而其他的在这里被称为不可能案例或分支,并且分支与相关案例对应.
在第步骤15中,案例的序列的逻辑树状结构被用以简化或证明目的。树形结构是根据顺序以及相关的分支处理执行(案例为了一个命令或程序被提取),树形结构表示一组执行轨迹或路线或之后的一套逻辑轨迹,每条逻辑轨迹代表一个通常有限的对应相同选择的案例(和分支)的执行轨迹组。任何其他证明的方式也可用于证明本地属性或不可能分支。
为了重申除法的例子,关联的树形结构包含代表两条执行轨迹的弧线:正常的执行和错误执行。
值得注意的是,树状结构是考虑到程序结构逻辑而创建的。其优势在于,就纯粹扁平化的逻辑的实质上极大地限制了树的结构复杂性。如果在例子中,在进行除法之前,程序进行一次除数是否为零的测试,对应除数为零的错误处理程序弧线将不被生成,或者被删除,因为其“不可能”发生。
当该程序包括一个循环,则可能是一个无限的树结构或树结构是通过识别不循环的路径和重复可能由循环改变的复制变量的定义执行轨迹的上定义一不变量来创造的。这使得有可能此第二种情况下创建一树结构,由图标而非循环所定义。
因此,有利的是,该人机界面使其能够定义,或识别软件定义,两个序列之间一个不可能的过渡。实际上,这使得有可能定义一个局部特征,这就是说,程序在这个执行场所的过渡是不可能的,而且此外允许减少树结构考虑到没有必要开发“不可能”的弧。同样地,人们可以表达和证明一个过渡是不可能的,可以声明或证明更一般地一个子图是不可能的(这就是说,它不能使用),以及一个也可以注释局部特性的更典型的程序(例如弗洛伊德),其必须得到证明。
在除法的例子中,有趣的是,用户界面使得能够定义,或该识别软件定义特定节目片段的进入条件,以限制上述片段的执行域。
在步骤17中,如果还有一些有待证明的特征,特别是声明不可能和不能的分支验证,则该方法返回到步骤11,或者完成哪些没有定义的执行路径,或修改程序的逻辑从而使禁止模式不能出现。
为了进行这项树结构的分析,试验应使用创建的树结构在程序点传送限制条件,并使用传递闭包和一致性的特性或删除无用分支功能并带来,或促成,该程序顺利运行的形式证明。
值得注意的是该程序完全安全,有必要证明/表明,对于每个已被声明为“不可能”的图像的转换无论在什么执行条件下都不能在程序执行中采用。在紧要时刻导致“不可能”的转换的路径的分析通常可为证明其的一方法。如果使用其他更经典局部特性,如不变量时,它们也自然应该证明。
值得注意的是,当第一程序已被保护或验证,如果要保护的程序可通过不断的语义转换,比如再现所述第一程序的结构,进行修改,则第一个程序的验证要被传播到要被保护的程序中。这可以特别用于前述识别软件。此外,更常见,两个程序等效为了使用一个用于另一个的验证是不必须的。更宽松的特性可用于该目的。
为了更好地理解这个计算机软件和执行方法的操作,现在将使用实施例。
1.描述性语言介绍
为了便于理解,将推出一个称为SM的算法描述语言。这使得很容易表达由该实施例实现的不同原理成为可能。然而,值得注意的是,任何计算机语言也可作为用于本发明的实施的基础。
尽管它们将以SM的语言举例,下文描述的实施例旨在用于以非常多样的语言或形式编写程序程序,无论是否是例如执行语言、逻辑或规范语言,图形语言。它简单地假设,这种语言可设置有在一定条件下的语义,例如当程序是可执行时的操作语,但这种语言也典型地具有逻辑性状,例如全称或存在量词。碰巧的是SM语言的情况下,然而,它的各方面既不引入也不用于这里。这里,其将被简单地和一般假定形式化的描述(语言或形式)可以转化成一个如后述(第2.1段)的带注释图和潜在的呈现“叉状”和“联接”使得可以描述并行性和/或并发性。为简单起见,与逻辑量词的组合将不会在这里阐述和SM同步和并行基元将不会被引入。
作为一个例子,SM语言的子集在此阐明使用一个FIFO队列的一些基元,被称为“seq”。
让我们首先考虑在以下序列中定义的程序“成员”:
如在相反的情况下果它发现该元素元素和“false”,程序“成员”在序列“e”搜索一个值元素“x”并返回“true”。程序“成员”开始于将“e”的数值放于变量“f”,然后扫描“f”在搜索具有搜寻价值的第一元素中使用一循环。
1.1退出情况
该程序,按照惯例主要情况下,如果该元素被发现,通常通过退出“true”中止元素,并在相反的情况下特定退出“false”。所有的程序都有一个隐含的“ture”退出,并可能此外(它是语言的特殊性)包括不少于所需的特定退出情况。这些退出的情况可采用所希望的名称。所谓的“error”的情况下被限制用于说明如后面所示的一退出或分支的假定的不可能的性。退出情况列表(不同于所隐含的“true”)在程序签名处列出。这里,该列表仅包括一个元素,“假”(“false”)。
程序“成员”因此包括有限数量的程点(这里称作点/标记为1,2和3,此外还没有真正的语法本文件为了给程序点命名/标记所被引入)。
1.2公理化隐式程序
为了解析序列,程序“成员”使用“removeFirst”消除该序列的第一个元素,返回到变量“y”和在变量“f”中的生成序列。“removeFirst”也是一个程序(或predicate),且它已在另一个程序“成员”的定义中被使用。它被定义为:
publicremoveFirst(eltx+,seqe,seqf+)
implicitprogram->[empty]
关键词《隐含》表示程序的定义是隐含的的(以某种方式不言自明的),因此不包含显性体如先前程序《成员》。默认情况下一个程序是明确的,并包含一个主体。
因此这个程序对两种情况之间区分,隐含的“真”(“true”)并且被认为是主要的情况,以及在特定的情况下为“空”。直观地,当序列为空,并且没有元素可以从序列中去除,将“removeFirst”的调用导致该情况并且因此退出“空”。
1.3进入和退出变量
“removeFirst”程序具有置于一个与变量“e”一起/相关联的入口变量,以及两个退出变量“x”和“f”,以下面的“+”确认。由于是标准,除非另有说明(这里未给出)该退出变量只在主要情况“真”(“true”)下分配并且有意义的的。因此,作为在“空”情况的规则既不分配“f”也不分配“x”,并且它们的值不能在剩余部分中使用。稍后“f”的使用将会隐含地使用不会被修改的进入值。使用“y”的意图(例如,在循环退出)将通过支持工具分析为在特定路线中的非法,在第一次进入的循环退出的情况下,“y”的值不会已被绑定。
该程序在默认情况下时是确定的且有顺序的(如果它是不确定性的,或者如果它的执行模型包含了例如回来跟踪或并行执行或不带通信基元,这将是以关键词或额外的注解所制定或者甚至如有必通过用一个特定的执行机编写。
1.4重命名退出情况
在括号间的predicate“removeFirst”之前的部分在程序“成员”(“member”)的使用中为一中predicate“removeFirst”之前括号之前的部分在用途上是一个重命名描述符(在这种情况下[empty:exit]这使得它可以描述情况标签如何重命名且因此最终不同案件情况如何“扩展分支”。。这种重命名描述符可以可能出现在一个程序调用的前面,以及同样实际上在任何包含句法结构的前面,并且特别在程序块的前面。在此实例中,有两中其它情况,一个在主块的前面([真true:false;found:真true])和[真true:found]在等式(X=Y)的前面。
默认“真”(“true”)是下面指令的分支,或者更通常的,以允许由句法环境中所提供的“普通”(“normal”)流的分支:在该“while”循环结束时,该“普通”(“normal”)流是在一个循环的开始返回,在程序结束时,“normal”流是在“normal”的情况下,终止该程序,即,所述的“真”(“true”)情况。在内循环的执行过程中提出了“退出”(“exit”)情况,一循环“while”通过生成而终止。因此,它更名为“真”(“true”)。所以,以某种方式,括号之间的部分(当明确提及)描述了该方法,其中该情况应该被重新命名,以推断出需要执行的分支。在这里,在一“removeFirst”退出于“empty”情况,后者已被重新命名为“exit”,相应的传送,也就是说,“removeFirst”的“空”情况下,在循环之后立即分支程序的流。该循环环是在程序的结尾,该程序在这种情况下通过“真”(“true”)本身改名为“fault”终止。这直观地对应于所寻求的元素还没有被发现的情况。在相反的情况下,一个是在“真”情况中(即该等式位于3等式,响应“真”(“true”),更名为“发现”(“found”),本身改名为“真”(“true”))。
典型的“f:=e”是糖衣语法用于描述“equals(e,f+);”有:
publicequals(seqa,seqb+)
implicitprogram
同样《x=y》是《equals(x,y)》的糖衣语法有:
publicequals(elta,eltb)
implicitprogram->[false]
在第一种情况下,程序《equals》与等于“e”值的“f”值相关(实际上是未定义这里的同余),并在第二种情况下,它会检查是否两个值(从“a”和从“b”的)是相等的。
因此一个程序(或子程序)退出情况下的重命名是提供于SM的主方式,以允许用户根据所采取的情况以描述程序点之间的分支。
1.5逻辑跟踪
一般来说,SM语言使用前序比如变量。如果在程序中采取任何途径(在执行流程中程序采取的路径),通过添加与转换(和状态潜在地)相关联的逻辑注释,将获得所谓的“逻辑执行追踪”。通常在程序的执行过程中每次遇到一“+”,新的变量名称将通过使用一个新的变量名称产生,以免几次遇到的变量之间有任何命名冲突,并在路径期间修改。例如,逻辑跟踪“equals(e,f+);removeFirst(y+,f,f+);equals(x,y);“可被表示为逻辑跟踪。
equals(e0,f1+);
removeFirst(y1+,f1,f2+);
equals(x0,y1);
它具有从不改变价值(“单赋值”变量)的程序变量的优势,并且因此可能会很自然地认为是逻辑变量。方程序有几个退出情况下,每种情况与predicate(或与关系)相关。显然,在这里,它们暗含为应该被用于实施例的“removeFirst”和“equals”程序中的“真”(“true”)情况。一般,程序的每个返回情况对应于predicate(或逻辑表达式或关系),按照惯例由程序名称与退出情况结合在此进行命名,从而,对应于先前逻辑跟踪predicate的序列将是:
[true]equals(e0,f1+);
[true]removeFirst(y1+,f1,f2+);
[true]equals(x0,y1);
这个逻辑跟踪也可以用符号(n)[true]equals(e0,f1+)->(l)[true]removeFirst(y1+,f1,f2+)->(m)[true]equals(x0,y1)->(o)表示,其中“n”,“l”,“m”和“O”,为程序点标签,其最后一个,即“o”,潜在的为一退出标签。为简明起见,逻辑跟踪可以被识别在适当时通过省略一些或全部predicate和参数名称,如(n)[true]->(l)[true]->(m)[true]->(o)。
每当(n)指定的一(或某个)程序进入点,现有追踪描述从程序中入口到程序中的任何点的一路径被称为前缀。在这种情况下当知道是否跟踪是穿过很重要(从起点到退出点,我们使用术语“完整的追踪”)。因此,每个命令/程序可与一组与每种情况相关潜在不同数量predicate相关联,一与每种情况都相关联的predicate,除了“错误”情况下。跟踪一个实施例可为:
[true]equals(e0,f1+);
[empty]removeFirst(f1);
通常情况下,那么《《[empty]removeFirst(-,f1,-);》正是《[真]empty(f1)》,其中“empty”是predicate/程序,有两种情况,《true》和《false》:
publicempty(seqe)
implicitprogram->[false]
当然,每个逻辑轨迹追踪(完整或不完整),并且每个前缀通常将对应于一普遍的无限执行轨迹集合。这些执行轨迹将对应于满足逻辑约束域值的逻辑轨迹的实施例。完整轨迹可以根据如在先前的两个实施例(该程序的完整遍历)或相应模拟从开始(激活)直到程序不必要终止的任意点程序执行的前缀。在SM语言要考虑两者(尤其第二点使得能够描述不终止的程序的语义,例如服务器,并且所述程序执行模型可以包括回溯而但不使用无限轨迹)。然而,这与此处描述的本发明无相关性。同样地,例如无限轨迹可以考虑。
当使用有限逻辑跟踪的情况下,这是很容易为将逻辑表达式联系到该轨迹:该逻辑表达式被作为沿轨迹遇到predicate的结合而获得,该轨迹指明在执行中变量值必须得到约束。例如沿轨迹:
[true]equals(e0,f1+);
[true]removeFirst(y1+,f1,f2+);
[true]equals(x0,y1);
该结合是:《[true]equals(e0,f1)/\[true]removeFirst(y1,f1,f2)/\[true]equals(x0,y1)》。在这里,符号“+”是不必要的,只要该情况的语义不依赖于进入或退出变量的用法:该情况《[true]equals(e0,f1+)》产生一个值“f1”,其满足于定义predicate“[true]equals(e0,f1)》,其中第二个命令是对在入口提供的两个值的一等值测试。这种约定是没有必要的,但允许描述简化并在其它地方被使用。
此外,应注意的是,与每一种情况相关的predicate表现出相连程序点之间的的进化关系。因此,例如从程序“成员”的第2点开始有两个可能的演变通过命令/程序“removeFirst”中的两种情况“true”和“empty”实现。第一种情况以与predicate《[true]removeFirst(y1+,f1,f2+)》的关系(即将相关联的序列“f1”与第一个元素“f1”中的“y1”和组成和在《f1》中跟着《1》的元素《f1》构成的序列“f2”组成的一对相关)为特征以及并引导从点2到点3,第二情况《[empty]removeFirst(_,f1,f2+)》,(也就是说,空序列“f1”到空序列“f2”相连的关系)从第2点到“错误”(“false”)退出(或到朝向在另一个程序使用“成员”情况时退出分支的点)。
还值得一提的是,使用逻辑跟踪的是使用的程序树形结构的一种方式。虽然逻辑轨迹,在此被定位于SM语言的情况下,,通常通过归纳,可以被转置或正式的定义于更普遍的语言。
值得注意的是,逻辑轨迹(或前缀)也是程序的特定情况,没有循环且带有单分支的程序。这被认为贯穿整个文件。当然当考虑到一给定节目的一些逻辑轨迹时,该工具没有必要重定格式并作为标准程序执行它们。
先决条件和不变量
现在让我们考虑程序“remove”,其目的是去除序列“f”中一个且仅有一个的“×”:
这个例子说明第一个前提条件。在此,这个程序没有描述应用性的关系(也就是说,“f”联结到“x”和“e”的功能不是总功能)。为了除去一个且仅有一个的值元素“×”程序“删除”需要应用到一序列,该序列至少有一具有该值的元素。这个例子还说明了一不变量的使用,第一程序不变量(这里没用),然后循环中每个通道的循环不变量必须是真是的。在SM语言中的不变量可能是各种复杂程序。它们可以特别介绍和修改该不变量的特定变量以及使用程序的变量。若评价回到标签“true”,一不变量为“true”。
1.7不可能的转换
最后,引入朝向“错误”(“error”)的特定分支。此标签是用来描述不可能的分支(并因此转换)。例如在“删除”定义中,上述,这种标签是使用在其中已知且该集不能是空的地方,它始终是可能提取第一元素(第一“removeFirst”的“空”情况是不可能的)。当它被用在程序中,如在前面提到的“删除”的例子,它表示表达的需要,且因此证明该转换是不可能的。这里,直观地,分支是不可能的,因为“g”包含至少一“x”值的元素,正如循环不变量表达的,因此,不能为空。进一步可以看出,程序也可以用来公理化被认为是假设为真的性能。当分支“错误”是用作程序中的公理,这意味着该分支被认为是不可能的。
1.8公理,引理,定理
SM表达具备这种约束(不可能的转变,前提条件)从而表达性能。在这方面,它可以根据情况其可被认为是“定理”,在这种情况下,要证明一个程序,“引理”被认为是,即一个中介程序,其将必须被证实,然后可实际用于另一个程序的证明,或者最后作为一个“公理”,也就是说一个程序假设为真,且这将允许例如为了不证自明地定义某些被隐式定义的程序的相应的行为。在下面一节的程序,将进行说明程序作为公理的使用。
在此说明在公理中标签“错误”的使用,在此情况下,允许的3个隐含程序的两个紧随公理时,“removeFirst”,“addLast”和“empty”的第一版本(即签署“empty(eltx+)”:
这里直观地,例如在第一公理中分支是不可能的,因为“e”包含刚刚添加的一个元素。第一公理可以以等同的方式写入:
empty(e+);=>[true:false,empty:true]removeFirst(x+,e,f+);
这使我们能够部分地引入SM语言的结构《=>》。该结构使得有可能限制执行指令的上下文。如果前提正常终止,也就是为“真”(“true”),则结论的第一个指令分出,那么结论是正常“执行”。如果是消极的,结论不执行,这可能其中前提返回《假》(《false》),《错误》(《error》)或任何其它标签的情况下发生。在按照惯例第一种情况下,隐含返回“真”(“true”),在其它两种情况,标签被返回而没重命名。
1.9程序定理
通常,一个可接着要推导从以下两个定理程序推到公理(即两个一下程序)
//Theorems
Theorem1:addLast(x,e,f+);=>member(x,f);
Theorem2:member(x,e);addLast(y,e,f+);=>member(x,f);
2.0部分函数对比总函数
SM的语言使得可以选择使用全部或部分功能的命令或程序。由于一个先决条件的使用,上述的“删除”(“remove”)的第一个定义是一个部分函数。然而,用户很可能已经很好地使用总函数,而在由用户所要求退出情况下不失去分离,如下面的新定义:
这第二个定义在第一个上增加一种情况使其完整。第三个定义添加了一处理,通过改变其语义使得该功能完整。如果它存在,该第三程序删除具有给定值元素的第一个实例,否则它简单地拷贝序列。
类似的例子与经典案例的划分是:
publicdivideBy(x,y,z+)
prenonZero(y)
implicitprogram
publicdivideBy(x,y,z+)->[zero]
implicitprogram
publicdivideBy(x,y,z+)//deterministicorundeterministicvaluetobedefinedfory=0
implicitprogram
1.10中介表示
SM的语言可以是相当容易自然地变换为内部表示,在此称为SMIL,它代表一个有限状态/节点集(SM语言的程序点,某一些确定点可以是该程序的入口或退出)构成的有限图形,以及一组连接一些这些节点的有限导向弧。该SMIL表示法是更直接程序点之间的进化关系的方式。每个节点代表一个程序点和存在与一组有限变量集(即变量名)相关联。每个程序弧表示可标记在(节点标签的)节点变量命题或连接由程序弧链接的两个节点变量命题所标示的情况。例如,在第一个定义的程序中,(“成员”(“member”)),一个节点可以由命令或调用的子程序(它是predicate调用之前的点,然后是这两个退出点,一个对应于退出“真”(“true”),而另一个对应于该退出“假”(“false”))。如果用户现在着眼于例如对应于命令“removeFirst”的调用的节点(即调用前放置的点),它通常是循环的入口点和循环(循环的结尾将在这一点上再循环)。从这个点出发是两条弧。一对应命令的“真”(“true”)情况,并将指向下点(即等值测试调用之前的点)。这条弧以predicate“[true]removeFirst(y+,f,f+)”标记,其中按照惯例“f”代表程序弧线(点/节点)启动状态的变量“f”,“f+”和“y+”按照惯例表示程序弧的目标状态的变量“f”和“y”。其他程序弧是相对应于命令的“空”(“empty”)情况和程序“成员”(“member”)(对应于定义程序的“假”(“false”)情况)的“假”(“false”)退出点。该程序弧由predicate《[empty]removeFirst(-,f,-)》标记,发现其定义等同于“empty(f)”。在本实施例中,只注释弧。简单不变量(即经典,弗洛伊德)将对应于相关联节点的predicate。在SM的语言下,即使允许简单不变量,这里使用程序不变量,用程序(子图),而不是节点的属性来表示。
虽然对于下文提出的本发明这不是严格必需的,以产生或使用这样的中介语言,这是一个非常方便的方式以实现它们。
作为用于关联到在图中的节点的变量,它们通常会自动判别于SM,通过分析基于在参数中提供的变量的程序和由固定点机制(变量“强度”的分析)。该分析可以识别某些不连贯,它必须在程序的定义进行修正,例如,一变量被使用,而它尚未在某些路线初始化,可能会导致一考虑点。
此外,更一般地,其它形式的注解或弧(或甚至节点)可以考虑例如集,关系和这些可以通过内涵或延伸来表示。
2.本发明的实施例SM的语言的特点明显有利于权利要求的执行情况。在这里,我们回到特定的上述权利要求。
2.1并行编程
下面所述的实施例还显示了序列及确定性程序,是更一般地,并且还适用于高度多样化的执行模型,特别是并行,并发程序,非确定性的程序或进行“回溯”的可能性。在中介的语言SMIL一些这些可能性可以很容易地提出通过引入“叉”(“fork”),并在图形“加入”(“join”)的机制。基于一个节点上,总是有几种可能的情况下,但每个可能性而不是作为一个简单的程序弧可以是一个有限集合弧(叉)。同样,不是只具有一个有限弧集能达到一个点,人们可以有一组的可能性,每一个都是简单的程序弧或一组有限的弧组,一“加入”(“join”),从而导致结构化程序弧。图中的一轨道不再是简单的路径(也就是说,它成功地在时间上彼此状态的总序列),但部分序列,也就是说执行的轨迹,而且相应的逻辑轨迹,成为如通常已知偏序。此外,该程序弧注释变得更加复杂。而不适用于一个简单的程序弧它们适用前和对应于一壳体后的节点之间更复杂的配置。然而,如前所述,这些属性可表示相邻节点上(在部分顺序)。图中的每个路径或副路径通常对应,而不是一个节点下列签署节点和弧由predicate注解,但是类似地标记的部分序列共标记的顺序。在这种情况下,它使得在这种情况下有可能,以支持在SM语言水平高度多样化同步机制,已知的唯一的约束是如何将描述变换成一个SMIL曲线图。通常情况下,同步将被转换为一“加入”(“join”)后跟一个“叉”(“folk”)加入然后释放被同步(两个或多个)的程序。为简单起见,SM同步和并行基元没有引入。此外,当在极少数情况下,例如基元将在本文档中使用时,它会在上述SMIL中介表示,其中单独基元“叉”(“folk”)和“加入”(“join”)允许足够的表达。因此,在这个阶段的程序的概念可以推广。一种程序,将因此被定义为一组有限的点通过有限的的传送所连接,设置有一个或多个入口(仅单一的入口的情况被示出)和一个或几个退出。该点可以由逻辑特性表征相关的点状态所注解,传送也可以关联到逻辑特性描述链接对应它连接点状态的关系。当程序描述了一个顺序程序这最后关系描述了如何开始点的状态被链接到对应于终点的状态。当程序描述了一个并行程序同步或不同步的状态是通常元组描述并行执行进程的状态,并且关系描述的局部顺序,其链接的元组从过渡的起始点至过渡期结束点的元组。但该程序点可以替代地认为是局部点,在此情况下一些传送都将被连接(在“叉”(“folk”)或“加入”(“join”)叉形分支或接合支路的情况下被连接)。这里所采取的约定对进化规则本身产生影响,并从该程序导出的树结构,而不是对权利要求书的适用性。
2.2分离/分支
因此,通过提供信息技术方法,使用描述语言的特性(编程或规范语言)和设备(即,“计算机软件”),其支持它,以协助对环境的用户来分割一命令,或一引用的程序(即基于另一个程序所调用的一程序)于一有限数量的情况,每一个对应于一个处理情况。这些不同的情况下均可以导致不同的分支,包括潜在的分支到“错误”(“error”)(这当然不排除所有,或部分的情况下导致,即分支的,朝向同一个点),尤其是在一个方式(a)减少或划定一个命令或子程序的“范围”,在它的一个或几个用法中,或(b)能够识别并利用组合数学或不可能的情况下连续。例如通过图示的
(a)的方法,值得注意的是,在公理(2)的第2行可以认为有限制的指令,它总是删除被使用的第一个元素。这个操作只能适用于含有至少一种元素的序列。这个程序因而推断点3在局部约束此外,通过说明(b)的方式,值得注意的是,如果一个逻辑被认为是从程序的开始通向点3,至该点的转换的组合是与导致带有采取removeFirst的分支“空”(“empty”)的传送不相容。
在实践中,可以例如已经确定预先的可能情况下,期待命令或子程序,使得该工具可在选择或管理的情况下,帮助用户选择保留(不一定是所有的,这也将于其自身创建一个约束)和在使用过程中所选择的情况下,相关联的程序的控制结构的潜在的方式。这是对SM语言自然允许的。通常,所述设备将有可能考虑到情况故障,特别是涉及使用情况。通过示例的用于这些命令之一每次方式“removeFirst”这里的隐式定义,以及每个“分”(“divide”)的提供两种情况,并且,相应的分支应当隐式或显式地决定,或隐式或显式地决定该情况下是不可能的,或者必须在调用(这是限制命令的范围的方式)的情况下不能使用。SM的语言和工具,支持它,验证每个分支要么实现,或隐或显式地重新发送至“错误”(“error”),按照惯例,表达了相应的过渡是不可能的特性。
的描述,因此程序的定义期间提出这些问题的事实顺便便于用作程序/子节目中的其他程序的定义来定义在程序除法成的情况。例如,removeFirst中的“删除”(“remove”)的第二版的第一使用,推断的定义在程序“删除”(“remove”)的情况下,“notin”。
2.3分支/不可能转换
通常情况下,人们可能会想表达证明/验证某些转换或事先定义的情况下,在某些点(在一些它们的用法中)是不可能。这是已经执行了几次的公理的描述一样多的程序被证明,通过使用设置用于此目的的SM语言分支(隐式或显式的)。因此,它是这里使用的决定的情况下,优选的,将用于一个命令或程序,并引入转换的约束,但它显然不是唯一的方式。此外,该计算机软件可以允许它,即使当语言不允许它,如果需要的话,通过添加注释和特定的处理。
2.4限制的某些步骤的语义的能力
考虑到一个程序与其描述的转换,或给予规范/形式化的描述,它描述的转换(对变量,前/后,最薄弱的前提,...的作用下),该方法因而提供表达限制某些转换,操作,命令或程序的语义的可能性(即,定义域,该处理的可能性),以将它们减小为更合适转换(因为它们使用某些基元或很好地理解或精心磨练的部分,或任何其他原因)。例如,它是在为“删除”(“remove”)和“分”(“divide”)的第一版本的先前实施例的情况。在许多情况下,这种技术是一种替代前一个的技术(可以经常使用的一个版本与一个更大的域,但具体例为延伸的更受限制的域的部分,然后声明为其它情况下的转换的可能性,或类似于此的使用具有更受限制的域的版本)。
通过附加实施例的方式,在一必要的程序,可以例如决定一操作/指令“整数的增量”的使用被限制于对应于增加而不溢出的情况下(并在通常的数学意义上的从而得到的语义增量)。这通常是必需的,而不改变程序的全局语义,或通过提供手段以分析由该局部限制引入的修改的影响。在前面的例子中,可能希望表达的事实即指令确实仅在这些条件下被调用(例如,因为它的前面有一个测试检查是否该变量是比某保证值更低)。
这三个先前提出的机制,因此链接。其中可特别如先前所见没有第三个机制,由两个第一个的结合。在一般情况下,这就是将在下文所进行的。通过附加实施例,可能还需要在给定的地方,使用一个除法的版本,其排除了零除的情况下的。这最后两个实施例可以例如使用增量操作的版本(分别除法运算),用于区分正常的情况(即,“真”(“true”))与“溢出”的情况(分别为“divisionByZero”至“错误“(“error”)。
仅有约束至转换的关联在此说明。当然,也可以关联约束至编程点。在此提出的SM语言片段中,选择仅呈现使其可以引入关联于转换的约束的机理,正如总是可以将转换约束代替一单点约束,通过引入就在该点前的命令,其符合该特性,一命令被分为两种情况“真”(“true”)和“假”(“false”),其中的情况下“假”(“false”)被声明为是一个不可能的转换。单点约束的关联因此变为与转换与约束关联的一个特例。与此相反,也可以把自己置于一语言的情况,其不能直接表达转换约束(当前语言的情况下)和地点的约束(即,典型地不变量可以从列表或预定义的属性的组合所选择)在调用指令之前,如间接减少其有益的语义,可能构造这些属性成属性析取每一个对应的情况,接着使用引入以下被称为“改组”(“restructuring”)的技术,以关联被识别的情况至结构限制(或后续转换)。此外,它不仅为一配置不变量的情况,而是不变量与指令相关联,以及被引导并协助(例如通过从可能的情况列表中选择,或将选择的责任留给设备)。
2.5获取程序的特性
由设备所获得的程序,特别是在SM的情况下,其中介形式可以被认为是类似于“流程图”,如罗伯特·弗洛伊德所定义的那样,以及几个功能。首先,通过恢复用于弗洛伊德的定义,而解释的功能,以及特别是在弗洛伊德中通常所谓的“循环不变式”的正确鉴定并且其中随后大多数证明方法,对于证明其-本身是必不可少的,在这里它不一定是这种情况。它们可以被定义并以传统的方式使用(即,如弗洛伊德型方法),但是,本发明引入了新的新颖的方式。特别是,所有或部分用户提供的解释函数或不变量可以如下所见而被证明。
此外,在一个弗洛伊德类型的方法,有,在给定的时间,所谓的“单点约束”的一单个实例。这个约束被放置在程序的末尾(或类似的几个位于其末尾预发布条件)来描述功能或程序所预期的之一的功能。这种独特的约束证据是通过展示一个连贯的解释功能,或者通过提供循环不变量,这使得它可以为我们计算出这种解释函数(Dijkstra算法类型的方法)来实现的。以我们的方法,一工具被提出,使我们能够,我们称之为局部特性(在多个程序点),传统的,只要对于用户的表达是自然的(例如等式位于公理环(2))。然后,无论是使用经典的技术,包括完成关联(加入一些不变量,这里也被称为局部特性,它以某种方式增加冗余),诸如获得一解释功能,其相干于约束以及通过不变量而论证,或者使用其他更具体的证明的技术,其不一定需要使用循环不变量或解释功能。一个可以例如通过使用逻辑通往该点的子路径使用树结构以便表征在该点的属性。其他更明显的具体情况为,当这里所呈现的方法与从弗洛伊德式的方法得出更经典的技术仪器进行比较当然是与转换关联的限制的使用,某些约束的制止,并且显然用这样的仪器程序的可能性为“公理”(例如公理(1)和2)),以及中间程序(以某种方式“引理”程序)。
在一般情况下,一程序的其它组分,例如它的子图可以与局部性质相关联。一种程序,被定义并设置有执行模型,例如确定与否,有或无回溯可能性,可以使用一程序,用于描述多种类型的集,即域,包括数据。
至于表达,一个大致区分那些用于程序的说明中的描述,(即在某种程度上那些限定其语义的描述)从那些用于表达所描述的程序的(通常为本地)实际的属性或归因于它的属性。在该文件的其余部分,术语属性仅用于在该第二意义。在其他用例中,会有提及转换语义或点域。
2.6重新组织
在某些情况下,可能对于修改程序的结构是有用的,以便于验证。有许多原因,可能导致不直接构造使用上述机制被认为是最好的结构。例如用于方法原因(开始从没有基于此所述方法的工具所描述的一程序),或仅仅是因为对应于不同程序编排结构几个不同的视图的需要(以解决例如不同的验证的需求)。但是,它也可能是由于使用与SM不同的语言,其不允许表达处理的故障情况,或不可能的转换。重新组织,因此包括在变换的程序的结构(其分支,它的节点,注释和使用情况)。当然,在本节中描述的程序变换不一定需要实际实现的,但可以简单地是为了其自身验证需求或用户交互的设备所使用的程序的抽象图。
为简单起见,我们将展示设置为使用非常基本的技术来说明它。因此,我们一方面限制为恒定语义程序转换,在另一方面,为仅使用下列基本变换:
a.第一基本转换是用来考虑一个或多个到达一个程序点的过渡(并不一定是到达这点的所有过渡),重定向这些过渡朝着一个新的点(第一克隆点,该点在需要的地方专门写有相同的注释),并重复(克隆)产生于它的过渡(显然,是通过使用相同的针对克隆弧标注)。这种转化可在程序点名称不会对语义产生任何影响的情况下确保语义的保存,这是一般结论,特殊情况下为所呈现的SM片段;
b.第二初等变换包括在执行一个图形清理操作,例如通过删除已经被看到的枯枝;
c.第三范畴包括在不影响语义,且所有情况都不在***点分叉的情况下添加中间步骤。当然,可能情况取决于所采用的语义。典型的,这些操作,以基于来自本文档的实例的语义,应不会对变量产生影响,且没有任何先决条件或对所有在作用点的值有令人满意的条件;
d.与此相反,某些中间步骤删除可实现,当这些步骤对所选择的语义来说是中性的,并最终
e.某些注解的一个可能的限定:当一逻辑注释的某些参数是已知的,后者一般可被简化(例如,当《i》有赋值时,添加(I,J,J+)可以由增量(J,J+)代替,p(x)=>q(x,y)可以由q(x0,y)替代,如果x的值x0使得p(x0)=0)的话。
第一个例子:返回代码。在一个程序中,特别是由不支持的语言书写的程序,不像SM,分离成不同的返回例和相关联的分支,或在在执行方面带有某种成局部支持这个可能性(例如一个执行语言中的异常机理),操作者可能被引至一个位置,该位置的一个返回值以某种方式为特征,该方式存在一个所谓的程序(例如如果退出被正常执行,为“0”,另一情况下为“-1”),就在这个程序的调用完成后,被引导来测试这个返回代码,且依靠值“0”、“-1”或者其他非期望值被分送往程序中的不同地方。为了置身于本发明方法的操作条件中,操作者可以“克隆”被调用程序在一边的退出点,然后克隆在调用程序调用的程序后的点,以及执行的返回值和相关分支的测试点。我们通过使用转化(a)一次或几次来完成此操作,就是说,一旦为“-1”,或为潜在的意外的值,例如具有三种点,都在所调用的程序中,且每种针对一种情况。然后应当注意的是,对应于正常退出的状态将始终具有定位在“0”的返回码,因而,紧接着凭借该返回值执行的测试,相同分支将始终被使用。因此,出现其他分支是不可能的。其他的点将具有相同的属性,就是说,对应于返回代码“-1”的属性,以及对应于其它情况的属性,但显然所使用的分支和试验后成为不可能的分支不再是相同的。
第二个例子:虚拟机(VM)。据推测,虚拟机或语言翻译机是使用程序进行说明的。典型的,会有一个翻译机环,其中对应于当前点的指令可以被读出和解码。由此让我们考虑位于翻译机环的这点,也是处理开始的地方,并***,就在它之前,一个指令,该指令执行本身的读出和解码操作(通常通过复制它),除此之外它会产生许多与存在于所需分析的程序中的指令类型一样多的退出例,也与例外情况的数量一样多,也就是(不正确内存区域、非法指令等),且该处所有中间指令的退出例都有分支,其中语义会导致不会对变量产生影响,也不会有预先条件,也就是说,总和在***点。这种转换因此有(c)型,且因此,操作者发现自己在前面的例子的情况中,即其他两种类型的转换会被应用的情况下,使得操作者会发现自己有等效程序,这将具有这一次“克隆”命令的分析点,使得如果一个人选择特定的程序来解释其一,可能会进一步推进推进转换(通过在一个相当中性的方式中应用授权的初等变换的设置),直到翻译循环已被将要取代所要被翻译的程序的结构取代。实际上这可以更直接在使用第一步时获得,即有许多步骤的读取和译码操作,正如被翻译程序的程序点:每个点与一个特殊的程序指令相对应,但是在相同的程序中被潜在使用许多次的相同的指令,我们得到了一个更为精密的结构,该结构用于偶然成为所翻译程序的结构的转换翻译机。以某种方式,当所要翻译的程序被转换,该程序的部分执行会被完成。
在这两个例子中,一个遂通过转换得到了等价的程序,除了某些被认为是不可见的中间步骤。这样获得的第二程序将使得,它的属性的证明将有可能推断出的第一个程序的属性,并且将有更丰富的程序结构,这将使得在此引用的应用某种“静态”技术成为可能。知道该程序中的某一个的执行可以容易地在其他程序的执行中(考虑所施加的转换的性质)找到,操作者可以很容易地确信,在程序的局部属性之间建立某种充分关系会是容易的(开始时的和转换后所取得的),即使在适当的情况分离的情况中,且在描述相关利益的程序时相关分支没有被取得(例如在应用或说明语言不支持例子内分离的状况下)在下文中,建立充分的关系的可能性将以一个更为详细的方式来解释。
3.带有它与转换相关的针对程序检验的局部约束的程序结构的使用。
用于检验的使用可以干预属性的表达,且/或用于校验它自己。
属性的表达:对于逻辑属性的表达(在程序验证中是必需的),该技术包括考虑用显示一个或多个之前的特性的设备取得的程序(因此也是因为它们所表达的约束)如同它们是逻辑属性一般,(i)既是一个构建更多基础逻辑表达的方法,(ii)抑或是一个在它们自己权利内的逻辑表达(一个程序会是一个在新的逻辑***种类内的逻辑表达,其中干扰规则会被更复杂的用于更复杂电子处理的规则取代)。
3.1将程序分解成基本属性
因此,在公理(1)中,则决定只有主机“removeFirst”(以及因此它的相应的转换)在某一点是可能的,其中该命令被调用(那就是说在第一命令的调用之后),“空”的条件是不可能的。这使得在这个点表达一个约束/属性成为了可能(这里假设,也就是说,它是一个公理,但是相同的程序段可能也被使用来表达要被证明的属性,或者一个中间辅助定理)。直观地说,这个约束只表示,当程序到达这个地方时,无论变量的状态是什么,也不可能使得分支“空”(也就是说不是出于应用条件下)。其次,考虑到潜在的执行模型,即没有回溯或死锁,这也表示,剩余的分支都适用(或这点永远达不到,这意味着它是一个死分支)。
3.2局部性质和“举证责任”之间的连接
根据该情况,有人可能想要制造这些属性和更多经典逻辑公式(也就是说,典型的“举证责任”)之间的连接,以调用经典逻辑证明环境。在这种情况下,他们使用设备实现本发明的目的都程序和三个机制,会被看作是构建基本逻辑属性的态度,用于在验证期间与使用者交流(但也潜在地促进了设备的工作)。
首先,牢记,通过程序执行流中的支化(未声明“是不可能的“),在程序中从一个点到另一个的路径可能与一个已经看到逻辑轨迹有关,该逻辑轨迹本身可能与逻辑符号有关,该逻辑符号描述了一些限制条件,在从第一点到第二点的执行期间,程序的数值必须重视该限制条件。考虑到路径所指向的程序点,或者更普遍的一程序点以及全部指向这个点的一组路径,如果从这一个点开始的特定传输被宣告为不可能的,那么对于这种不可能性存在A.P=>B.Q形式的特性,前提是P表达了引导到兴趣点的路径上的逻辑特性,以及Q与传输有关的关系(有可能使用该特性的任何时候,该特性与传输点的开始和结束有关)。其他补充特性可能起因于执行模型。通过此处使用的优先模型(没有“回溯”或“僵局”的必要模型),存在另一个A.P=>B1.Q1\/。\/Bn.Qn形式的特性,其中,Q1,...,Qn表示从利益点开始的分支之间的关系。针对公理(1),针对第二程序点,也就是说,位于第一命令empty(e+)和第二移removeFirst(x+,e,e+)之间的点,以及我们所有的导致的仅有的逻辑轨迹/路径。
e.[真]empty(e)=>(x,f)[真]remove(x,e,f)
由于第一和第二点可能也增加了特性,该特性表达了第一模型引起的数列。
e.[true]empty(e)
e.[true]empty(e)=>[empty]remove(-,e,-)
因此,一个大致具有生成一组与程序相关的基本特性。每一个特性,本身与一节点和一路径或一组路径有关,该路径指向了程序图中的这一节点。
3.3“举证责任”和带有循环的程序(不变量和隐含的不变量)
当存在有限数量的逻辑轨迹,一可能隐含地或明确地限制其本身对程序不循环。此处,呈现了3个可能,都涉及循环不变量的使用。前两个呈现在这个部分的提示中,第三个会呈现在一个单独的部分中。
第一是在程序中对循环不变量的经典使用,用以证明。用户提议不变量(至少循环不变量)。尤其是带有三个分支A,B,C的程序,该分支可以以这样的顺序,可能在B上循环,或跳过(也就是说,程序的可能执行都是由常规语言(A(B)*C)确定,具有叫做I的提议循环不变量,适用不变量技术被恢复使用,例如代替开始没有循环的程序:AI,IBI,IC,,其中基于使用的方法可选AIC,IBI。正如在传统方式中,这些不变量技术用于目标程序中(原理程序,而不是公理程序),大致不需要使用/展示不变量特性,其特征是在不变量***处精确开始程序的特性。足够使用更弱的特性,该特性同时是在循环入口的合格特性,并且由循环保护,足以证明有关的特性。在特定的方式中,变量的经典使用是感应的直接使用,事实上,无论第一程序的逻辑轨迹是什么,它知道如何将逻辑轨迹与来自一组关联程序的它相联系。例如,对于对应ABBC的逻辑轨迹,很显然将轨迹AI,IBI,IBI,IC从无循环关联程序分派给它;但通信不需要存在于两个方向。有可能,实例化的IBI轨迹不相应开始程序的任何执行,因为不变量潜的弱点。
第二可能由公理(2)的方式阐述,该公理能够生成无限数量的路径以及逻辑路径,进而生成无数逻辑特性。如果这样的一个程序是定理而不是公理,可能发现自己遇到的事前一种的情况。当这样的程序被用作公理时,该公理是针对特定的呈现方法,尽管它不是经典的,但是人们可能在有一个变量精确(而不仅仅是随意)对应某种特性的情况下使用相同的技术,该特性在不变量的***处受到变量的重视。然而,最重要的是当使用权利要求是,不需要明确这一不变量。有可能使用被称作隐含不变量的一个新类型的不变量,这是该方法的特点。在公理(2)的示例中,一循环不变量用于循环开始的位置(更具实践性而但不是唯一的可能性),让我们说《隐含不变量(X,E,F)》,该示例包含循环(静态分析可轻易给出)开始时确定的变量。后者由感应暗中确定(通过确定其最强的不变量,该不变量适用于在变量x,e,f循环开始时)。一旦这一隐含的不变量因此确定,人们便会发现自己在这种情况下,其中一个公理程序已经由几个无循环的程序代替(这里有三个,是因为在开始程序中有不止一个单个循环)。
这三个程序是:
下面介绍如何隐藏变量生成技术,用于属性证明。
原理(2)所表达的特性,通常不是简单的在现存的形式方法中表达(例如,在现有情况中,一个可能已经使用多个定量层级,以明确的表达不变量的特性)。此处,跟随程序的执行足够的明白哪个本地特性适用于那个执行流,以及这些执行流在哪个步骤。因此,分支引起程序流的分离,并且允许了更多的本地特性。此处的本地特性被描写为传输不可能性(或使用的语义或范围限制)。这些本地特性基本上在这里表达了当一个元素“x”被放置在序列“e”的队列中时,因而获得了序列“f”,如果它是被元素清空的元素,将会以相同的顺序精确的给出相同的元素,以作为序列“e”,如果它以同样的方式清空的话。这就是循环表达。当后者被用尽时,将会在“f”中有一个元素,该“f”将会具有值“x”,如同在循环后的程序部分所表达的那样。
值得注意的是,一个程序或程序的片段(也就是说,程序子图),可以看作是定义几个关联的方法,尤其是每一种退出(标签)之间的关联。很显然,有可能考虑所有这些关联的联合所形成的唯一的全局关联,然而,在这里是不可能的。因此,考虑到,例如,以下从原理2中摘取的程序片段(从原理2的图中,这一程序片段很好的对应于SMIL子图),
{
2:[empty:exit]removeFirst(y+,e,e+);
3:[empty:other1]removeFirst(z+,f,f+);
4:[false:other2](y=z);
}
并自然地定义了几个关联,该关联对应于程序片段的退出“真”(在原理2的情况下,这是循循环径),它对应于退出“退出”(在原理2的情况中循环的退出),以及那些对应于情况“其它1”和“其它2”的情况,该“其它1”和“其它2”在原理2中是不可能的(在此情况下为空,由于与关联有关)。F将是序列中这些关联的第一名字。F将因此成为对应于原理2中循环执行的关联。然后,E将是对应于另一个程序片段的正常退出(也就是“真”)的关联名字,后者指向在点2(在这一点没有任何循环)上程序原理2的入口。因而在入口为了程序原理2进入循环之前,E是对应于程序片段的关联。
现在,如果考虑:(a)一方面原理(2)的更复杂的程序片段P1,使用与原理(2)相同的入口,但是从程序点2指向程序点5的转换点退出(也就是说,对应于与点2关联的指令的“清空”情况,也就是说,循环的退出),(b)另一方面,片段P2在原理的点5进入程序原理程序(2),并使用与原理相同的退出,一个具有两个程序片段,该两个程序片段对程序原理2的点2产生不同的作用。第一程序片段当然是两个先前确定的程序片段的结合,对应于关联E和F。由于此处描述的程序假定了一个没有回溯的执行模型,这一程序原理2的第一程序P1表达了一个特性的特定方式,该特性表现出在点2处的声明的值,其中,第二P2表达了验证这些声明的特性,在点2,给出了程序的余下部分。如果对应于这两个程序的主要“真”退出的关联分别叫FP1和FP2(也就是说,此处仅仅考虑的),这些关联遵守以下特性:rng(FP1)。
因此,当一程序放在程序点上,此处在程序原理2中的点2,指向这一点的该程序片段不再返回(在这个例子中在当前情况下,该点2在一个循环中,并且程序P1对应于这个限制),该程序片段使得特别可能指定值的域,该程序原理2在这一点使用该值,此处点2(即,rng(FP1)),当程序P2使得指定值的域成为可能,在同一个点,有可能满足执行中后续步骤中的所有操作。在此处这些程序中使用的具有确定性的不同操作,不同的关联是有用的(但不是全部必要的),特别是关联E,F和FP1。很容易证明FP1=Eο(F0i..)οG,其中F0是标识,并且Fi是i应用功能F的合成物,以及G是恒等函数的限制,在序列e为空的情况下。因此,很容易证明FP1可能作为定点方程式获得,在这一示例中该,作为那些通过原理(2a)和原理(2b)(最强的满足这一定义的属性存在,并且是rng(FP1))隐含地确定的内容。第三隐含原理,原理(2c)本身代表由特性rng(FP1)属性表达。
此处注意到的是,隐藏的不变量在这种情况下被定义,在此情况下,由于循环的存在,明确不变量的自动生成是不可能的。
3.4不变量程序
在SM语言中,即使有可能使用经典不变量(也就是说,在程序点的特性),除了程序变量,还可能使用真实的程序比特,句柄量,还可能他们自己的不变的变量。替代应用于作明确的不变量特性,该特性适用于一程序点,使用了一不变量程序(程序的比特流),程序不会改变现有状态,但是能够改变它自己的不变的变量。该不变的程序通过表述行为隐藏地表达了它应用的(也就是说,它的进入参数)声明,当在这一位置引发该行为时这样一不变量程序将会具有此行为。当然一程序可以使用尽可能多的不变量程序(并有可能将一程序放在每一个程序点)。这些不变量程序还可以分享一些它们的不变的变量(一不变的变量的初始值是之前的不变量程序前留下的)。这些不变量程序可以被看作是象征性的测试,并且使间接/隐含地表达当地特性成为可能。
典型的是,将使用静态技术,以便确保不变量程序不会改变在它们所在的位置上程序的行为,同时显示初始化,并且键入不变的变量的特性。如果一程序决定使用基于不变量技术的传统的验证技术,这些程序不变量被减少到“举证责任”。
此处同样地,带有程序不变量的程序可以被认为是只需要被证明的第二程序,以证明第一(也就是说,证明它的特性)。程序不变量的使用因此是第二程序使用的阐述,即,该带有不变量的程序具有同第一程序不同的函数,和/或不仅仅是第一程序的提取,作为保护第一程序的方法。它还可以被认为是设置两个程序之间足够的关联的阐述,但是我们不会在此展开,因为提出了会在之后详细说明。该程序不变量也是一种使用程序片段的方法,也就是说,该不变量程序为了隐藏地描述不变量特性,该不变量特性已可选地在这些观点中阐述。
4.证明
一般的方法主要是关于通过使用程序分析技术、自动机理论或程序传输操作逻辑程序的结构(程序点,转变和相关限制),通过将他们与传统证明技术联合,为了获得或简化验证。然而,程序的结构也可以这样使用,以构建证明并呈现它的推进,并与用户互动。最终引进的最后操作可能是是一个或几个程序的本地特性的相互联系,以传送特定的证明结果,尤其是特定传输不可能性证明。
4.1与用户互动
当一在程序执行的过程中到达程序点(因而使用了这一程序中的路径),没有程序的传输从这一点开始,并被宣告不可能执行,并且这必须能够被证明。此外,如果执行模型没有回溯,传输中的至少一个程序允许我们从那些被宣告不可能(程序点和困难的传输在宣告使用引导它的分支的不可能性后被移除等:它是一个使用的程序分析技术,以为了简化程序,并使之是一个正常的形式)中的这一点开始是“能够发生的”,并且这也应当是能够证明的。因此,以这一方式提出构建证明:在每一个路径中,工具尝试证明不可能的传输,并且识别什么时候使路径(在实践中他们是路径的前缀)失败(以及可能的每一次),该路径防止证明传输(该组识别路径能够由程序的子图/片段呈现,尤其是在无限组的情况下)的不可能性。用户因此能够分析并且得到关于路径的想法,该路径能够指向不可能的传输,该传输的环境不能论证。这能够使他能够获得关于问题的更好的想法(特性事实上是错误的并且不可能被论证,或者指出给出环境以重新证明)。
4.2程序的结构转化
要记住当使用该方法时,验证本身基于程序结构以及与其相关的限制,这大体上可能通过转换程序执行所有或部分验证,直到导致能够自动或容易证明的形式。此处它包括将程序(该程序根据观点是在高等级逻辑中的逻辑特性,或构建最基础和传统逻辑特性的方法)转化为另一个相等的程序,该相等的程序将具有完全相同的语义,以便使第二的特定本地特性的使推断第一的其它本地特性成为可能。可以说,第一的本地特性与第二的特定其它特性具有足够的关联,如果后者的一组证明可以使推断第一的证明成为可能。在这一示例中,为了阐述需要,将会采取相等的程序的特定情况。如果两个程序具有相同的真实轨迹,他们将会被视为是相等的,(一个简单地删除逻辑轨迹或子逻辑轨迹,该轨迹不具有解决程序,并因此没有可能的示例,并且因此没有对应的执行轨迹),除了潜在的某些认为是不可见的步骤。每一个转变能因此被认为是一证明步骤。当然,没有必要具有相同的程序,以建立和运行本地特性之间的“充足”关系,两个程序是相同的情况是特定的情况。为了简单起见,该概念将被通过相同程序的几个示例介绍。
在这些例子中为了简单起见,使用了常数语义转变。更普遍的是,重要的是这样的转变使得建立一个或更多充足特性成为可能,也就是说,如果存在对应于另一个程序的特性的证明,能够建立程序的本地特性的证明。
列举了两个示例,定义的演变和死分支的删除。如果一个程序考虑定理1,如果需要,有可能通过它的定义(通过定义的主体)展开“成员”,基于管理变量名称冲突,例如通过为了未展开的程序的主体变量,使用变量的新名字。在这个示例中,将获得以下定理1展开:
程序定理1展开
该两个程序因此具有两个意义,并且此处是可逆的,因为转换是一个等值。一个程序可以因此将特定的转变/弧(或子图)放入对应的两个程序中。一个程序将具有例如2个朝向“错误”的禁止转变并且被称为《[false]member(x,f)》,在两个语义(即,两个相反方向的对应)中对应于《[empty]removeFirst(y+,f,f+)》。如果一被证明不可能,另一个也可被视为已证明。例如,如果考虑到第一程序的不可能转变,它与第二转变具有足够的关系,也就是说,为了证明其不可能性,所有需要做的是证明(第二程序的)第二的不可能性。更普遍的是,可能通过足够关联(也就是说,为了证明不可能性,它将足够证明在对应中的转换组是不可能的)具有一组与一转变有关的转变。更普遍的是,还可以在子图之间获得该对应。此处,第一程序的转变还对应于子图,该子图从循环入口前的点(此处,该点不是突然出现的,而可以称为2.1,也就是说,能够总是加入中间点,恰如加入该程序,指令《nop()》对变量没有影响,也不可见),以及循环的退出(也就是说,即,《[empty]removeFirst(y+,f,f+)》)。同样的,第一程序转变的不可能性的证明(表示在该程序中在这一位置没有转变可能),等同于执行轨迹示例的不存在的证明,该示例在这一位置采用这一子图(当然这意味着存在横跨子图一端到另一端的路径)。还提及子图的不可能性,或者它已死的事实,这不意味着所有转换或点都已经死了(在这一示例中存在循环的另一可能退出,在《[true](x=y)》上,实际上是有可能的)。对于子图,不可能性是相同的,是由于所有横跨子图而没有解决程序的所有逻辑轨迹(特别是对应于他们所有的逻辑印象是没有解决程序的,也就是说,他们都有可能推论出“错误”),或者由于没有逻辑轨迹(没有指向子图的开始直到末端的路径)。可以观察到的是,不可能转变是不可能或死的子图的特定情况。当子图是不可能的或者死的,并被如此证明,一个程序能够总体上切割死去的分支(在这一实例中,转变《[empty]removeFirst(y+,f,f+)》)。
4.3通过关联或两个程序的合并证明
假定一程序需要通过原理(2)证明定理(1)。该定理(1)将被展开,以获得如前所述的定理1展开。因此决定使用循环不变量,其中不变量是基于如前所述的原理(2)获得的,并且它将会放置在定理1展开的(仅有的)循环的开端,让我们说点(2,9)。获得了两个“举证责任”,一个表达了在进入循环的过程中,不变量是符合的,而另一个表达了不变量的保存。路径能够被转变为“证明责任”,并且通过经典逻辑证明。但是也可能示出一些程序或一些程序片段和/或将它与定理(2)结合,以直接证明定理,而没有使用“举证责任”。这就是我们以下要阐述的。
现在,一个程序需要证明“成员”是为真(也就是说,在这个地方情况为真是仅有的可能性),并且由于这个一个程序可能通过“假”显示分支退出的不可能性。在定理1展开中,一个程序可以识别两个不可能的分支,一连接于变量的不符合,另一个在点3是“清空”分支。存在两个指向第一不可能转变的路径。在这两个路径中,一开始于程序的开端,并指向循环不变量,也就是说,
(1)[true]->(2)[true]->(2.9)[false]->(error).
另一个从循环的开端指向,符合一种情况的不变量在已执行循环之后,没有不变量,也就是说,
(2.9)[true]->(3)[true]->(4)[true]->
(2.9)[false]->(error),
存在指向第二不可能转变的路径(即,从循环的开端指向“g”是清空的情况的路径),也就是说,
(2.9)[true]->(3)[false]->(error).
如果我们看一下上述三个逻辑曲线的第一个,考虑“x”的值和程序点1的“e”值,将他们“注入”(“injuect”)公理(2a),这为我们提供了“F”的值,而事实上,implicitInvariant(x,e,f)为真,或者更准确地说,公式的一个分支“[false]implicitInvariant(x,e,f)->(n)”是不可能的。我们可以很容易地从“addLast”的功能属性推断,且从事实“g”和“F”点2.9处在逻辑曲线中的值(例如首次进入循环)。由此从“implicitInvariant”功能可以推断出的路线是不可能的,而这正是我们想要的功能。
所以,在这里我们所做的,就是实例化一个程序(注射值)的值(即公理(2a)),待证的程序的值,即第一个逻辑曲线,以证明后者。我们并没有描述这种“程序匹配”是满足精确的规则,因为没有特定的困难。实际上运用“传递同余闭包的技术结合先前所示的程序不变量的使用是实现这种程序匹配的一种简单的方法,即是使用其他程序与一些在目标程序证明的过程中的目标程序的值实例化的变量。它可以被用于,此处所用的程序不仅仅是该目标程序的一摘要。相同的技术可用于证明使用公理(2b)(即匹配)的第二逻辑曲线的不可能性,和证明使用公理(2c)的第三逻辑曲线的不可能性。我们在此不显示。
4.4.传递一致性封闭
每个逻辑曲线,或在每个近似曲线(在以下部分一看就知如何得到),可以应用等式的传递闭包技术或采取自变量的值得更普遍一致性,因此,在逻辑变量。一致性或者直接来自转换的语义(一过渡,包含或意味着某些变量之间的等式),或来自特定指令的确定性特性(在相同的参数或参数一致运用两次的确定性转换/功能给退出值这分别等于或一致。通过举例的方式,让我们首先考虑Theorem1Unfold的新版本,其中我们已经增加了一些新的程序不变量:
很明显,如果我们证明了新版本,这将足以推断出前一版本是安全的。为了证明这一点,我们需要证明,一些转换导致的错误确实是不可能的。我们在这里操作其中一个作为说明。我们做了以下逻辑曲线,其直接对应于前一版本(唯一的区别来自于目前程序不变量)的第一逻辑曲线:
[true]addLast(x0,e0,f0+);
[true]addLast(x0,e0,f1+);
[true]implicitInvariant(x0,e0,f1);
[true]g0:=f1;
[true]h0:=e0;
[error]implicitInvariant(x0,h0,g0);
通过应用传递一致性闭包,我们得到如下:
[true]addLast(x0,e0,f0+);
[true]addLast(x0,e0,f0+);
[true]implicitInvariant(x0,e0,f0);
[true]f0:=f0;
[true]e0:=e0;
[error]implicitInvariant(x0,e0,f0);
此曲线显然是不可能的,因为,当应用相同的值,implicitInvariant不能产生两种不同的结果或标签,因此证明不可能。
这个例子也示出了一个可能的程序匹配实施程序(或在上一节中给出的变量实例)。在这里,我们已经在1.1基础上添加了第一程序不变量,那就是我们想运用的公理(2A)。***的地方已被确定,以便允许公理的正确实例根据已存在于该目标程序的上下文值进行变量。加入的公理(它当然可能是任何引理)成为一个不变量,其由其余的程序以证明为目所使用。当然这样的侵入性修改(仅用于可信性的举例说明)是不需要的,并且程序修改可以在一个更有效且无需目标程序修改的环境下来完成。
两个前面部分还表明出了被其他程序定义的局部属性运用(即一程序不变量在第一种情况下和的隐含不变量的在第二种情况下)。
4.5.重播
前述例子还表明了在同一逻辑曲线中相同的值重放同一命令的具体情况。如果该命令是完全确定的,例如不仅有同一标签,还有相同的返回值返回。这既可以用于产生新的一致性,也可检测上述的不可能性。在上一部分中,它也被用于addLast的第二用途点1.1处(即第一程序的前提只用于正值)。
4.6。利用该证明程序分析技术。自动生成不变量
可见通过执行跟踪分配给每个逻辑曲线一个predicate来进行相应变量值的逻辑变量是可能的。
因此,对于一个程序点,这是只可以通过有限数量的线路和相应的逻辑跟踪来实现(即是在这种情况下的前缀,因为它们从程序中的一个入口点到一个点,其不一定是一个程序退出),通过采取允许采用从程序(包括前提)的起始点开始到该点的每个逻辑曲线所获取的连词的分离,有一不变量于给定的点。因此,一个拥有一个方式来自动于该点生成相对丰富的不变量。它甚至可能表明,在确定条件下,特别是当与所述转变相关联的predicate完全指定后者时,由此构建的不变量的最强的不变量,其被包含在这些点里面(并因此可表达)。
然而,可以通过前缀/逻辑曲线限定达到的点的数目在最标准的程序是极少的程序。通常,有许多循环,这就是为什么大多数点,有一个逻辑曲线导致这些无穷多个点(一定数目的循环通常在到达改点前的未绑定数目被取得)。在一般情况下,在循环通向这些点,人们仍可提取程序,其特征在该点的属性。为一个确定的执行模式,它通常是足够删除所有程序退出,以及从程序中加入所述利益点作为可能的退出(在确定的退出前通过潜在的循环退出,一情况要求一定的预防措施和相当自然适应性,这里就不介绍了),并且然后删除无用分支。通过这样做,与所述利益点相关的程序被被获得,在本发明中较适当的显示,在该点上的一个不变量。还可以看到如何在循环内发现利益点的情况下适应这一点。
如果通过一个典型的形式表现的不变量是必须的(而不是在程序的形式),通常在这里提出的方法限制自身在自动或辅助方式向有限数目由一方面的代表逻辑曲线(每个这些逻辑迹曲线可以大致无限集合开始程序的逻辑曲线),并使得程序点的不变量或曲线用于计算,它足以使用具有代表曲线或行为,其中它、它们对应曲线或有问题的点。据推测,仅前缀路径生成,因此逻辑曲线前缀并不循环回本身(如果前缀在已经生成的前缀上再循环扩展,新的扩展的前缀是通过加入步骤和所有潜在的扩展而被忽略)。这些逻辑前缀的集合是有限的,并且是容易计算。
现在让我们考虑一个程序点上的后者可以循环,并假设我们已经成功地获得了一个近似函数“f”,其使得能够分配给每个这些点的关系用以描述近似关系循环的执行(有可能是几个可能的分支的循环点;此外,相同的循环通常可以重复几次,这也构成了一个循环)在这一点上。换句话说,这个函数分配到一个循环点的关系,它包括分别来自每个逻辑分路的关系并从这点出发和回到本身推断的关系。
通过举例的方式,提出要分配给这种逻辑子路径,基于在循环的入口和退出逻辑变量之间存在的一致的近似,或至少一个可以自动计算出一致性(由上述传输一致闭包应用)。这样的关系当然一般是近似的。直观地,这种近似将保持精确的平等(即一致性更普遍),在变量值之间在该循环给定的分支执行之执行前以及执行之后的值,其中包括情况为数值可能已经更改并重置为初始值。
他们也将在给定状态变量值之间保持其他平等性,但会释放所有其他限制。因此,例如在一个循环分支,其中一个变量“x”是递增的,另一个剩下的不变的变量将保持“y”的不变和对“×”潜在的给予任何新的值。众所周知,一循环可以典型地包含不同的分支,而且命题可以重复,从而固定点的一个简单的计算将允许简单地结合找到的每个分支的不同近似关系。
这个固定点的计算通常可以以简单的方式得到。例如,在结构化程序的情况下,所有需要的是通过完成程序的树结构而得以通过:所述程序流程控制的确可以看作是一个树,其前提是每个循环回到它自身上的转换是视为树的叶子;每个这些节点识别一个潜在的环回,计算循环的特定分支的效果通过传递一致性闭合的应用的方法来实现,并仅仅提取全等关系,然后,如果一方又需要更新(此处潜在的释放一些等式)关系式通过正在构造的函数“f”(定点结构)和这些点相关联。
在非结构化程序的情况下,一个可以或者第一返回为等效但结构化程序,或计算更为精确的函数“f”,而不是在程序的循环点取它的其中值,需要他们的前缀(逻辑或结构前缀)至潜在的循环点(即,给定的无循环前缀,从入口,可以说是(n0),到点,可以说是(nk),前缀的形式(n0)->P..(nk))和另一前缀通过添加循环包覆的第一个,因此形成的(n0)->P..(nk)..->R(nk),在前缀定义未经程序的循环的函数“F”,将与所述第一前缀的前缀,一个关系L相关联,使得对应于逻辑曲线(nk)..->R(nk)的满足M,即完成循环,使其第二首前缀的分支,会类似
在其余的和避免不必要地复杂化的演示中,我们限制注意该情况,其中程序被组建,只注意了转换到一般的情况下是很容易得到的。
一旦所需计算程序的每个循环点这些近似值,其将在下文中称为第一程序,可以建立一个不循环的第二程序,通过从第一程序除去循环弧,且在上一步骤中确定,则通过各旧的循环点替换,也就是说,每个所述的两点间的Ni,即为nia,和nib,第一个收到的入口弧ni和其他退出退出弧,然后,通过连接第一个nia,到第二个nib,由程序定向弧线从nia,到nib引起,并通过相应ni接近的函数进行注释(即f(ni))。那么人们可以清理所获得的程序,以去除死分支,然后在两个发现的程序的弧度和点之间连接足够的关系,也就是说,证明第一程序所需要的一个分支是不可能的(即本地属性),在第一个程序中做同样的证明相同的分支也是不可能的(即满足本地属性)。当然,其中的分支(即程序点)的改变已被保存。一些额外的充足的关系可以明显地被加入到这些改变的构造的点。这不是能在这里简单描述的。
不循环的第二程序是通过自动构造在本节的开头描述的不变量,被用来生成和证明不变量,然后将属性传递到第一程序。
但是,更为方便的是从第二程序传送自动生成的的不变量到第一程序保持不变代码中,也可对于循环的节点,通过考虑所述第二组的代码nib,其是对应于一循环点ni。通常,在第一程序的一路径,相同的节点,ni取一次或几次,可能的循环序列被除去并且取而代之的是一个简单的步骤,其中一个从第一个代码nia到第二个nibnib,同时执行转换(潜在的不确定性),相对应于与ni相对于的近似关系。在第二程序路径的第一点nia表示至第一程序点ni的通路,第二点nib表示到点ni的最后通道。当然,没有必要明确地构造第二程序程序,也无需明确地建立充分的关系。步骤的数量可能减少,特别为了优化。不管什么情况,它导致提供了一种用于检验器,以产生并自动证明在启动程序的不变量。
因此,给定的程序点,可以获得近似逻辑曲线的有限集合,该检验可以通过使用在本节开头描述的技术,自动生成(或有相同的结果的,不明确的过程)一该点的不变量。对于这一点,将不得不以某种方式用于至其的执行路径的近似版本,其中表示循环的执行部分已被近似步骤替换。因此这些近似值被做于逻辑曲线,其中每个通常表示可能执行曲线是无穷大的。
在此方法中所用函数“f”可以是基于不同类型的近似原理。这里使用的举例说明的的简单而有效的原理在于通过考虑循环作为关系基本上而保留某些变量的值,这相当于搜索变量的影响近似除去分支/分支(循环)保持为循环(不管所使用的分支,它的循环次数),当然,一个简单经典静态的在循环过程中改变变量的研究可能是足够的。
通过将这个原理应用到TheoremUnfold程序,一循环不变量,其描述三个逻辑变量x,e和f之间的联系,(就当X0,E0,F0),通常[true]addLast(X0,E0,f0的+)自动生成。此外,此属性是通过程序的其他点生成的多数的不变量的一部分。
这里,很明显,在循环的核心并不修改变量,该循环不变量代表该变量,但是可以很容易地想象到一种情况其中一变量在一循环中被修改,在将其置于其循环开始的值,应保存该值,鉴于该变量已被修改(也就是说,《buffer:=x;x:=x+1;<bodyoftheloop>;x:=buffer;preservesthevalueof《x》即使它已被修改了两次)。这很容易被认为是相同的技术被应用于这个稍微困难一些的替代给予完全相同的循环不变量。
其他近似值与其基于变量一定值的保护是可能的,例如,如果一个变量是由一个对应的传递和自反关系被改变(例如每个循环递增的变量),关系>=可以是这个变量的近似值(此反射在此重要,因为循环可能不被执行)。
4.6利用局部性质证明生成的代码
当模型是充分细化通常能够生成实现代码。这例如用于SM环境的情况。生成工具接着可利用以下事实:一些不可能转变或局部特性已被证明以至优化所生成的代码。例如,如果一个所述的不可能转变,如[empty:error]removeFirst(y+,g,g+);在给定的程序点,还没有在生成的时间被证实是正确的,生成过程将可能需要产生一些代码用于正常“不可能”的情况。在我们例子中,“g”情况是空的,当该程序被调取,正常程序的流程,该程序调用还未被使用的“Y”中现有数值结果,并且逃避机制是必需的,需要被生成。在此不可能转变已经在生成时被证明,这样的特定的处理是没有必要的,所生成的代码可以相应地优化。
额外例子
这里我们介绍一些新的用法示例用于证明权利要求。
Prog1:程序1
[empty:false]removeFirst(x+,e,g+);=>[false:error]member(x,e);
第一程序展示出,如果“x”是在序列的“e”的第一位置时,它意味着“×”属于“e”。在SM可以表述为,当在这种情况下调用,该“成员”(“member”)的“错误”(“false”)是“impossible”(“不可能”)。该程序程序因此具有在这里一单一相关的局部性质,在不可能转换的形式下表达。“成员”(“member“)的“错误”(“false”)被更名为“false”,这考虑到隐含的语义将程序直接退出而向“true”。现在让我们看看通过展开“member”获得的程序,然后用进行优化,其中两个连续的分支由一个替代:“member”的循环既可以寻求价值的平等和终止当前值(分支”真”(”“true”)在3中),或者因为循环的结束已经达到(“removeFirst”的分支”空”(“empty”)在2中)。在第二种情况下,一个在循环前被分支(empty:exit),接着一个以“错误”(“false”)退出该程序,并因此为“error”,其实未经授权的分支。这里,一个为了简化的一个单分支替换一分支(即,在2中的[empty:error])。这当然是一个由检验器进行检查的程序变换。检验器更精确的确定了两个版本程序之间充分的特性。
Prog2:程序2
此实例中可以看出两个步骤,其已允许产生程序2也就是意味着,如果一证明了程序2的分支不可能(更确切地说,如果可以证明分支被认为不可能真的是不可能的情况下),一个也可证明程序1分支的不可能性。因此一个在这两个程序的局部特性间的足够关系已经建立。在这里,两个程序在SM中偶然等同,因为这两个转换保持等价,但是这既不需要,也不用在这里。现在,我们将采用新的转换,即,通过展开所述循环(即,主体的一个实例是放置在后者的前部),也是一等效转换。
Prog3:程序3
这里也一样,如果程序3的两个不可能分支被证明,程序2的不可能分支也证明,其本身使其能够证明程序1。就此建立在这些程序中一个新的充分的关系,再次通过变换一个程序,以便获得另一个。这里,为了可读性,加入最后的修改,以获得程序4。其包括一语法修改,其甚至不修改下层的SMIL,从而通过明显的方式确立了充分的新关系。
Prog4:程序4
于是,一个应用传递一致性闭包在通往2.1的路径。这里,为了简化,一个非***地命名所创建的逻辑变量,但在这种情况下来表示他们为一个非含糊方式。因此,在2.1,一个有以下等价类:在2.1的“f”与逻辑变量相关(指令调用之前的一个)与那个在三个点0,,1,2.1的“e”相关联的逻辑变量是相等的。让“e0”被称为逻辑变量,以下被用于代表该等价类。
一个单一的路径导向2.1,并且请注意,在此路径中不可避免地通过由位于0的指令的分支“真”(“true”),其意味着该部分“[true]removeFirst(x0+,e0,g0+)”对于逻辑变量值”x0是真,且“g0”分别对应在1的变量“x”和“g”,(以及偶然在2.1)。
如果现在的重点是其对应的情况“[empty:error]removeFirst(Y+,F,F+)”下的2.1的转换,这是很容易证明这种情况是不可能的,这正是我们想要展示的。
实际上,如果有可能“e0”在两种可能的情况下(须记住f在这一点上具有逻辑变量“e0”的值),鉴于removeFirst是功能性的(以及确定性)。如果现在着眼于其他情况下,也就是说,情况为“真”(“true”),这将带我们到3.1然后由于相同的属性之一可以通过建立的逻辑变量对应于“f”为延长的传递而被包括在等价类“g0”,即对应于“y”为等价类“x0”,对应于“x”是“x0”,它允许如之前在进行该显示的这个过渡在相等的情况下假设是不可能的前提下通过,这使得我们通过理清程序/修剪程序图以删除其对应于循环而做出图表。
我们建议施加到程序4的不同的操作可以以一种完全自动的方式通过应用上的平等来传递一致性闭包过程而获得通过程序的遍历曲线图,然后由图形的静态清洁,以获得新的图(或被完全证明的等效程序)。这完全可以证明程序4,然后通过复制足够的关系来证明(所有属性)程序3,然后是程序2等等,直到程序1。
本发明已经示出并详细的在附图和前面的描述中描述。其必须被认为是说明性的示例的方式而不是为了将本发明限制到这种唯一的描述中。大量的实施例是可能的。
例如,该方法用于计算和记忆可以包括素材加速器,例如高性能图形处理器,这使得它可以并行大量计算。材料加速器也可被特别开发,例如通过FPGA编程(可编程门阵列)。
在权利要求中,词语“包括”不排除其他元素,并且不定冠词“一个”并不排除多个。

Claims (25)

1.一种保护一第一程序的方法,第一程序包含一个有限数量的程序点以及与程序点及定义从一个程序点到另一个程序点的段落的相关演化规则,包括:
·一个多退出情况的定义,以及当一第二程序被使用在第一程序的定义中,对于第二程序的每个退出情况,一分支至第一程序一特定的程序点的定义,或者一分支不可能声明;以及
·一个关于一组待证明属性的定义,每一个都与一个或多个第一程序的基本构成元素关联,所述属性组包含作为特定属性的不可能分支;
·该属性组的形式证明的建立。
2.如权利要求1所述方法,其特征在于,所述演化规则,其退出点以及该分支定义执行轨迹的树形结构,一个检验器使用所创建的树形结构以传送在第一程序的点中的约束和使用显式或隐含同余的传递闭包,以证明所述第一程序的属性中的至少一个。
3.根据权利要求2的所述方法,其特征在于,第一程序包含至少一循环,一个检验器自动在程序点通过使用潜在的与通往至其的执行路线的近似的版本创建一个不变量,其中,代表循环的部分已经被近似的执行步骤所替代。
4.根据权利要求2的所述方法,其特征在于,至少有一个被声明为“不可能”的分支被通过分析引导转化树形结构的路线所证明。
5.根据权利要求2的所述方法,其特征在于,第一程序的保护是基于第三程序的保护功能有别于第一程序,和/或不仅是第一个程序的摘要。
6.根据权利要求5所述的所述方法,其特征在于,导向对应关系,称为充分的关系,在至少一个所述第一程序程序的本地属性和至少一个第三程序的本地属性之间建立,以此证明第一程序的一本地属性,只要这种对应存在,它足以证明第三程序的该属性组与第一程序的该属性相符。
7.根据权利要求6所述的所述方法,其特征在于,第三程序被通过一传输进行修改使其可能拥有第一程序,即第一程序的保护基于第三程序的保护。
8.根据权利要求6所述的所述方法,其特征在于,第一程序被通过一传输进行修改使其可能拥有第三程序,即第一程序的保护基于第三程序的保护。
9.根据权利要求6所述的所述方法,其特征在于,第一程序被通过一次传输进行修改使其可能拥有第三程序,并且起草调整一个在第一和第三程序的至少一个相关属性之间的多充分关系。
10.根据权利要求6所述的所述方法,其特征在于,第三程序被通过一次传输进行修改使其可能拥有第一程序,并且起草调整一个在第一和第三程序的至少一个相关属性之间的多充分关系。
11.根据权利要求5所述的所述方法,其特征在于,第三程序中至少有一个变量被实例化使用采用于第一程序变量的值,以在第一程序与第三程序间建立起一充分的关系,或者作为保护第一程序的一种方式。
12.根据此前任何一个权利要求中的所述方法,其特征在于至少一个本地属性通过一个第四程序所定义。
13.一计算机软件产品包含软件说明书以用来实施根据权利要求1~12之间的任何一种方法,当所述计算机软件产品在一台计算机上执行时。
14.根据权利要求13所述的所述计算机软件产品,其特征在于,它包含一使用户界面适应以使用户能定义退出情况以及相关联的分支,和/或使待证的本地属性能。
15.根据权利要求14所述的所述计算机软件产品,其特征在于,该用户界面用于定义不可能分支。
16.根据权利要求14或15所述的所述计算机软件产品,其特征在于,用户界面适应以定义一个特定程序入口条件,以使用/调用在一个给定的点,并且以此限制了调用程序的退出情况。
17.根据权利要求13所述的计算机软件产品,其为了优化已生成的代码而利用被证明的一些非传输或本地属性,生成实施代码。
18.一种保护一个第一程序的方法,第一程序包含一个有限数量的程序点以及与程序点及定义从一个程序点到另一个程序点的段落的相关演化规则,包括:
·一多退出情况的定义,以及当一第二程序被使用在第一程序的定义中,对于第二程序的每个退出情况,一分支至第一程序一特定的程序点对的定义,或者一个不可能分支声明;以及,
·一关于一待证明属性组的定义,每一个都与一个或多个第一程序的基本构成元素关联,所述一属性组包含作为特定属性的不可能分支;
·该属性组的形式证明的建立,
其中第一程序包括至少一循环,一个检验器自动在程序点通过使用通往至其的执行路线潜在的类似版本生成一个不变量,其中代表循环执行的部分被近似的步骤所替代。
19.根据权利要求18所述的方法,其特征在于至少一个分支被声明为不可用,通过分析树形结构路线引导转换所证明。
20.一种保护第一程序的方法,该第一程序包含有限数量的程序点以及与程序点相关的定义两个程序点片段的演化规则,包括:
·一多退出情况的定义,以及当一第二程序被使用在第一程序的定义中,对于第二程序的每个退出情况,通过第一程序一个特定的程序点对一分支的定义,或者一个不可能分支宣告;以及,
·一关于一待证明属性组的定义,每一个都与一个或多个第一程序的基本构成元素关联,所述一属性组包含作为规定属性的不可能分支;
该属性组的形式证明的建立,其中第一程序的保护是基于第三程序的保护功能有别于第一程序,和/或不仅是第一个程序的摘要。
21.根据权利要求20所述的方法,其特征在于,在至少一个第一程序的本地属性与至少一个第三程序的本地属性指间被称为充分关系的定向对应关系被建立,这样提供第一程序的本地属性,只要该对应关系存在,就可以充分证明第三程序的与第一程序对应的属性组。
22.根据权利要求21所述的方法,其特征在于,第三程序被一传输修改以使它能够获得第一程序,这样该第一程序的保护就基于该第三程序的保护。
23.根据权利要求21所述的方法,其特征在于,该第一程序被一传输修改以使它能够获得该第三程序,这样该第一程序的保护就基于该第三程序的保护。
24.根据权利要求21所述的方法,其特征在于,该第一程序被一传输修改以使其能够获得该第三程序并且起草第一程序与第三程序间至少一个相关属性多充分关系。
25.根据权利要求21所述的方法,其特征在于,该第三程序被一次传输修改以使其能够获得该第一程序并且起草该第一程序与该第三程序间至少一个相关属性多充分关系。
CN201480010722.3A 2013-02-26 2014-01-28 保护程序的方法 Active CN105103135B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/777,524 2013-02-26
US13/777,524 US9501383B2 (en) 2013-02-26 2013-02-26 Method for securing a program
PCT/IB2014/058600 WO2014132147A1 (en) 2013-02-26 2014-01-28 Method for securing a program

Publications (2)

Publication Number Publication Date
CN105103135A true CN105103135A (zh) 2015-11-25
CN105103135B CN105103135B (zh) 2018-01-16

Family

ID=50184958

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201480010722.3A Active CN105103135B (zh) 2013-02-26 2014-01-28 保护程序的方法

Country Status (8)

Country Link
US (2) US9501383B2 (zh)
EP (1) EP2962206B1 (zh)
KR (1) KR102235001B1 (zh)
CN (1) CN105103135B (zh)
BR (1) BR112015020394B1 (zh)
IL (1) IL239954A0 (zh)
SG (2) SG11201505427VA (zh)
WO (1) WO2014132147A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110998531A (zh) * 2017-08-24 2020-04-10 谷歌有限责任公司 元组图程序中子图内优化的方法

Families Citing this family (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9501383B2 (en) 2013-02-26 2016-11-22 Dominique Bolignano Method for securing a program
US9275236B2 (en) 2013-06-28 2016-03-01 Dominique Bolignano Method for securing a program
US9811322B1 (en) * 2016-05-31 2017-11-07 Oracle International Corporation Scalable provenance generation from points-to information
EP3862871A1 (en) * 2016-12-19 2021-08-11 (Un)Manned N.V. Method and apparatus for real-time control loop application execution from a high-level description
US9983978B1 (en) 2017-03-08 2018-05-29 Microsoft Technology Licensing, Llc Querying an indexed time-travel trace
US9959194B1 (en) 2017-03-08 2018-05-01 Microsoft Technology Licensing, Llc Indexing a trace by insertion of memory snapshots for replay responsiveness
US9934126B1 (en) * 2017-03-08 2018-04-03 Microsoft Technology Licensing, Llc Indexing a trace by insertion of reverse lookup data structures
US9940369B1 (en) 2017-03-08 2018-04-10 Microsoft Technology Licensing, Llc Searching an indexed time-travel trace
US9934127B1 (en) 2017-03-08 2018-04-03 Microsoft Technology Licensing, Llc Indexing a trace by insertion of key frames for replay responsiveness
US10185645B2 (en) 2017-03-08 2019-01-22 Microsoft Technology Licensing, Llc Resource lifetime analysis using a time-travel trace
US10282274B2 (en) 2017-06-14 2019-05-07 Microsoft Technology Licensing, Llc Presenting differences between code entity invocations
US10705810B2 (en) * 2018-11-30 2020-07-07 Sap Se Automatic code generation
US11210087B2 (en) * 2019-12-04 2021-12-28 WhiteSource Ltd. System and method for interprocedural analysis

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20010037492A1 (en) * 2000-03-16 2001-11-01 Holzmann Gerard J. Method and apparatus for automatically extracting verification models
US20020046393A1 (en) * 2000-01-07 2002-04-18 Leino K. Rustan M. System and method for verifying computer program correctness and providing recoverable execution trace information
WO2002044898A1 (fr) * 2000-11-24 2002-06-06 France Telecom Verification formelle notamment d'une machine virtuelle securisee
US6550056B1 (en) * 1999-07-19 2003-04-15 Mitsubishi Denki Kabushiki Kaisha Source level debugger for debugging source programs
US20030226060A1 (en) * 2002-05-28 2003-12-04 Microsoft Corporation System and method for performing a path-sensitive verification on a program
US20090276763A1 (en) * 2008-05-05 2009-11-05 Microsoft Corporation Bounding Resource Consumption Using Abstract Interpretation
US20100070804A1 (en) * 2003-12-31 2010-03-18 Dominique Bolignano Method for controlling program execution integrity by verifying execution trace Prints
CN101866406A (zh) * 2010-06-18 2010-10-20 中国科学院软件研究所 一种栈溢出攻击防御方法

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH10214203A (ja) * 1997-01-29 1998-08-11 Nec Corp 情報処理装置
JP3284956B2 (ja) * 1998-01-26 2002-05-27 日本電気株式会社 プログラム変換方法、プログラム変換装置及びプログラム変換プログラムを記憶した記憶媒体
US6327704B1 (en) * 1998-08-06 2001-12-04 Hewlett-Packard Company System, method, and product for multi-branch backpatching in a dynamic translator
US7124407B1 (en) * 2000-08-16 2006-10-17 Sun Microsystems, Inc. Method and apparatus for caching native code in a virtual machine interpreter
US8132158B2 (en) * 2006-12-28 2012-03-06 Cheng Wang Mechanism for software transactional memory commit/abort in unmanaged runtime environment
DE102007038763A1 (de) * 2007-08-16 2009-02-19 Siemens Ag Verfahren und Vorrichtung zur Sicherung eines Programms gegen eine Kontrollflussmanipulation und gegen einen fehlerhaften Programmablauf
US8555380B2 (en) * 2008-02-28 2013-10-08 Intel Corporation Automatic modification of executable code
US20090282289A1 (en) * 2008-05-06 2009-11-12 Microsoft Corporation Generation and evaluation of test cases for software validation and proofs
CA2691851A1 (en) * 2010-02-04 2011-08-04 Ibm Canada Limited - Ibm Canada Limitee Control flow analysis using deductive reaching definitions
US8522225B2 (en) * 2010-06-25 2013-08-27 International Business Machines Corporation Rewriting branch instructions using branch stubs
US20130055033A1 (en) * 2011-08-22 2013-02-28 International Business Machines Corporation Hardware-assisted program trace collection with selectable call-signature capture
US9501383B2 (en) 2013-02-26 2016-11-22 Dominique Bolignano Method for securing a program
US9275236B2 (en) 2013-06-28 2016-03-01 Dominique Bolignano Method for securing a program

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6550056B1 (en) * 1999-07-19 2003-04-15 Mitsubishi Denki Kabushiki Kaisha Source level debugger for debugging source programs
US20020046393A1 (en) * 2000-01-07 2002-04-18 Leino K. Rustan M. System and method for verifying computer program correctness and providing recoverable execution trace information
US20010037492A1 (en) * 2000-03-16 2001-11-01 Holzmann Gerard J. Method and apparatus for automatically extracting verification models
WO2002044898A1 (fr) * 2000-11-24 2002-06-06 France Telecom Verification formelle notamment d'une machine virtuelle securisee
US20030226060A1 (en) * 2002-05-28 2003-12-04 Microsoft Corporation System and method for performing a path-sensitive verification on a program
US20100070804A1 (en) * 2003-12-31 2010-03-18 Dominique Bolignano Method for controlling program execution integrity by verifying execution trace Prints
US20090276763A1 (en) * 2008-05-05 2009-11-05 Microsoft Corporation Bounding Resource Consumption Using Abstract Interpretation
CN101866406A (zh) * 2010-06-18 2010-10-20 中国科学院软件研究所 一种栈溢出攻击防御方法

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110998531A (zh) * 2017-08-24 2020-04-10 谷歌有限责任公司 元组图程序中子图内优化的方法

Also Published As

Publication number Publication date
BR112015020394A8 (pt) 2019-11-12
CN105103135B (zh) 2018-01-16
US20140245259A1 (en) 2014-08-28
SG11201505427VA (en) 2015-08-28
SG11201505428TA (en) 2015-08-28
BR112015020394A2 (pt) 2017-07-18
KR20150123282A (ko) 2015-11-03
WO2014132147A1 (en) 2014-09-04
KR102235001B1 (ko) 2021-04-01
US9501383B2 (en) 2016-11-22
IL239954A0 (en) 2015-08-31
US20170075788A1 (en) 2017-03-16
US9892016B2 (en) 2018-02-13
EP2962206B1 (en) 2020-07-15
EP2962206A1 (en) 2016-01-06
BR112015020394B1 (pt) 2022-06-14

Similar Documents

Publication Publication Date Title
CN105103135A (zh) 保护程序的方法
EP3676778B1 (en) Constraints on inputs of an unlocking transaction in a blockchain
Autili et al. Aligning qualitative, real-time, and probabilistic property specification patterns using a structured english grammar
Brunel et al. The electrum analyzer: model checking relational first-order temporal specifications
CN102598001A (zh) 用于分析具有瞬时逻辑的逻辑设计的技术
Damian et al. Communication-closed asynchronous protocols
CN105786715A (zh) 一种程序静态自动分析方法
Baxter et al. Sound reasoning in tock-CSP
Greenyer et al. Applying advanced tgg concepts for a complex transformation of sequence diagram specifications to timed game automata
Ireland et al. Reasoned modelling critics: turning failed proofs into modelling guidance
Bouwman et al. Off-the-shelf automated analysis of liveness properties for just paths
Fecher et al. UML 2.0 state machines: Complete formal semantics via core state machine
Schivo et al. How to efficiently build a front-end tool for UPPAAL: a model-driven approach
Jones et al. Possible values: exploring a concept for concurrency
da Rocha Pinto et al. Steps in modular specifications for concurrent modules (invited tutorial paper)
Dinsdale-Young et al. A perspective on specifying and verifying concurrent modules
Willemse Semantics and verification in process algebras with data and timing
Jaber et al. Synthesis of distributed agreement-based systems with efficiently-decidable verification
Gall et al. An operational semantics for the cognitive architecture ACT-R and its translation to constraint handling rules
Bliudze et al. Verification of concurrent design patterns with data
Bianchi et al. An efficient verifier of truly concurrent properties
Wulandari et al. Verifying a copying garbage collector in GP 2
Raimondi et al. A tool for specification and verification of epistemic properties in interpreted systems
Kezadri Hamiaz et al. A formal framework to prove the correctness of model driven engineering composition operators
Przigoda et al. More than true or false: native support of irregular values in the automatic validation & verification of UML/OCL models

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant