如何用泛型和trait边界形式化地证明Rust板条箱的安全性?

rjjhvcjd  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(125)

如何手工给出形式化证明?是否有一种语言规范,像形式逻辑一样形式化,我们可以在此基础上建立我们的证明?
例如,如何知道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>总是从同一个源复制。

zzlelutf

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

相关问题