distributed_verification/
lib.rs1use eyre::Result;
2use serde::{Deserialize, Serialize};
3
4#[macro_use]
5extern crate tracing;
6#[macro_use]
7extern crate eyre;
8
9pub mod db;
10pub mod diff;
11pub mod error_handling;
12pub mod kani_list;
13pub mod logger;
14pub mod statistics;
15
16pub type BoxStr = Box<str>;
17
18#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
22pub enum ProofKind {
23 Standard,
25 Contract,
27}
28
29#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
33pub enum InstKind {
34 Intrinsic,
35 Virtual,
36 Shim,
37}
38
39#[derive(Debug, Serialize, Deserialize, Clone)]
40pub struct Callee {
41 pub def_id: String,
42 pub func: SourceCode,
43}
44
45#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
46pub struct SourceCode {
47 pub file: String,
50
51 pub name: String,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
56 #[serde(default)]
57 pub inst_kind: Option<InstKind>,
58
59 #[serde(skip_serializing_if = "Option::is_none")]
62 #[serde(default)]
63 pub proof_kind: Option<ProofKind>,
64
65 #[serde(skip_serializing_if = "Vec::is_empty")]
68 #[serde(default)]
69 pub attrs: Vec<String>,
70
71 pub src: String,
73
74 #[serde(skip_serializing_if = "zero")]
76 #[serde(default)]
77 pub macro_backtrace_len: usize,
78
79 #[serde(skip_serializing_if = "Vec::is_empty")]
89 #[serde(default)]
90 pub macro_backtrace: Vec<MacroBacktrace>,
91}
92
93fn zero(n: &usize) -> bool {
94 *n == 0
95}
96
97#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
98pub struct MacroBacktrace {
99 pub callsite: String,
100 pub defsite: String,
101}
102
103pub fn kani_path() -> String {
110 use std::env::var;
111 let path = if let Ok(path) = var("KANI_DIR") {
112 path
113 } else {
114 let kani = std::process::Command::new("kani").arg("--version").output().unwrap();
115 let kani_folder = std::str::from_utf8(&kani.stdout).unwrap().trim().replace(' ', "-");
116 let home = var("KANI_HOME").or_else(|_| var("HOME")).unwrap();
117 format!("{home}/.kani/{kani_folder}")
118 };
119 assert!(std::fs::exists(&path).unwrap());
120 path
121}
122
123#[derive(Debug, Default, Serialize, Deserialize, Clone)]
124pub struct SerFunction {
125 pub hash: Box<str>,
126 pub name: Box<str>,
127 pub file: Box<str>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 #[serde(default)]
130 pub proof_kind: Option<ProofKind>,
131}
132
133impl SerFunction {
134 pub fn is_proof(&self) -> bool {
136 self.proof_kind.is_some()
137 }
138}