如何手工给出形式化证明?是否有一种语言规范,像形式逻辑一样形式化,我们可以在此基础上建立我们的证明?
例如,如何知道this modulepanic
是否为s?
mod my_mod {
use std::marker::PhantomData;
#[derive(Clone, Copy)]
pub struct A<'id> {
p: PhantomData<*mut &'id u8>,
data: u32,
}
pub fn scoped<T>(data: u32, f: impl for<'id> FnOnce(A<'id>) -> T) -> T {
f(A {p: PhantomData::default(), data})
}
impl<'id> PartialEq for A<'id> {
fn eq(&self, other: &Self) -> bool {
// Can we prove that this assertion will never failed whatever code is using this mod?
assert_eq!(self.data, other.data);
// some UB stuff if the assertion failed here
true
}
}
}
Rust playground
这个非常具体的例子背后的直觉是在变量上给出类型级别标记(作为一个生存期泛型),这样我们就可以保证两个A<'id>
总是从同一个源复制。
1条答案
按热度按时间zzlelutf1#
有一个Prusti项目,它使Rust程序的正式验证成为可能,程序员的工作量最小。
他们特别指出:
默认情况下,Prusti通过证明unreachable!()和panic!()等语句不可访问来验证是否存在异常。
他们的官方网页可以达到这个链接:https://www.pm.inf.ethz.ch/research/prusti.html
你可以在这里阅读他们的论文:https://link.springer.com/chapter/10.1007/978-3-031-06773-0_5