我看到了几个不同的研究小组,至少有一本关于使用Coq设计认证程序的书。是否就认证计划的定义达成了共识?从我所知道的,它真正意味着该程序被证明是完整的并且类型正确。现在,程序的类型可能是非常奇特的东西,例如列表,其中包含非空的证明,排序,所有元素> = 5等等。但是,最终,是一个经过认证的程序,Coq显示的是总计和类型安全,所有有趣的问题归结为最终类型中包含的内容?
根据wjedynak的回答,我看了Xavier Leroy的论文“现实编译器的形式验证”,它在下面的答案中有所联系。我认为这包含了一些很好的信息,但我认为这一系列研究中提供的信息更多的信息可以在Sandrine Blazy和Xavier Leroy的论文Mechanized Semantics for the Clight Subset of the C Language中找到。这是“形式验证”论文添加优化的语言。在其中,Blazy和Leroy介绍了Clight语言的语法和语义,然后在第5节讨论了这些语义的验证。在第5节中,列出了用于验证编译器的不同策略,这在某种意义上提供了概述创建认证计划的不同策略这些是:
在任何情况下,都有可能添加点,我当然希望听到更多。
回到我关于认证程序定义的原始问题,对我来说仍然有点不清楚。 Wjedynak提供了一个答案,但Leroy的工作实际上涉及在Coq中创建编译器,然后在某种意义上证明它。理论上,它现在可以证明有关C程序的事情,因为我们现在可以进行C-> Coq->证明。从这个意义上说,似乎有这样的工作流程,我们可以
或者,我们可以在校对助手工具中创建程序规范,然后证明规范的属性,而不是程序本身。
无论如何,如果有人有这些定义,我仍然有兴趣听取替代定义。
答案 0 :(得分:6)
我同意这个概念看起来很模糊,但据我所知,认证程序是一个程序,配备正确的证据。现在,通过使用丰富且富有表现力的类型签名,您可以实现它,因此不需要单独的证明,但这通常只是为了方便。真正的问题是我们所说的正确性:这是一个规范问题。你可以看看例如Xavier Leroy。 Formal verification of a realistic compiler
答案 1 :(得分:5)
首先请注意,“认证”一词略有法语偏见:在其他地方经常使用“已验证”或“已证实”的表达。
无论如何,要问这实际意味着什么是很重要的。 X.Leroy和CompCert是一个非常好的起点:它是一个关于C编译器验证的大项目,而Leroy总是热衷于向他的听众解释为什么验证很重要。特别是在与“认证机构”的人交谈时,他们通常意味着测试,而不是证明。
另一个使用Isabelle / HOL的大型验证项目是L4.verified。 exposition的这一部分解释了实际陈述和证明的内容,以及后果。不幸的是,实际的证据是绝密的,因此无法公开检查。
答案 2 :(得分:2)
认证程序是与程序满足其规范的证明(即证书)配对的程序。关键是存在一个证明对象,可以独立于产生证明的工具进行检查。
已验证的程序已经过验证,在此上下文中通常可能意味着其规范已在Coq等系统中正式化并证明正确,但证明不一定经过外部工具认证。
这种区别在科学文献中得到了很好的证明,并不是法语国家特有的。 Xavier Leroy在A formally verified compiler back-end的第2.2节中非常清楚地描述了这一点。
答案 3 :(得分:1)
我的理解是"认证"在这个意义上,as Makarius pointed out是法语国家选择的英语单词,母语使用者可能会使用"正式验证"。 Coq是在法国开发的,有很多法语国家的开发者和用户。
关于什么"正式验证"意味着维基百科notes(许可证:CC BY-SA 3.0)它:
是使用正式的数学方法证明......系统所针对的某些正式规范或属性的预期算法的正确性。
(我知道你想要一个比这个更精确的定义。我希望将来更新这个答案,如果我找到的话。)
Wikipedia特别注意验证和验证之间的区别:
- 验证:"我们是否正在努力做出正确的事情?",即是根据用户的实际需求指定的产品?
- 验证:"我们制作了我们想要制作的产品吗?",即产品是否符合规格?
landmark论文seL4: Formal Verification of an OS Kernel(Klein等,2009)证实了这种解释:
一个愤世嫉俗者可能会说实施证明只显示了 实现与规范完全相同的错误 包含的内容。这是事实:证明不保证 规范描述了用户期望的行为。该 差异[在经过验证的方法中与未经验证的方法相比] 是抽象的程度和缺乏整类错误。
那些类别的错误是什么? Agda教程gives some idea:
- 没有运行时错误(处理I / O错误等不可避免的错误;其他错误被设计排除)。
- 没有非生产性的无限循环。
答案 4 :(得分:0)
这可能意味着没有运行时错误(数字溢出,无效引用......),这与大多数开发的软件相比已经很好了,但仍然很弱。根据域形式化证明其他含义是正确的;也就是说,它不仅必须正式摆脱运行时错误,还必须证明它可以做它预期要做的事情(必须已经精确定义)。