通过外部形式证明的安全性
Safety via external formal proofs
安全通常是通过强静态类型实现的。尽管有非常强大的类型系统(依赖类型),但其中 none 足以表达关于代码的任意形式证明。另一个问题是类型系统与单一编程语言紧密耦合,抑制了形式证明重构。
我认为一个可能的框架是一个编译器,当程序员(或自动化工具)提供允许优化的正式证明时,它会激活优化。例如唯一性、终止、数组边界检查、内存管理、安全性等。
有没有以某种方式实现这个概念的编程语言?
我知道证明携带代码,但它通常作为常规类型系统和在程序转换下证明类型安全的编译器实现。
Isabelle/HOL证明助手的代码生成器是根据您描述的原理生成的。人们可以指定一个以声明方式给出的抽象关系,这意味着没有有效的算法来检查它是否适用于任意输入(尽管可能可以证明它适用于某些特定输入)。然后定义一个函数来检查关系是否适用于任意值。这包括一些确保函数可计算的步骤,例如以表明它终止。接下来,证明关系和函数确实可以相互代替使用。最后,有了这个证明,就可以告诉 Isabelle 该函数可用于为原始谓词生成代码(使用一种受支持的函数式语言)。
当然,如果有两个这样的函数,可以选择一个比较喜欢的一个来生成代码。这也可以被视为产生可证明相同结果的优化。
安全通常是通过强静态类型实现的。尽管有非常强大的类型系统(依赖类型),但其中 none 足以表达关于代码的任意形式证明。另一个问题是类型系统与单一编程语言紧密耦合,抑制了形式证明重构。
我认为一个可能的框架是一个编译器,当程序员(或自动化工具)提供允许优化的正式证明时,它会激活优化。例如唯一性、终止、数组边界检查、内存管理、安全性等。
有没有以某种方式实现这个概念的编程语言?
我知道证明携带代码,但它通常作为常规类型系统和在程序转换下证明类型安全的编译器实现。
Isabelle/HOL证明助手的代码生成器是根据您描述的原理生成的。人们可以指定一个以声明方式给出的抽象关系,这意味着没有有效的算法来检查它是否适用于任意输入(尽管可能可以证明它适用于某些特定输入)。然后定义一个函数来检查关系是否适用于任意值。这包括一些确保函数可计算的步骤,例如以表明它终止。接下来,证明关系和函数确实可以相互代替使用。最后,有了这个证明,就可以告诉 Isabelle 该函数可用于为原始谓词生成代码(使用一种受支持的函数式语言)。
当然,如果有两个这样的函数,可以选择一个比较喜欢的一个来生成代码。这也可以被视为产生可证明相同结果的优化。