Questions tagged «software-verification»

有关证明程序正确性的方法和技术的问题。

6
实践中的正式程序验证
作为软件工程师,我为工业产品编写了大量代码。相对复杂的东西,包括类,线程,一些设计工作,但也有一些性能折衷的地方。我做了很多测试,对测试感到厌倦,所以我对正式证明工具(例如Coq,Isabelle)产生了兴趣……我可以使用其中之一来正式证明我的代码没有错误并且可以完成吗用它?-但是,每当我检查其中一种工具时,我都不敢相信它们可用于日常软件工程。现在,那只能是我,而我正在寻找有关的指针/观点/想法:-) 具体来说,我的印象是,要使这些工具之一对我有用,就需要大量投资才能向证明者正确定义所考虑程序的对象,方法...。然后我想知道,鉴于证明者必须处理的所有事情,证明者是否会不仅仅耗尽精力。或者,也许我将不得不摆脱副作用(那些证明工具似乎对声明性语言确实非常有用),我想知道这是否会导致无法使用“经过验证的代码”,因为它不会很快,或者足够小。另外,我不能奢侈地更改使用的语言,它必须是Java或C ++:我不能告诉老板我从现在开始要使用OXXXml进行编码,因为它是OXXXml中唯一的语言。我可以证明代码的正确性... 拥有更多形式验证工具经验的人可以发表评论吗?再说一遍-我很喜欢使用正式的证明工具,我认为它们很棒,但是我给人的印象是它们位于象牙塔中,而Java / C ++的低谷使我无法达到……(PS:I也喜欢 Haskell,OCaml ...不要误解:我是声明性语言和形式证明的粉丝,我只是想看看我如何切实地将其用于软件工程) 更新:由于涉及的范围很广,让我们尝试以下更具体的问题:1)是否有使用证明来证明工业Java / C ++程序正确性的示例?2)Coq是否适合该任务?3)如果适合使用Coq,我应该先用Coq编写程序,然后再从Coq生成C ++ / Java吗?4)这种方法可以处理线程和性能优化吗?

6
解决图灵“停顿问题”的算法
此问题是从理论计算机科学堆栈交换迁移而来的,因为可以在计算机科学堆栈交换上回答。 迁移 7年前。 “ Alan Turing于1936年证明,不存在解决所有可能的程序输入对暂停问题的通用算法” 我是否可以找到一种通用算法来解决某些可能的程序输入对的暂停问题? 我是否可以找到一种或多种编程语言,对于每种使用该语言的程序,我都可以决定该程序是否终止或永远运行?

4
如何检查两种算法是否对任何输入返回相同的结果?
当所有输入的集合都是无限的时,如何检查两种算法(例如,合并排序和朴素排序)对于任何输入是否返回相同的结果? 更新:感谢Ben解释了在一般情况下如何通过算法无法做到这一点。Dave的答案很好地总结了算法方法和手动方法(受人类智慧和隐喻的影响),这些方法并不总是有效的,但却非常有效。

2
程序正确性,规格
来自Wikipedia:在理论计算机科学中,当说算法相对于规范是正确的时,就断言了算法的正确性。 但是问题在于,获得“适当的”规范并不是一件容易的事,并且(据我所知)没有100%正确的方法来获得正确的规范,这只是一种估计,因此,如果我们要仅仅因为谓词看起来像“一个”就以谓词为规范,为什么不仅仅因为它看起来“正确”就认为程序是正确的呢?

1
我们为什么不对编译时间保证进行更多研究?
我喜欢所有的编译时间,我喜欢这样的想法:一旦您编译了程序,就可以保证程序的执行。一般来说,静态类型系统(Haskell,C ++等)似乎比任何动态类型系统都提供了更强大的编译时保证。 据我了解,Ada在编译时间检查方面走得更远,并且能够在执行之前检测到更大范围的错误。考虑到在某个时间点,它被选用于脆弱的领域(编程错误可能会导致人员伤亡),因此它也被认为是相当安全的。 现在,我想知道:如果更强大的静态保证导致代码更完整,更安全,那么我们为什么不朝这个方向进行更多研究呢? 一种似乎缺少的东西的例子是一种语言,它不是定义int具有由基础体系结构的位数确定的范围的通用类型,而是可以具有范围(在下面的示例中Int [a..b]描述了一个介于包括a和b): a : Int [1..24] b : Int [1..12] a + b : Int [2..36] a - b : Int [-11..23] b - a : Int [-23..11] 或(从Ada那里获得): a : Int [mod 24] b : Int [mod 24] a + b : Int [mod 24] …

2
在Hoare风格的正确性证明中如何处理数组
在围绕该问题的讨论中,Gilles正确地提到,使用数组的算法的任何正确性证明都必须证明没有越界的数组访问;根据运行时模型,这将导致运行时错误或访问非数组元素。 一种执行这种正确性证明的通用技术(至少在本科生中,可能在自动验证中)是使用Hoare逻辑。我不知道标准规则集包含与数组有关的任何内容;他们似乎仅限于单子变量。 我可以想象添加以下形式的公理 {0≤i<A.length∧P[A[i]/E]} A[i]:=E; {P}{0≤i<A.length∧P[A[i]/E]} A[i]:=E; {P}\qquad \displaystyle \frac{}{\{0 \leq i \lt A.\mathrm{length} \land {P[A[i]/E]} \}\ A[i] := E;\ \{P\}} 但是,我不清楚您将如何处理右侧的数组访问,即在某些语句x:= E中它是否是复杂表达式EEE的一部分。x:=Ex:=Ex := E 如何在Hoare逻辑中对数组访问进行建模,以便可以并且必须证明无效访问的存在以确保程序的正确性? 答案可能假设我们不允许数组元素比其他语句中使用或一些的一部分在,因为这不限制表现; 我们总是可以为临时变量分配所需的值,即写而不是。A[i]:=EA[i]:=EA[i] := EEEEx:=Ex:=Ex := Et:=A[i]; if(t>0)…t:=A[i]; if(t>0)…t := A[i];\ \mathtt{if} ( t > 0 ) \dotsif(A[i]>0)…if(A[i]>0)…\mathtt{if} ( A[i] > 0 )\dots

4
证明功能代码正确的常见形式化技术有哪些?
我想为我作为论文一部分编写的Haskell程序的某些部分提供证明。但是到目前为止,我找不到很好的参考书。 格雷厄姆·赫顿(Graham Hutton)的入门书籍《编程在Haskell中编程》(《Google图书》)(我在学习Haskell时就读了)涉及一些推理程序的技巧,例如 方程式推理 使用非重叠模式 列表归纳 在第13章中,但不是很深入。 您是否可以推荐任何书籍或文章,以更详细地概述Haskell或其他功能代码的形式证明技术?

6
程序验证技术可以防止Heartbleed类型的错误发生吗?
关于Heartbleed错误,Bruce Schneier在4月15日的Crypto-Gram中写道:““灾难性”是正确的词。在1到10的范围内,这是11。几年前,我读到某个操作系统的内核已经通过现代程序验证系统进行了严格验证。因此,现在是否可以通过应用程序验证技术来防止出现Heartbleed风格的错误,还是这是不现实的,甚至基本上是不可能的?

2
一阶逻辑验证简介
我正在尝试向自己教授软件验证的不同方法。我读了一些文章。据我了解,带有时间的命题逻辑通常在SAT求解器中使用模型检查(在进行中的-反应系统中),但是带有时间的一阶逻辑又如何呢?它使用定理证明吗?还是可以使用SAT? 非常感谢初学者在这本书上指向书籍或文章的任何指针。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.