From 51c669e1798beca50ced074bf5edd9ce63f4e81d Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 24 Jan 2025 18:51:20 -0800 Subject: [PATCH 01/67] doc/internal: Move internal docs to an appropriate directory. A few of the Markdown files that sat in doc/ are not intended for public consumption (i.e. deployment to HTML/PDF versions of documentation). These include: - doc/extcore.md -> doc/internal/extcore.md This is documentation for the SAWCore dump format, which is (hopefully) not something typical users are having to mess with. - doc/limitations.md -> doc/internal/limitations.md A five-year-old attempt at documenting the limitations of SAW's use for verification. It should be updated or scrapped. - doc/RELEASING.md -> doc/internal/releasing.md A (partially?) outdated documentation of SAW's release process. This needs some updating as well. --- doc/{ => internal}/extcore.md | 0 doc/{ => internal}/limitations.md | 0 doc/{RELEASING.md => internal/releasing.md} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename doc/{ => internal}/extcore.md (100%) rename doc/{ => internal}/limitations.md (100%) rename doc/{RELEASING.md => internal/releasing.md} (100%) diff --git a/doc/extcore.md b/doc/internal/extcore.md similarity index 100% rename from doc/extcore.md rename to doc/internal/extcore.md diff --git a/doc/limitations.md b/doc/internal/limitations.md similarity index 100% rename from doc/limitations.md rename to doc/internal/limitations.md diff --git a/doc/RELEASING.md b/doc/internal/releasing.md similarity index 100% rename from doc/RELEASING.md rename to doc/internal/releasing.md From dc425943a82326459d7b5d54bc2bd5897a594c98 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 24 Jan 2025 19:34:50 -0800 Subject: [PATCH 02/67] manual/code: Remove unused files. None of the files in doc/manual/code were referenced or used anywhere in doc/manual, and at least one of these files made reference to something completely nonexistent (see #2185). --- doc/manual/code/Add.class | Bin 436 -> 0 bytes doc/manual/code/Add.java | 9 --------- doc/manual/code/java_symexec.saw | 15 --------------- doc/manual/code/loop.bc | Bin 1232 -> 0 bytes doc/manual/code/loop.c | 10 ---------- 5 files changed, 34 deletions(-) delete mode 100644 doc/manual/code/Add.class delete mode 100644 doc/manual/code/Add.java delete mode 100644 doc/manual/code/java_symexec.saw delete mode 100644 doc/manual/code/loop.bc delete mode 100644 doc/manual/code/loop.c diff --git a/doc/manual/code/Add.class b/doc/manual/code/Add.class deleted file mode 100644 index f834d518c7286dd623205a3384752c7e3fa7bcc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 436 zcmZ9H%}T>S6ot@&GxPQR@d@Avdp0DtZI~EX*s-uH&_2$JtU3`ez2QVap3jn0pc`gI zdbxOr((*<{Ih}qui&Z{RWv0)KDXaTzF3<{3lVnVUN)n#DAQ%P$;)zSwXLgb(C)}$W z_VsL0#_2_-xgCxkPSvAw&_dgRgEhu!3iPz?=c>5#ucB!hS2*CyC4T}|=sW~0DxXzo zXY>y7N@1YGUAMut!rfU0U}LrRcn=*te8#lKNq7JDh4t^OS7gGT1U6$N%W`; j>J9W8-k52Fd28glZ!rENtr|I4Mt+f2gA~}TpRn}<_0%*P diff --git a/doc/manual/code/Add.java b/doc/manual/code/Add.java deleted file mode 100644 index 6dc4f499c5..0000000000 --- a/doc/manual/code/Add.java +++ /dev/null @@ -1,9 +0,0 @@ -class Add { - public int add(int x, int y) { - return x + y; - } - - public int dbl(int x) { - return add(x, x); - } -} diff --git a/doc/manual/code/java_symexec.saw b/doc/manual/code/java_symexec.saw deleted file mode 100644 index 40f8748755..0000000000 --- a/doc/manual/code/java_symexec.saw +++ /dev/null @@ -1,15 +0,0 @@ -// show that add(x,y) == add(y,x) for all x and y -enable_deprecated; -cadd <- java_load_class "Add"; -x <- fresh_symbolic "x" {| [32] |}; -y <- fresh_symbolic "y" {| [32] |}; -res <- java_symexec cadd "add" [("x", x), ("y", y)] ["return", "$safety"] true; -let jadd = rewrite basic_ss {{ res.0 }}; -let safe = {{ res.1 }}; -jadd' <- abstract_symbolic jadd; -print_term jadd'; -print "Proving commutivity:"; -prove_print abc {{ \a b -> jadd' a b == jadd' b a }}; -print "Proving safety:"; -prove_print abc safe; -print "Done."; diff --git a/doc/manual/code/loop.bc b/doc/manual/code/loop.bc deleted file mode 100644 index 8a6886c3bd6347a5c7b3a8dfdca6900099304038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 zcmZuxO=ufO6rRzPPCu9D>l@j^h9cvTW-aRRZaH1SU1l$&H=mqxshw2YTg-6=N1@&TnhJeCftlD-QV ztaVC0EK7P$ZcuI#RRJf~N;u1s*auzkX-Gt3Ws)iqFHf>=oapAwOySR581%ib)S--QvIFCc#+o1Bw8d8oCORn06?IYcnPc4R#=AGTblKERct%ClaA3@X?9%) z0q(gG=FlzqVOZ98MYx>*!@1SH)e=d$yIE9{VsZ9GnP?h%)akqJ3qM#0tt$vwL3;++ zGs;JwGq!=-1(+TeDn)zW%-V*zP?+Ie31&(_E|a0fRy8fcs6Fb}u+KJfy-NF@8GYrv zm&IufLwh^-3gwpY^)-4dnjc%EN430lahAK*;IeJ*T9HfoaaP644O2_Q(1MtP(+$(9 zhO<0QmT^LP?%n2bT*D!eLK?v9NX-BwGlJofORPhfDQ=uO|JFVey4B}0pbS(ag6|c2 zrZ{P^jRX|K`Pu1^GP9UmylP{DO*f-gN7&W;!UZ}!f9GSvPZz%V{_T|neK(eiZBhZp zf;r*)Zvzx5*%ddchk&HLTR9na{muLU}s z@8tD>9%eOh?^s;2Q{!u)vBJHLAdozb6Q!7?g?j(uxxY1T*b;=sNkEJxx3L?RKU=5A zYoYNCdc201Dd}N( z$-VB|$@?0ii$BwscJh}Bw6ET_Csn)>!K0n0fk(9t>!K>O2PdBy;nm>5Ji-|)ZB{{Z%|U=)~P!6aDn zf-a!Ekb50%Gn8@R7w4E>Ud>-|6b8xzbNvI!7`~dP`!`8SuneXRDYDJ dsuMP*Iu!7~Q&U8?o8w!*<=s%zuR)3z@*in&jd}n8 diff --git a/doc/manual/code/loop.c b/doc/manual/code/loop.c deleted file mode 100644 index fca7f4fae8..0000000000 --- a/doc/manual/code/loop.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -uint8_t f(uint8_t i) { - int done = 0; - while (!done){ - if (i % 8 == 0) done = 1; - i += 5; - } - return i; -} From 6b94ef904159bb16df773cceac70ffca99d7d30a Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 24 Jan 2025 20:02:54 -0800 Subject: [PATCH 03/67] manual: Correct erroneous internal links. One was ill-formed (links based on headers are written with a '#' followed by a normalization of the header text), and another was completely non-existent / referred to a section that had been renamed at some point in the past. --- doc/manual/manual.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manual/manual.md b/doc/manual/manual.md index 16ec4d6ca3..89c5c8e817 100644 --- a/doc/manual/manual.md +++ b/doc/manual/manual.md @@ -552,7 +552,7 @@ command. Other primitives are considered deprecated. Some of these, as the -[deprecation process]("formal-deprecation-process") proceeds, are +[deprecation process](#formal-deprecation-process) proceeds, are unavailable by default. They can be made visible with the `enable_deprecated` command. @@ -3794,7 +3794,7 @@ Normally, a `MethodSpec` is the result of both simulation and proof of the target code. However, in some cases, it can be useful to use a `MethodSpec` to specify some code that either doesn't exist or is hard to prove. The previously-mentioned [`assume_unsat` -tactic](#miscellaneous-tactics) omits proof but does not prevent +tactic](#finishing-proofs-without-external-solvers) omits proof but does not prevent simulation of the function. To skip simulation altogether, one can use one of the following commands: From a2af838009382bfb52d12805654410a9c5fb2ce7 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 24 Jan 2025 20:05:38 -0800 Subject: [PATCH 04/67] manual: Use a level-1 heading (slightly) more appropriately. This document is (in my opinion) fundamentally ill-formed, as there are multiple level-1 headings. Before fixing that, however, we might as well use the more-correct incorrect thing. --- doc/manual/manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manual/manual.md b/doc/manual/manual.md index 89c5c8e817..95b3be612d 100644 --- a/doc/manual/manual.md +++ b/doc/manual/manual.md @@ -1,4 +1,4 @@ -## Overview +# Overview The Software Analysis Workbench (SAW) is a tool for constructing mathematical models of the computational behavior of software, From 85e4f55f02224199965db59d9f4673b8a53d4c72 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 24 Jan 2025 20:09:14 -0800 Subject: [PATCH 05/67] Update fenced code block language specifiers. I'm not entirely sure where the syntax `{.c}`/`{.rs}`/etc. came from, but it was not recognized by the Sphinx Markdown engine while testing locally, so I've used the conventional syntax everywhere instead. This change doesn't break the existing PDF builds, either, so perhaps it has to do with how the old website pages were built? --- doc/manual/manual.md | 42 +++++------ doc/rust-tutorial/rust-tutorial.md | 108 ++++++++++++++--------------- doc/tutorial/tutorial.md | 16 ++--- 3 files changed, 83 insertions(+), 83 deletions(-) diff --git a/doc/manual/manual.md b/doc/manual/manual.md index 95b3be612d..54a5a07f50 100644 --- a/doc/manual/manual.md +++ b/doc/manual/manual.md @@ -1602,7 +1602,7 @@ of possible concrete executions. As a concrete example, consider the following C program that returns the maximum of two values: -~~~~ {.c} +~~~~ c unsigned int max(unsigned int x, unsigned int y) { if (y > x) { return y; @@ -1614,14 +1614,14 @@ unsigned int max(unsigned int x, unsigned int y) { If you call this function with two concrete inputs, like this: -~~~~ {.c} +~~~~ c int r = max(5, 4); ~~~~ then it will assign the value `5` to `r`. However, we can also consider what it will do for *arbitrary* inputs. Consider the following example: -~~~~ {.c} +~~~~ c int r = max(a, b); ~~~~ @@ -1700,7 +1700,7 @@ Directly comparing the branch condition to a constant can sometimes be enough to ensure termination. For example, in simple, bounded loops like the following, comparison with a constant is sufficient. -~~~~ {.c} +~~~~ c for (int i = 0; i < 10; i++) { // do something } @@ -1712,7 +1712,7 @@ continuing the loop will be infeasible. As a more complex example, consider the following function: -~~~~ {.c} +~~~~ c uint8_t f(uint8_t i) { int done = 0; while (!done) { @@ -2620,7 +2620,7 @@ lengths to check for this. Here is an example of this pitfall in an LLVM verification. Given this C code: -~~~ .c +~~~ c void side_effect(uint32_t *a) { *a = 0; } @@ -2715,7 +2715,7 @@ The same pitfalls apply to compositional MIR verification, with a couple of key differences. In MIR verification, mutable references are allocated using `mir_alloc_mut`. Here is a Rust version of the pitfall program above: -~~~ .rs +~~~ rust pub fn side_effect(a: &mut u32) { *a = 0; } @@ -2769,7 +2769,7 @@ _even if the function that calls the override never uses the allocations_. To illustrate this point more finely, suppose that the `foo` function had instead been defined like this: -~~~ .rs +~~~ rust pub fn foo(x: u32) -> u32 { let mut b: u32 = x; side_effect(&mut b); @@ -2794,7 +2794,7 @@ mutable global variables in their postconditions. To illustrate this using LLVM verification, here is a variant of the C program from the previous example that uses a mutable global variable `a`: -~~~ .c +~~~ c uint32_t a = 42; @@ -2844,7 +2844,7 @@ referred to as `static mut` items. (See the [MIR static items](#mir-static-items) section for more information). Here is a Rust version of the program above: -~~~ .rs +~~~ rust static mut A: u32 = 42; pub fn side_effect() { @@ -2890,7 +2890,7 @@ postconditions, _even if the function that calls the override never uses the static items_. For example, if the `foo` function were instead defined like this: -~~~ .rs +~~~ rust pub fn foo() -> u32 { side_effect(); 42 @@ -3195,7 +3195,7 @@ The following commands are used to construct slices of arrays: As an example of how to use these functions, consider this Rust function, which accepts an arbitrary slice as an argument: -~~~~ .rs +~~~~ rust pub fn f(s: &[u32]) -> u32 { s[0] + s[1] } @@ -3313,7 +3313,7 @@ where a `&[u8]` value is expected (and vice versa). As an example of how to write specifications involving string slices, consider this Rust function: -~~~ .rs +~~~ rust pub fn my_len(s: &str) -> usize { s.len() } @@ -3345,7 +3345,7 @@ SAW makes no attempt to ensure that string slices over a particular range aligns with UTF-8 character boundaries. For example, the following Rust code would panic: -~~~ .rs +~~~ rust let rosu: &str = "roșu"; let s: &str = &rosu[0..3]; println!("{:?}", s); @@ -3366,7 +3366,7 @@ types_, or ADTs for short. ADTs have identifiers to tell them apart, and a single ADT declaration can give rise to multiple identifiers depending on how the declaration is used. For example: -~~~~ .rs +~~~~ rust pub struct S { pub x: A, pub y: B, @@ -3436,7 +3436,7 @@ enum's variants, so SAW will use this information to look up a variant's identifier from a short name. Here is an example of using `mir_enum_value` in practice: -~~~~ .rs +~~~~ rust pub fn n() -> Option { None } @@ -3475,7 +3475,7 @@ Rust ADTs can have both type parameters as well as _lifetime_ parameters. The following Rust code declares a lifetime parameter `'a` on the struct `S`, as well on the function `f` that computes an `S` value: -~~~~ .rs +~~~~ rust pub struct S<'a> { pub x: &'a u32, } @@ -3508,7 +3508,7 @@ discussion on this point. If that issue is fixed, then we will likely remove SAW has experimental support for specifying `struct`s with bitfields, such as in the following example: -~~~~ .c +~~~~ c struct s { uint8_t x:1; uint8_t y:1; @@ -3713,7 +3713,7 @@ supplied as an argument must be a valid identifier: As an example of how to use these functions, here is a Rust program involving static items: -~~~ .rs +~~~ rust // statics.rs static S1: u8 = 1; static mut S2: u8 = 2; @@ -3825,7 +3825,7 @@ dotprod xs ys = sum (zip (*) xs ys) To implement this in C, let's first consider the type of vectors: -~~~~ .c +~~~~ c typedef struct { uint32_t *elts; uint32_t size; @@ -3839,7 +3839,7 @@ We can compute the dot product of two of these vectors with the following C code (which uses the size of the shorter vector if they differ in size). -~~~~ .c +~~~~ c uint32_t dotprod_struct(vec_t *x, vec_t *y) { uint32_t size = MIN(x->size, y->size); uint32_t res = 0; diff --git a/doc/rust-tutorial/rust-tutorial.md b/doc/rust-tutorial/rust-tutorial.md index 865e4ff602..a88c2e9f16 100644 --- a/doc/rust-tutorial/rust-tutorial.md +++ b/doc/rust-tutorial/rust-tutorial.md @@ -72,7 +72,7 @@ study that involves a `cargo`-based project, which will use `cargo-saw-build`. Let's try out `saw-rustc` on a small example file, which we'll name `first-example.rs`: -``` {.rs} +``` rust $include all code/first-example.rs ``` @@ -170,7 +170,7 @@ The `id_u8` function above is likely not how most Rust programmers would define the identity function. Instead, it would seem more natural to define it generically, that is, by parameterizing the function by a type parameter: -``` {.rs} +``` rust $include all code/generics-take-1.rs ``` @@ -202,7 +202,7 @@ In order to verify a function using generics in your Rust code, you must provide a separate, monomorphic function that calls into the generic function. For example, you can rewrite the example above like so: -``` {.rs} +``` rust $include all code/generics-take-2.rs ``` @@ -333,7 +333,7 @@ suitable for SAW. Let's put our skills to the test and verify something! We will build on the example from above, which we will put into a file named `saw-basics.rs`: -``` {.rs} +``` rust $include all code/saw-basics.rs ``` @@ -450,7 +450,7 @@ not always so clear. For example, consider this function, which multiplies a number by two: -``` {.rs} +``` rust $include 1-3 code/times-two.rs ``` @@ -569,7 +569,7 @@ our earlier `{{ 2 * x }}` example works, as `x` is of type `Term`. As a sanity check, let's write a naïve version of `times_two` that explicitly returns `2 * x`: -``` {.rs} +``` rust $include 5-7 code/times-two.rs ``` @@ -711,7 +711,7 @@ such as `u8` and `u32`. While these are useful, Rust's type system features much more than just integers. A key part of Rust's type system are its reference types. For example, in this `read_ref` function: -``` {.rs} +``` rust $include 1-3 code/ref-basics.rs ``` @@ -803,7 +803,7 @@ the function is not allowed to modify the memory that the argument points to. Rust also features mutable references that do permit modifying the underlying memory, as seen in this `swap` function: -``` {.rs} +``` rust $include 5-11 code/ref-basics.rs ``` @@ -839,7 +839,7 @@ Rust includes array types where the length of the array is known ahead of time. For instance, this `index` function takes an `arr` argument that must contain exactly three `u32` values: -``` {.rs} +``` rust $include 1-3 code/arrays.rs ``` @@ -920,7 +920,7 @@ and combining them with `mir_array_value`. There are some situations where `mir_array_value` is the only viable choice, however. Consider this variant of the `index` function: -``` {.rs} +``` rust $include 5-7 code/arrays.rs ``` @@ -936,7 +936,7 @@ verifying a spec for `index_ref_arr`). Rust includes tuple types where the elements of the tuple can be of different types. For example: -``` {.rs} +``` rust $include 1-3 code/tuples.rs ``` @@ -965,7 +965,7 @@ arrays. Rust supports the ability for users to define custom struct types. Structs are uniquely identified by their names, so if you have two structs like these: -``` {.rs} +``` rust $include 1-2 code/structs.rs ``` @@ -1013,7 +1013,7 @@ We pass an empty list of `MIRType`s to each use of `mir_find_adt`, as neither `S` nor `T` have any type parameters. An example of a struct that does include type parameters can be seen here: -``` {.rs} +``` rust $include 12-12 code/structs.rs ``` @@ -1022,7 +1022,7 @@ the only way that we can make use of the `Foo` struct is by looking up a particular instantiation of `Foo`'s type parameters. If we define a function like this, for example: -``` {.rs} +``` rust $include 14-16 code/structs.rs ``` @@ -1055,7 +1055,7 @@ explicit type annotation. For instance, the expression `27 : [32]` means that Let's now verify a function that takes a struct value as an argument: -``` {.rs} +``` rust $include 18-22 code/structs.rs ``` @@ -1105,7 +1105,7 @@ has a number of different _variants_ that describe the different ways that an enum value can look like. A famous example of a Rust enum is the `Option` type, which is defined by the standard library like so: -``` {.rs} +``` rust enum Option { None, Some(T), @@ -1119,7 +1119,7 @@ motivating example of an enum in this section. First, let's start by defining some functions that make use of `Option`'s variants: -``` {.rs} +``` rust $include 1-7 code/enums.rs ``` @@ -1177,7 +1177,7 @@ Just as `mir_fresh_expanded_value` supports creating symbolic structs, example, given this function that accepts an `Option` value as an argument: -``` {.rs} +``` rust $include 9-11 code/enums.rs ``` @@ -1199,7 +1199,7 @@ references (e.g., `&u32`), SAW does not permit allocating a slice directly. Instead, one must take a slice of an existing reference. To better illustrate this distinction, consider this function: -``` {.rs} +``` rust $include 1-3 code/slices.rs ``` @@ -1209,20 +1209,20 @@ many possible ways we can write a spec for this function, as the slice argument may be backed by many different sequences. For example, the slice might be backed by an array whose length is exactly two: -``` {.rs} +``` rust $include 6-8 code/slices.rs ``` We could also make a slice whose length is longer than two: -``` {.rs} +``` rust $include 10-12 code/slices.rs ``` Alternatively, the slice might be a subset of an array whose length is longer than two: -``` {.rs} +``` rust $include 14-16 code/slices.rs ``` @@ -1340,7 +1340,7 @@ callee function and verify its behavior alongside the behavior of the callee function. This is a fine thing to do, but it can be inefficient. For example, consider a function like this: -``` {.rs} +``` rust $include 5-9 code/overrides.rs ``` @@ -1374,7 +1374,7 @@ Let's now try compositional verification in practice. To do so, we will first prove a spec for the `g` function above. For demonstration purposes, we will pick a simplistic implementation of `g`: -``` {.rs} +``` rust $include 1-3 code/overrides.rs ``` @@ -1539,7 +1539,7 @@ mutable reference, it could potentially lead to incorrect proofs. This is the sort of thing that is best explained with an example, so consider these two functions: -``` {.rs} +``` rust $include 1-9 code/overrides-mut.rs ``` @@ -1697,7 +1697,7 @@ There are two kinds of static items in Rust: mutable static items (which have a items are much easier to deal with, so let's start by looking at an example of a program that uses immutable static data: -``` {.rs} +``` rust $include 1-5 code/statics.rs ``` @@ -1742,7 +1742,7 @@ Here is one situation in which you would need to use a _reference_ to a static item (which `mir_static` computes) rather than the _value_ of a static item (which `mir_static_initializer` computes): -``` {.rs} +``` rust $include 7-9 code/statics.rs ``` @@ -1762,7 +1762,7 @@ state that any function can access and modify. They are so tricky, in fact, that Rust does not even allow you to use them unless you surround them in an `unsafe` block: -``` {.rs} +``` rust $include 11-15 code/statics.rs ``` @@ -1825,7 +1825,7 @@ careful in specifying what a mutable static value is at the start of a function. For example, consider a slightly extended version of the earlier Rust code we saw: -``` {.rs} +``` rust $include 11-22 code/statics.rs ``` @@ -1847,7 +1847,7 @@ pitfalls of using mutable references in compositional overrides. Mutable static items are also mutable values that are backed by references, and as such, they are also subject to the same pitfalls. Let's see an example of this: -``` {.rs} +``` rust $include 1-12 code/statics-compositional.rs ``` @@ -1899,7 +1899,7 @@ is in its postconditions. This applies _even if the override does not directly use the mutable static items_. For example, if we had declared a second mutable static item alongside `A`: -``` {.rs} +``` rust static mut A: u32 = 42; static mut B: u32 = 27; ``` @@ -2007,7 +2007,7 @@ interesting code lives in [`src/core.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/core.rs). At the top of this file, we have the `Core` struct: -``` {.rs} +``` rust $include 8-14 code/salsa20/src/core.rs ``` @@ -2016,7 +2016,7 @@ Let's walk through this: * The `state` field is an array that is `STATE_WORDS` elements long, where `STATE_WORDS` is a commonly used alias for `16`: - ``` {.rs} + ``` rust $include 88-89 code/salsa20/src/lib.rs ``` @@ -2030,7 +2030,7 @@ Let's walk through this: The reason that `Core` needs a `PhantomData` field is because `R` implements the `Rounds` trait: -``` {.rs} +``` rust $include 1-5 code/salsa20/src/rounds.rs ``` @@ -2038,14 +2038,14 @@ A core operation in Salsa20 is hashing its input through a series of _rounds_. The `COUNT` constant indicates how many rounds should be performed. The Salsa20 spec assumes 20 rounds: -``` {.rs} +``` rust $include 23-29 code/salsa20/src/rounds.rs ``` However, there are also reduced-round variants that perform 8 and 12 rounds, respectively: -``` {.rs} +``` rust $include 7-21 code/salsa20/src/rounds.rs ``` @@ -2055,7 +2055,7 @@ cipher. Here is the typical use case for a `Core` value: * A `Core` value is created using the `new` function: - ``` {.rs} + ``` rust $include 18-18 code/salsa20/src/core.rs ``` @@ -2066,10 +2066,10 @@ cipher. Here is the typical use case for a `Core` value: * After creating a `Core` value, the `counter_setup` and `rounds` functions are used to produce the Salsa20 keystream: - ``` {.rs} + ``` rust $include 83-83 code/salsa20/src/core.rs ``` - ``` {.rs} + ``` rust $include 90-90 code/salsa20/src/core.rs ``` @@ -2079,7 +2079,7 @@ cipher. Here is the typical use case for a `Core` value: newly created `Core` value, produces its keystream, and applies it to a message to produce the `output`: - ``` {.rs} + ``` rust $include 68-68 code/salsa20/src/core.rs ``` @@ -2170,7 +2170,7 @@ the problem into smaller pieces that are easier to understand in isolation. If we look at the implementation of `apply_keystream`, we see that it invokes the `round` function, which in turn invokes the `quarter_round` function: -``` {.rs} +``` rust $include 122-142 code/salsa20/src/core.rs ``` @@ -2364,7 +2364,7 @@ are not encoding into `quarter_round_spec`'s preconditions. At this point, it can be helpful to observe _how_ the `quarter_round` function is used in practice. The call sites are found in the `rounds` function: -``` {.rs} +``` rust $include 92-102 code/salsa20/src/core.rs ``` @@ -2416,7 +2416,7 @@ Once we are done with the entire proof, we can come back and remove this use of Now that we've warmed up, let's try verifying the `rounds` function, which is where `quarter_round` is invoked. Here is the full definition of `rounds`: -``` {.rs} +``` rust $include 90-108 code/salsa20/src/core.rs ``` @@ -2621,7 +2621,7 @@ Before we do, however, there is one more function that `apply_keystream` calls, which we ought to verify first: `counter_setup`. Thankfully, the implementation of `counter_setup` is short and sweet: -``` {.rs} +``` rust $include 83-86 code/salsa20/src/core.rs ``` @@ -2694,7 +2694,7 @@ will become apparent later why this needed to be done. It's time. Now that we've verified `rounds` and `counter_setup`, it's time to tackle the topmost function in the call stack: `apply_keystream`: -``` {.rs} +``` rust $include 68-80 code/salsa20/src/core.rs ``` @@ -2706,13 +2706,13 @@ quite a bit going on. Let's walk through `apply_keystream` in more detail: length. That being said, the first line of `apply_keystream`'s implementation checks that `output`'s length is equal to `BLOCK_SIZE`: - ``` {.rs} + ``` rust $include 69-69 code/salsa20/src/core.rs ``` Where `BLOCK_SIZE` is defined here: - ``` {.rs} + ``` rust $include 82-83 code/salsa20/src/lib.rs ``` @@ -2817,7 +2817,7 @@ internal state that is used to compute the keystream to apply when hashing. In order to use this internal state, however, we must first initialize it. The `new` function that is responsible for this initialization: -``` {.rs} +``` rust $include 17-20 code/salsa20/src/core.rs ``` @@ -2838,7 +2838,7 @@ All that being said, we probably to verify `new_raw` (a lower-level helper function) rather than `new` itself. This is because the definitions of `Key` and `Nonce` are somewhat involved. For instance, `Key` is defined as: -``` {.rs} +``` rust $include 27-27 code/salsa20/src/salsa.rs ``` @@ -2847,7 +2847,7 @@ is a somewhat complicated abstraction. Luckily, we don't really _need_ to deal with it, since `new_raw` deals with simple array references rather than `GenericArray`s: -``` {.rs} +``` rust $include 22-23 code/salsa20/src/core.rs ``` @@ -2858,7 +2858,7 @@ elements of the array are populated with `key`, some parts are populated with `iv` (i.e., the nonce), and other parts are populated with an array named `CONSTANTS`: -``` {.rs} +``` rust $include 91-92 code/salsa20/src/lib.rs ``` @@ -2925,7 +2925,7 @@ the remaining 8 elements from? The answer to this question can be found by looking at the implementation of `new_raw` more closely. Let's start at this code: -``` {.rs} +``` rust $include 35-36 code/salsa20/src/core.rs ``` @@ -2933,7 +2933,7 @@ This will chunk up `iv` (the nonce) into two 4-byte chunks and copies them over to the elements of `state` array at indices `6` and `7`. This is immediately followed by two updates at indices `8` and `9`, which are updated to be `0`: -``` {.rs} +``` rust $include 39-40 code/salsa20/src/core.rs ``` @@ -2968,7 +2968,7 @@ type `[u32; 16]`. These types are very close, as they both contain the same number of bytes, but they are chunked up differently. Recall the code that copies the nonce value over to `self.state`: -``` {.rs} +``` rust $include 35-36 code/salsa20/src/core.rs ``` diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md index 80ab805ae9..bbd28f1ead 100644 --- a/doc/tutorial/tutorial.md +++ b/doc/tutorial/tutorial.md @@ -43,7 +43,7 @@ shift the mask to the left. Then we can use a bitwise "and" operation to test the bit at the index indicated by the index variable. The following C code (which is also in the `ffs.c` file on GitHub) uses this approach. -``` {.c} +``` c $include 9-17 code/ffs.c ``` @@ -61,7 +61,7 @@ An alternative implementation, taken by the following function (also in `ffs.c`), treats the bits of the input word in chunks, allowing sequences of zero bits to be skipped over more quickly. -``` {.c} +``` c $include 19-26 code/ffs.c ``` @@ -69,7 +69,7 @@ Another optimized version, in the following rather mysterious program (also in `ffs.c`), based on the `ffs` implementation in [musl libc](http://musl.libc.org/). -``` {.c} +``` c $include 69-76 code/ffs.c ``` @@ -82,7 +82,7 @@ possible input (also in `ffs.c`). Although contrived, this program represents a case where traditional testing -- as opposed to verification -- is unlikely to be helpful. -``` {.c} +``` c $include 43-47 code/ffs.c ``` @@ -200,14 +200,14 @@ to the C version. The reference version (in `FFS.java`) uses a loop, like the C version: -``` {.java} +``` java $include 2-10 code/FFS.java ``` And the efficient implementation uses a fixed sequence of masking and shifting operations: -``` {.java} +``` java $include 12-19 code/FFS.java ``` @@ -269,7 +269,7 @@ SMT solver. Consider the following C file: -``` {.c} +``` c $include all code/double.c ``` @@ -350,7 +350,7 @@ Compositional Imperative Proofs As a simple example of compositional reasoning on imperative programs, consider the following Java code. -``` {.java} +``` java $include all code/Add.java ``` From ea27d8975151ea5e036a01af1311fa46f1101e7f Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 24 Jan 2025 22:24:34 -0800 Subject: [PATCH 06/67] rust-tutorial: Subtract 1 from all headings after the first. This temporarily makes this Markdown violate the "thou shalt only have one

" rule, however: Logically, we want this part of the SAW documentation to be split into chapters, similar to the LLVM/Java tutorial. Before, this part of the documentation rendered to PDF (via Sphinx) as one giant chapter. --- doc/rust-tutorial/rust-tutorial.md | 84 +++++++++++++++--------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/doc/rust-tutorial/rust-tutorial.md b/doc/rust-tutorial/rust-tutorial.md index a88c2e9f16..845fd4ffcb 100644 --- a/doc/rust-tutorial/rust-tutorial.md +++ b/doc/rust-tutorial/rust-tutorial.md @@ -23,7 +23,7 @@ the [`stream-ciphers`](https://github.com/RustCrypto/stream-ciphers) Rust project. The code for this case study is also available [on GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20). -## Prerequisites +# Prerequisites In order to run the examples in this tutorial, you will need to install the following prerequisite tools: @@ -36,7 +36,7 @@ following prerequisite tools: * The `mir-json` tool, which can be installed by following the instructions [here](https://github.com/GaloisInc/mir-json#installation-instructions). -## About `mir-json` +# About `mir-json` We are interested in verifying code written in Rust, but Rust is an extremely rich programming language that has many distinct language features. To make the @@ -67,7 +67,7 @@ Most of the examples in this tutorial involve self-contained examples, which will use `saw-rustc`. Later in the tutorial, we will examine a Salsa20 case study that involves a `cargo`-based project, which will use `cargo-saw-build`. -### A first example with `saw-rustc` +## A first example with `saw-rustc` Let's try out `saw-rustc` on a small example file, which we'll name `first-example.rs`: @@ -107,7 +107,7 @@ important to understand everything that is going on there. This is machine-generated JSON, and as such, it is not meant to be particularly readable by human eyes. -### The `SAW_RUST_LIBRARY_PATH` environment variable +## The `SAW_RUST_LIBRARY_PATH` environment variable Rust has a large set of standard libraries that ship with the compiler, and parts of the standard library are quite low-level and tricky. SAW's primary @@ -164,7 +164,7 @@ will greatly simplify the steps above. Either way, you will need to set the `SAW_RUST_LIBRARY_PATH` environment variable to point to the location of the custom libraries. -### A note about generics +## A note about generics The `id_u8` function above is likely not how most Rust programmers would define the identity function. Instead, it would seem more natural to define it @@ -255,7 +255,7 @@ verifying both types of functions, however. (We will see an example of verifying an autogenerated function in the Salsa20 case study later in this tutorial.) -### Identifiers +## Identifiers When you compile a function named `id_u8`, `saw-rustc` will expand it to a much longer name such as `first_example/abef32c5::id_u8`. This longer name is called @@ -324,9 +324,9 @@ We will adopt the latter, shorter notation throughout the rest of the tutorial. SAW also understands this shorthand, so we will also use this notation when passing identifiers to SAW commands. -## SAW basics +# SAW basics -### A first SAW example +## A first SAW example We now have the knowledge necessary to compile Rust code in a way that is suitable for SAW. Let's put our skills to the test and verify something! We will @@ -440,7 +440,7 @@ $ saw saw-basics.saw Tada! SAW was successfully able to prove that `id_u8` adheres to its spec. -### Cryptol +## Cryptol The spec in the previous section is nice and simple. It's also not very interesting, as it's fairly obvious at a glance that `id_u8`'s implementation @@ -508,7 +508,7 @@ Nice! Even though the `times_two` function does not literally return `2 * x`, SAW is able to confirm that the function behaves as if it were implemented that way. -### `Term`s and other types +## `Term`s and other types Now that we know how Cryptol can be used within SAW, we can go back and explain what the `mir_term` function does. It is helpful to examine the type of @@ -564,7 +564,7 @@ Values of type `Term` have the property that they can be embedded into Cryptol expression that are enclosed in double curly braces `{{ ... }}`. This is why our earlier `{{ 2 * x }}` example works, as `x` is of type `Term`. -### Preconditions and postconditions +## Preconditions and postconditions As a sanity check, let's write a naïve version of `times_two` that explicitly returns `2 * x`: @@ -704,7 +704,7 @@ $include 43-50 code/times-two.saw The choice of whether to use `mir_precond`/`mir_postcond` versus `mir_assert` is mostly a matter personal taste. -## Reference types +# Reference types All of the examples we have seen up to this point involve simple integer types such as `u8` and `u32`. While these are useful, Rust's type system features @@ -827,13 +827,13 @@ There are two interesting things worth calling out in this spec: the fact that the `swap` function itself swaps the values that the references point to. -## Compound data types +# Compound data types Besides integer types and reference types, Rust also features a variety of other interesting data types. This part of the tutorial will briefly go over some of these data types and how to interface with them in SAW. -### Array types +## Array types Rust includes array types where the length of the array is known ahead of time. For instance, this `index` function takes an `arr` argument that must contain @@ -931,7 +931,7 @@ allocate the elements of `arr` using separate calls to `mir_alloc` and then build up the array using `mir_array_value`. (As an exercise, try writing and verifying a spec for `index_ref_arr`). -### Tuple types +## Tuple types Rust includes tuple types where the elements of the tuple can be of different types. For example: @@ -960,7 +960,7 @@ sawscript> :type mir_tuple_value `mir_tuple_value` plays a similar role for tuples as `mir_array_value` does for arrays. -### Struct types +## Struct types Rust supports the ability for users to define custom struct types. Structs are uniquely identified by their names, so if you have two structs like these: @@ -1051,7 +1051,7 @@ disambiguate which type they should be, we give each numeric literal an explicit type annotation. For instance, the expression `27 : [32]` means that `27` should be a 32-bit integer. -#### Symbolic structs +### Symbolic structs Let's now verify a function that takes a struct value as an argument: @@ -1098,7 +1098,7 @@ refer to these inner values in the postconditions of a spec. As a result, there are some functions for which `mir_fresh_expanded_value` isn't suitable, so keep this in mind before reaching for it. -### Enum types +## Enum types Besides structs, another form of ADT that Rust supports are enums. Each enum has a number of different _variants_ that describe the different ways that an @@ -1165,7 +1165,7 @@ variant: $include 18-25 code/enums.saw ``` -#### Symbolic enums +### Symbolic enums In order to create a symbolic struct, one could create symbolic fields and pack them into a larger struct value using `mir_struct_value`. The same process is @@ -1191,7 +1191,7 @@ $include 27-33 code/enums.saw Here, `o` can be a `None` value, or it can be a `Some` value with a symbolic field. -### Slices +## Slices Slices are a particular type of reference that allow referencing contiguous sequences of elements in a collection, such as an array. Unlike ordinary @@ -1294,7 +1294,7 @@ Note that both `Int` arguments to `mir_slice_range_value` must be concrete (i.e., not symbolic). (See the section below if you want an explanation for why they are not allowed to be symbolic.) -#### Aside: slices of arbitrary length +### Aside: slices of arbitrary length After reading the section about slices above, one might reasonably wonder: is there a way to write a more general spec for `sum_of_prefix`: that covers all @@ -1331,7 +1331,7 @@ In general, SAW cannot prevent users from writing programs whose length is bounded by a symbolic value. For now, however, SAW removes one potential footgun by requiring that slice values always have a concrete length. -## Overrides and compositional verification +# Overrides and compositional verification Up until this point, all uses of `mir_verify` in this tutorial have provided an empty list (`[]`) of overrides. This means that any time SAW has simulated a @@ -1527,7 +1527,7 @@ Proof failed. Here, we can see that `No override specification applies`, and SAW also generates a counterexample of `x: 1`. Sure enough, `1` is an odd number! -### Overrides and mutable references +## Overrides and mutable references Compositional overrides provide great power, as they effectively allow you to skip over certain functions when simulating them and replace them with simpler @@ -1634,7 +1634,7 @@ $include 15-21 code/overrides-mut.saw And now the compositional proof of `foo_spec` works! -### Unsafe overrides +## Unsafe overrides Now that we've made it this far into the tutorial, it's time to teach you a more advanced technique: _unsafe_ overrides. Up until this point, we have @@ -1682,7 +1682,7 @@ It should be emphasized that when we say "`unsafe`", we really mean it. `mir_unsafe_assume_spec` can be used to prove specs that are blatantly wrong, so use it with caution. -## Static items +# Static items Sometimes, Rust code makes use of [_static items_](https://doc.rust-lang.org/reference/items/static-items.html), which are @@ -1690,7 +1690,7 @@ definitions that are defined in a precise memory location for the entire duration of the program. As such, static items can be thought of as a form of global variables. -### Immutable static items +## Immutable static items There are two kinds of static items in Rust: mutable static items (which have a `mut` keyword) and immutable static items (which lack `mut`). Immutable static @@ -1754,7 +1754,7 @@ $include 23-27 code/statics.saw That's about all there is to say regarding immutable static items. -### Mutable static items +## Mutable static items Mutable static items are a particularly tricky aspect of Rust. Including a mutable static item in your program is tantamount to having mutable global @@ -1840,7 +1840,7 @@ danger of using mutable static items, as they can be modified at any time by any function. For this reason, SAW requires you to be explicit about what the initial values of mutable static items should be. -#### Mutable static items and compositional overrides +### Mutable static items and compositional overrides In the "Overrides and mutable references" section, we discussed the potential pitfalls of using mutable references in compositional overrides. Mutable static @@ -1909,7 +1909,7 @@ involving `B` to satisfy this requirement. This requirement is somewhat heavy-handed, but it is necessary in general to avoid unsoundness. Think carefully before you use mutable static items! -## Case study: Salsa20 +# Case study: Salsa20 If you've made it this far into the tutorial, congrats! You've now been exposed to all of the SAW fundamentals that you need to verify Rust code found in the @@ -1931,7 +1931,7 @@ Salsa20 and how to recover from these mistakes. Later, if you encounter similar issues when verifying your own code with SAW, the experience you have developed when developing these proofs can inform you of possible ways to fix the issues. -### The `salsa20` crate +## The `salsa20` crate The code for this Salsa20 implementation we will be verifying can be found under the @@ -1953,7 +1953,7 @@ files. You can take a look at these files if you'd like, but you don't need to understand everything in them just yet. We will introduce the relevant parts of the code in the tutorial as they come up. -### Salsa20 preliminaries +## Salsa20 preliminaries Salsa20 is a stream cipher, which is a cryptographic technique for encrypting and decrypting messages. A stream cipher encrypts a message by combining it @@ -1987,7 +1987,7 @@ pseudocode shown in the Salsa20 spec, as it is somewhat more low-level. SAW's role is to provide us assurance that the behavior of the low-level Rust code and the high-level Cryptol code coincide. -### A note about cryptographic security +## A note about cryptographic security As noted in the previous section, our goal is to prove that the behavior of `salsa20` functions is functionally correct. This property should _not_ be @@ -1999,7 +1999,7 @@ a full security audit (and indeed, the [`salsa20` `README`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/README.md) states that the crate has never received such an audit). -### An overview of the `salsa20` code +## An overview of the `salsa20` code Before diving into proofs, it will be helpful to have a basic understanding of the functions and data types used in the `salsa20` crate. Most of the @@ -2086,7 +2086,7 @@ cipher. Here is the typical use case for a `Core` value: Our ultimate goal is to verify the `apply_keystream` function, which is the Rust equivalent of the Salsa20 encryption function described in the spec. -### Building `salsa20` +## Building `salsa20` The next step is to build the `salsa20` crate. Unlike the examples we have seen up to this point, which have been self-contained Rust files, `salsa20` is a @@ -2125,7 +2125,7 @@ file as In a pinch, you can extract this archive to obtain a copy of the MIR JSON file, which is approximately 4.6 megabytes when uncompressed. -### Getting started with SAW +## Getting started with SAW Now that we've built the `salsa20` crate, it's time to start writing some proofs! Let's start a new `code/salsa20/salsa20.saw` file as fill it in with @@ -2153,7 +2153,7 @@ for now, since following along with the tutorial is meant to illustrate the become stuck while following along and absolutely need a hint, however, then this file can help you become unstuck. -### Verifying our first `salsa20` function +## Verifying our first `salsa20` function Now it's time to start verifying some `salsa20` code. But where do we start? It's tempting to start with `apply_keystream`, which is our end goal. This is @@ -2411,7 +2411,7 @@ $include 40-44 code/salsa20/salsa20-reference.saw Once we are done with the entire proof, we can come back and remove this use of `mir_unsafe_assume_spec`, as we're only using it as a time-saving measure. -### Verifying the `rounds` function +## Verifying the `rounds` function Now that we've warmed up, let's try verifying the `rounds` function, which is where `quarter_round` is invoked. Here is the full definition of `rounds`: @@ -2614,7 +2614,7 @@ $include 71-72 code/salsa20/salsa20-rounds-take-3.saw The only things that we had to change were the identifier and the argument to `rounds_spec`. Not bad! -### Verifying the `counter_setup` function +## Verifying the `counter_setup` function We're very nearly at the point of being able to verify `apply_keystream`. Before we do, however, there is one more function that `apply_keystream` calls, @@ -2689,7 +2689,7 @@ That wasn't so bad. It's a bit unsatisfying that we had to resort to writing a Cryptol function not found in `Salsa20.cry`, but go along with this for now—it will become apparent later why this needed to be done. -### Verifying the `apply_keystream` function (first attempt) +## Verifying the `apply_keystream` function (first attempt) It's time. Now that we've verified `rounds` and `counter_setup`, it's time to tackle the topmost function in the call stack: `apply_keystream`: @@ -2808,7 +2808,7 @@ the differences in the sorts of arguments that each function takes, as `apply_keystream` doesn't take a key or nonce argument. Time to think for a bit. -### Verifying the `new_raw` function +## Verifying the `new_raw` function At this point, we should ask ourselves: _why_ doesn't `apply_keystream` take a key or nonce argument? The reason lies in the fact that the `salsa20` crate @@ -3009,7 +3009,7 @@ littleendian_state (Salsa20_init(key, nonce # littleendian_inverse counter)) Where `littleendian_inverse` (a sibling of `littleendian_state`) converts a `[64]` value to a `[8][8]` one. This pattern is a curious one... -### Verifying the `apply_keystream` function (second attempt) +## Verifying the `apply_keystream` function (second attempt) Let's now return to the problem of linking `apply_keystream` up to `Salsa20_encrypt`. In particular, let's take a closer look at the definition of @@ -3163,7 +3163,7 @@ went wrong and how to fix it. This is a skill that takes some time to grow, but with enough time and experience, you will be able to recognize common pitfalls. This case study showed off some of these pitfalls, but there are likely others. -## A final word +# A final word Like everything else in the `saw-script` repo, this tutorial is being maintained and developed. If you see something in the tutorial that is wrong, From e050f28784ef68fa3e4f4cb1d90662df42991ee3 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 24 Jan 2025 22:35:20 -0800 Subject: [PATCH 07/67] Normalize the title of the first chapter of each part. Specifically, to 'Introduction'. Consistency is good! --- doc/manual/manual.md | 2 +- doc/rust-tutorial/rust-tutorial.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/manual/manual.md b/doc/manual/manual.md index 54a5a07f50..ba2ed22452 100644 --- a/doc/manual/manual.md +++ b/doc/manual/manual.md @@ -1,4 +1,4 @@ -# Overview +# Introduction The Software Analysis Workbench (SAW) is a tool for constructing mathematical models of the computational behavior of software, diff --git a/doc/rust-tutorial/rust-tutorial.md b/doc/rust-tutorial/rust-tutorial.md index 845fd4ffcb..4bea30c63d 100644 --- a/doc/rust-tutorial/rust-tutorial.md +++ b/doc/rust-tutorial/rust-tutorial.md @@ -1,4 +1,4 @@ -# A tutorial on Rust verification with SAW +# Introduction SAW is a special-purpose programming environment developed by Galois to help orchestrate and track the results of the large collection of proof tools From 0df61567747f0ca225087a39b29fe1d5fd21f652 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 24 Jan 2025 23:58:42 -0800 Subject: [PATCH 08/67] tutorial: Remove PDF (+ generation) and split up tutorial.md. Not in that order :) In an effort to start standardizing the Markdown (e.g. removing multiple top-level headers), this commit primarily restructures the LLVM/Java tutorial into multiple source files. This additionally makes individual parts of the tutorial easier to maintain. A similar change will be implemented for the manual and Rust tutorial for the same reason. This restructuring naturally broke the original PDF generation; fortunately, the eventual introduction of Sphinx will give us both HTML and PDF generation for free, and this generation strategy is no longer necessary to maintain. Note that this commit does _not_ perform any changes to the content of the tutorial or indeed any other structural property of the Markdown. Additional changes (e.g. standardizing the Markdown syntax used) will be the subject of future commits. --- doc/tutorial/.gitignore | 1 - doc/tutorial/Makefile | 69 ---- doc/tutorial/README.md | 4 - doc/tutorial/compositional-proofs.md | 56 +++ doc/tutorial/doc.css | 93 ----- doc/tutorial/example-find-first-set.md | 233 +++++++++++ doc/tutorial/external-sat-solvers.md | 33 ++ doc/tutorial/galois-whitepaper.cls | 143 ------- doc/tutorial/interactive-interpreter.md | 63 +++ doc/tutorial/introduction.md | 22 + doc/tutorial/other-examples.md | 61 +++ doc/tutorial/sawScriptTutorial.bib | 56 --- doc/tutorial/sawScriptTutorial.pdf | Bin 109653 -> 0 bytes doc/tutorial/tutorial-after.tex | 4 - doc/tutorial/tutorial-before.html | 1 - doc/tutorial/tutorial-before.tex | 1 - doc/tutorial/tutorial-head.tex | 60 --- doc/tutorial/tutorial.md | 519 ------------------------ doc/tutorial/using-smt-lib-solvers.md | 43 ++ 19 files changed, 511 insertions(+), 951 deletions(-) delete mode 100644 doc/tutorial/.gitignore delete mode 100644 doc/tutorial/Makefile delete mode 100644 doc/tutorial/README.md create mode 100644 doc/tutorial/compositional-proofs.md delete mode 100644 doc/tutorial/doc.css create mode 100644 doc/tutorial/example-find-first-set.md create mode 100644 doc/tutorial/external-sat-solvers.md delete mode 100644 doc/tutorial/galois-whitepaper.cls create mode 100644 doc/tutorial/interactive-interpreter.md create mode 100644 doc/tutorial/introduction.md create mode 100644 doc/tutorial/other-examples.md delete mode 100644 doc/tutorial/sawScriptTutorial.bib delete mode 100644 doc/tutorial/sawScriptTutorial.pdf delete mode 100644 doc/tutorial/tutorial-after.tex delete mode 100644 doc/tutorial/tutorial-before.html delete mode 100644 doc/tutorial/tutorial-before.tex delete mode 100644 doc/tutorial/tutorial-head.tex delete mode 100644 doc/tutorial/tutorial.md create mode 100644 doc/tutorial/using-smt-lib-solvers.md diff --git a/doc/tutorial/.gitignore b/doc/tutorial/.gitignore deleted file mode 100644 index a9a5aecf42..0000000000 --- a/doc/tutorial/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tmp diff --git a/doc/tutorial/Makefile b/doc/tutorial/Makefile deleted file mode 100644 index dd3fc22139..0000000000 --- a/doc/tutorial/Makefile +++ /dev/null @@ -1,69 +0,0 @@ -TARGET = tmp/sawScriptTutorial -SRCS = ${TARGET}.md ${wildcard *.bib} ${wildcard *.cls} ${wildcard *.sty} -CODE = ${wildcard code/*.c} \ - ${wildcard code/*.cry} \ - ${wildcard code/*.java} \ - ${wildcard code/*.saw} -TARBALL = tmp/saw-tutorial-code.tar.gz -SPELLSRC = ${TARGET}.tex -NEWSPELL = ${TARGET}.SPELLNEW -OLDSPELL = ${TARGET}.SPELLOLD -SPELL = aspell -t -l -AUX = ${wildcard *.blg} ${wildcard *.bbl} ${wildcard *.aux} \ - ${wildcard *.eps} ${wildcard *.log} ${wildcard *.toc} \ - ${TARGET}.md -PDFARGS = -H tutorial-head.tex \ - -B tutorial-before.tex \ - -A tutorial-after.tex \ - --toc \ - --listings \ - -V documentclass:galois-whitepaper \ - -V fontsize:12 \ - --pdf-engine=xelatex -HTMLARGS = --css doc.css \ - -B tutorial-before.html \ - --toc \ - --standalone \ - --metadata title="SAWScript Tutorial" \ - --self-contained - -all: ${TARGET}.pdf ${TARGET}.html ${TARBALL} - -${TARGET}.pdf: ${SRCS} Makefile | tmp - pandoc ${PDFARGS} -o $@ ${TARGET}.md - -${TARGET}.html: ${SRCS} Makefile | tmp - pandoc ${HTMLARGS} -o $@ ${TARGET}.md - -${TARBALL}: ${CODE} - tar czf ${TARBALL} code - -# Pre-processing step. Right now, does nothing. -${TARGET}.md: tutorial.md docode.hs ${CODE} | tmp - runhaskell docode.hs < $< > $@ - -docode: ${TARGET}.md | tmp - -.PHONY: spellClean superClean clean quickSpell - -#run: -# sawScript ${TARGET}.tex -c ../../Examples/ECC/build -j ../../jdk1.6/classes.jar - -tmp: - mkdir -p tmp - -clean: - -rm -f ${AUX} - -superClean: clean - -rm -f ${TARGET}.pdf ${TARGET}.html ${TARGET}.md tmp - -spellClean: - rm -f ${NEWSPELL} ${OLDSPELL} - -quickSpell: - @touch ${NEWSPELL} - @mv -f ${NEWSPELL} ${OLDSPELL} - @cat ${SPELLSRC} | ${SPELL} | tr "A-Z" "a-z" | sort | uniq | less > ${NEWSPELL} - @echo '(The ones marked with < are new.)' - @diff ${NEWSPELL} ${OLDSPELL} diff --git a/doc/tutorial/README.md b/doc/tutorial/README.md deleted file mode 100644 index a6f348e7fe..0000000000 --- a/doc/tutorial/README.md +++ /dev/null @@ -1,4 +0,0 @@ -To update the tutorial, edit `tutorial.md` and then run `make`. The -output is generated in `./tmp`. If you want to version a new copy of -the tutorial, copy `./tmp/sawScriptTutorial.pdf` to -`./sawScriptTutorial.pdf` and commit. diff --git a/doc/tutorial/compositional-proofs.md b/doc/tutorial/compositional-proofs.md new file mode 100644 index 0000000000..180a082276 --- /dev/null +++ b/doc/tutorial/compositional-proofs.md @@ -0,0 +1,56 @@ +Compositional Proofs +==================== + +The examples shown so far treat programs as monolithic entities. A +Java method or C function, along with all of its callees, is +translated into a single mathematical model. SAWScript also has +support for more compositional proofs, as well as proofs about +functions that use heap data structures. + +Compositional Imperative Proofs +------------------------------- + +As a simple example of compositional reasoning on imperative programs, +consider the following Java code. + +``` java +$include all code/Add.java +``` + +Here, the `add` function computes the sum of its arguments. The `dbl` +function then calls `add` to double its argument. While it would be easy +to prove that `dbl` doubles its argument by following the call to `add`, +it's also possible in SAWScript to prove something about `add` first, +and then use the results of that proof in the proof of `dbl`, as in the +following SAWScript code (`java_add.saw` on GitHub). + +\newpage + +```` +$include all code/java_add.saw +```` + +This can be run as follows: + + > saw -b java_add.saw + +In this example, the definitions of `add_spec` and `dbl_spec` provide +extra information about how to configure the symbolic simulator when +analyzing Java code. In this case, the setup blocks provide explicit +descriptions of the implicit configuration used by +`jvm_extract` (used in the earlier Java FFS example and in the +next section). The `jvm_fresh_var` commands instruct the simulator to +create fresh symbolic inputs to correspond to the Java variables `x` and +`y`. Then, the `jvm_return` commands indicate the expected return value +of the each method, in terms of existing models (which can be written +inline). Because Java methods can operate on references, as well, which +do not exist in Cryptol, Cryptol expressions must be translated to JVM +values with `jvm_term`. + +To make use of these setup blocks, the `jvm_verify` command analyzes +the method corresponding to the class and method name provided, using +the setup block passed in as a parameter. It then returns an object +that describes the proof it has just performed. This object can be +passed into later instances of `jvm_verify` to indicate that calls to +the analyzed method do not need to be followed, and the previous proof +about that method can be used instead of re-analyzing it. diff --git a/doc/tutorial/doc.css b/doc/tutorial/doc.css deleted file mode 100644 index 08327aa2df..0000000000 --- a/doc/tutorial/doc.css +++ /dev/null @@ -1,93 +0,0 @@ -body { - font-size: 14px; - line-height: 21px; - color: #333; - font-family: "Helvetica Neue", "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, sans-serif !important; -} -.container { - width: 950px; - margin: 0; - padding: 80px 0px 50px 50px; -} -p, li { - width: 625px; -} -a { - color: #191933; -} -h1, h2, h3, h4, h5, h6, b.header { - color: #000; - margin-top: 40px; - margin-bottom: 15px; - text-shadow: #fff 0 1px 1px; -} -h1 { font-size: 18px } -h2 { font-size: 16px } -h3, h4, h5, h6 { font-size: 14px } -.author { font-weight: normal } - -br.clear { - height: 0; - clear: both; -} -ul { - padding-left: 20px; -} -b.header { - display: block; -} -li { - margin-bottom: 10px; -} -code, pre, tt, textarea { - font-family: Monaco, Consolas, "Lucida Console", monospace; - font-size: 12px; - line-height: 18px; - color: #155; - white-space: pre-wrap; - word-wrap: break-word; -} - tt { - display: inline-block; - background: #fff; - border: 1px solid #dedede; - padding: 0px 0.2em; - } - pre { - border-left: 5px solid rgba(0,0,0,0.2); - padding: 3px 0 3px 12px; - font-size: 12px; - } - pre.no_bar { - border-left: 0; - margin-left: 0; - padding-left: 0; - } -div.code { - position: relative; - background: #fff; - border: 1px solid #d8d8d8; - -webkit-box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - -moz-box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - zoom: 1; -} - div.code { - text-transform: none; - position: absolute; - right: 8px; bottom: 8px; - } - div.code { - left: 8px; right: auto; - } - div.code pre, div.code textarea { - float: left; - width: 450px; - background: #fff; - border-left: 1px dotted #d0d0d0; - margin: 10px 0 15px 3px; - padding: 0 0 0 12px; - } - div.code pre:first-child { - border-left: 0; - } diff --git a/doc/tutorial/example-find-first-set.md b/doc/tutorial/example-find-first-set.md new file mode 100644 index 0000000000..183a1c27d6 --- /dev/null +++ b/doc/tutorial/example-find-first-set.md @@ -0,0 +1,233 @@ +Example: Find First Set +======================= + +As a first example, we consider showing the equivalence of several quite +different implementations of the POSIX `ffs` function, which identifies +the position of the first ``1`` bit in a word. The function takes an +integer as input, treated as a vector of bits, and returns another +integer which indicates the index of the first bit set (zero being the +least significant). This function can be implemented in several ways +with different performance and code clarity tradeoffs, and we would like +to show those different implementations are equivalent. + +Reference Implementation +------------------------- + +One simple implementation takes the form of a loop with an index +initialized to zero, and a mask initialized to have the least +significant bit set. On each iteration, we increment the index, and +shift the mask to the left. Then we can use a bitwise "and" operation to +test the bit at the index indicated by the index variable. The following +C code (which is also in the `ffs.c` file on GitHub) uses this approach. + +``` c +$include 9-17 code/ffs.c +``` + +This implementation is relatively straightforward, and a proficient C +programmer would probably have little difficulty believing its +correctness. However, the number of branches taken during execution +could be as many as 32, depending on the input value. It's possible to +implement the same algorithm with significantly fewer branches, and no +backward branches. + +Alternative Implementations +--------------------------- + +An alternative implementation, taken by the following function (also in +`ffs.c`), treats the bits of the input word in chunks, allowing +sequences of zero bits to be skipped over more quickly. + +``` c +$include 19-26 code/ffs.c +``` + +Another optimized version, in the following rather mysterious program +(also in `ffs.c`), based on the `ffs` implementation in [musl +libc](http://musl.libc.org/). + +``` c +$include 69-76 code/ffs.c +``` + +These optimized versions are much less obvious than the reference +implementation. They might be faster, but how do we gain confidence +that they calculate the same results as the reference implementation? + +Finally, consider a buggy implementation which is correct on all but one +possible input (also in `ffs.c`). Although contrived, this program +represents a case where traditional testing -- as opposed to +verification -- is unlikely to be helpful. + +``` c +$include 43-47 code/ffs.c +``` + +SAWScript allows us to state these problems concisely, and to quickly +and automatically 1) prove the equivalence of the reference and +optimized implementations on all possible inputs, and 2) find an input +exhibiting the bug in the third version. + +Generating LLVM Code +-------------------- + +SAW can analyze LLVM code, but most programs are originally written in a +higher-level language such as C, as in our example. Therefore, the C +code must be translated to LLVM, using something like the following +command: + + > clang -g -c -emit-llvm -o ffs.bc ffs.c + +The `-g` flag instructs `clang` to include debugging information, which +is useful in SAW to refer to variables and struct fields using the same +names as in C. We have tested SAW successfully with versions of `clang` +from 3.6 to 7.0. Please report it as a bug [on +GitHub](https://github.com/GaloisInc/saw-script/issues) if SAW fails to +parse any LLVM bitcode file. + +This command, and following command examples in this tutorial, can be +run from the `code` directory [on +GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/tutorial/code). +A `Makefile` also exists in that directory, providing quick shortcuts +for tasks like this. For instance, we can get the same effect as the +previous command by running: + + > make ffs.bc + +\newpage + +Equivalence Proof +----------------- + +We now show how to use SAWScript to prove the equivalence of the +reference and implementation versions of the FFS algorithm, and +exhibit the bug in the buggy implementation. + +A SAWScript program is typically structured as a sequence of commands, +potentially along with definitions of functions that abstract over +commonly-used combinations of commands. + +The following script (in `ffs_llvm.saw`) is sufficient to automatically +prove the equivalence of `ffs_ref` with `ffs_imp` and `ffs_musl`, and +identify the bug in `ffs_bug`. + +``` +$include all code/ffs_llvm.saw +``` + +In this script, the `print` commands simply display text for the user. +The `llvm_extract` command instructs the SAWScript interpreter +to perform symbolic simulation of the given C function (e.g., `ffs_ref`) +from a given bitcode file (e.g., `ffs.bc`), and return a term +representing the semantics of the function. + +The `let` statement then constructs a new term corresponding to the +assertion of equality between two existing terms. Arbitrary +Cryptol expressions can be embedded within SAWScript; to distinguish +Cryptol code from SAWScript commands, the Cryptol code is placed +within double brackets `{{` and `}}`. + +The `prove` command can verify the validity of such an assertion, or +produce a counter-example that invalidates it. The `abc` parameter +indicates what theorem prover to use; SAWScript offers support for many +other SAT and SMT solvers as well as user definable simplification +tactics. + +Similarly, the `sat` command works in the opposite direction to `prove`. +It attempts to find a value for which the given assertion is true, and +fails if there is no such value. + +If the `saw` executable is in your PATH, you can run the script above with + + > saw ffs_llvm.saw + +producing the output + +``` +Loading file "ffs_llvm.saw" +Extracting reference term: ffs_ref +Extracting implementation term: ffs_imp +Extracting implementation term: ffs_musl +Extracting buggy term: ffs_bug +Proving equivalence: ffs_ref == ffs_imp +Valid +Proving equivalence: ffs_ref == ffs_musl +Valid +Finding bug via sat search: ffs_ref != ffs_bug +Sat: [x = 0x101010] +Finding bug via failed proof: ffs_ref == ffs_bug +prove: 1 unsolved subgoal(s) +Invalid: [x = 0x101010] +Done. +``` + +Note that both explicitly searching for an input exhibiting the bug +(with `sat`) and attempting to prove the false equivalence (with +`prove`) exhibit the bug. Symmetrically, we could use `sat` to prove the +equivalence of `ffs_ref` and `ffs_imp`, by checking that the +corresponding disequality is unsatisfiable. Indeed, this exactly what +happens behind the scenes: `prove abc ` is essentially `not (sat +abc (not ))`. + +Cross-Language Proofs +--------------------- + +We can implement the FFS algorithm in Java with code almost identical +to the C version. + +The reference version (in `FFS.java`) uses a loop, like the C version: + +``` java +$include 2-10 code/FFS.java +``` + +And the efficient implementation uses a fixed sequence of masking and +shifting operations: + +``` java +$include 12-19 code/FFS.java +``` + +Although in this case we can look at the C and Java code and see that +they perform almost identical operations, the low-level operators +available in C and Java do differ somewhat. Therefore, it would be +nice to be able to gain confidence that they do, indeed, perform the +same operation. + +We can do this with a process very similar to that used to compare the +reference and implementation versions of the algorithm in a single +language. + +First, we compile the Java code to a JVM class file. + + > javac -g FFS.java + +Like with `clang`, the `-g` flag instructs `javac` to include debugging +information, which can be useful to preserve variable names. + +Using `saw` with Java code requires a command-line option `-b` that +locates Java. Run the code in this section with the command: + + > saw -b ffs_compare.saw + +Alternatively, if Java is located on your `PATH`, you can omit the `-b` +option entirely. + +Both Oracle JDK and OpenJDK versions 6 through 8 work well with SAW. +SAW also includes experimental support for JDK 9 and later. Code that only +involves primitive data types (such as `FFS.java` above) is known to work well +under JDK 9+, but there are some as-of-yet unresolved issues in verifying code +involving classes such as `String`. For more information on these issues, refer +to [this GitHub issue](https://github.com/GaloisInc/crucible/issues/641). + +Now we can do the proof both within and across languages (from +`ffs_compare.saw`): + +``` +$include all code/ffs_compare.saw +``` + +Here, the `jvm_extract` function works like `llvm_extract`, but on a +Java class and method name. The `prove_print` command works similarly +to the `prove` followed by `print` combination used for the LLVM +example above. diff --git a/doc/tutorial/external-sat-solvers.md b/doc/tutorial/external-sat-solvers.md new file mode 100644 index 0000000000..c7fb1d7dd8 --- /dev/null +++ b/doc/tutorial/external-sat-solvers.md @@ -0,0 +1,33 @@ +External SAT Solvers +==================== + +In addition to the `abc`, `z3`, and `yices` proof tactics used +above, SAWScript can also invoke arbitrary external SAT solvers +that read CNF files and produce results according to the SAT +competition +[input and output conventions](https://jix.github.io/varisat/manual/0.2.0/formats/dimacs.html), +using the `external_cnf_solver` tactic. For example, you can use +[PicoSAT](http://fmv.jku.at/picosat/) to prove the theorem `thm` from +the last example, with the following commands: + + let picosat = external_cnf_solver "picosat" ["%f"]; + prove_print picosat thm; + +The use of `let` is simply a convenient abbreviation. The following +would be equivalent: + + prove_print (external_cnf_solver "picosat" ["%f"]) thm; + +The first argument to `external_cnf_solver` is the name of the +executable. It can be a fully-qualified name, or simply the bare +executable name if it's in your PATH. The second argument is an array +of command-line arguments to the solver. Any occurrence of `%f` is +replaced with the name of the temporary file containing the CNF +representation of the term you're proving. + +The `external_cnf_solver` tactic is based on the same underlying +infrastructure as the `abc` tactic, and is generally capable of +proving the same variety of theorems. + +To write a CNF file without immediately invoking a solver, use the +`offline_cnf` tactic, or the `write_cnf` top-level command. diff --git a/doc/tutorial/galois-whitepaper.cls b/doc/tutorial/galois-whitepaper.cls deleted file mode 100644 index a4b29bc2e7..0000000000 --- a/doc/tutorial/galois-whitepaper.cls +++ /dev/null @@ -1,143 +0,0 @@ -% This class file defines a style useful for writing whitepapers at Galois. -\ProvidesClass{galois-whitepaper}[2010/11/02 Galois whitepaper class] -\newif\if@xelatex -\@xelatexfalse -\DeclareOption{xelatex}{\@xelatextrue} -\DeclareOption*{% -\PassOptionsToClass{\CurrentOption}{article}% -} -\ProcessOptions\relax -\LoadClass{article} - -% Useful packages: -% \RequirePackage[table]{xcolor} -\RequirePackage{graphicx} -%\RequirePackage[headheight=144pt,top=1in,left=1in,right=1in,bottom=1in]{geometry} -\RequirePackage[top=1in,left=1in,right=1in,bottom=1in]{geometry} -\RequirePackage{lastpage} - -% Define fonts -\if@xelatex -\RequirePackage{fontspec} -\RequirePackage{xunicode} -\RequirePackage{xltxtra} -\setmainfont[Mapping=tex-text]{Palatino} -\setsansfont[Mapping=tex-text]{Arial} -\else -\RequirePackage[sc]{mathpazo} -\linespread{1.05} -\RequirePackage[scaled]{helvet} -\fi - -\RequirePackage{sectsty} -\allsectionsfont{\sffamily} - -\newcommand{\highlight}[2][yellow]{\colorbox{#1}{#2}} - -% Misc defines -\makeatletter - \newcommand{\@companyName}{Galois, Inc.} - \newcommand{\@addressPhone}{ - 421 SW 6th Ave., Ste.\ 300\\ - Portland, OR 97204 - } - \newcommand{\@contact}{\todo[Contact]} - \newcommand{\@subtitle}{TODO: Subtitle} - \newcommand{\contact}[1]{\renewcommand{\@contact}{{#1}}} -\makeatother - -\renewcommand{\paragraph}[1]{\textbf{\sffamily{#1}}\quad} - -% \definecolor{galoislightgray}{gray}{0.6} -% Define header and footer -\RequirePackage{fancyhdr} -\pagestyle{fancy} -\fancyheadoffset[l]{1in} -\fancyheadoffset[r]{0in} -%\fancyheadoffset[r]{0.2in} -\fancyhead{}%clear -\fancyfoot{}%clear -\renewcommand{\headrulewidth}{0pt} -\renewcommand{\footrulewidth}{1pt} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% Define a special header style for the title page: -% - \makeatletter - \newcommand{\ps@title}{% - \renewcommand{\@oddhead}{% - \sffamily\includegraphics[width=1in]{figures/galois.pdf} - }} -\makeatother - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% Set up the headers/footers for the rest of the document: -%% -\lhead{\sffamily\hspace{1in}\includegraphics[width=1in]{figures/galois.pdf}} - -\makeatletter -\rhead{\sffamily \textit{\@title{}}} -\makeatother - -\lfoot{\sffamily\color{lightgray}\small\copyright{} 2019 Galois, Inc.} - -\rfoot{ - % \sffamily \color{galoislightgray}\small - \sffamily \color{lightgray}\small - Page \thepage{}% of \pageref{LastPage} -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% The title content definition: -%% -\makeatletter -\DeclareRobustCommand{\maketitle}{ - \thispagestyle{title} - \begin{center} - {\sffamily - {\large \textbf{}}\\ - \vspace{0.3in} - \textbf{\sffamily \LARGE \@title}\\ - %\vspace{0.5in} - %{ \@author }\\ - \vspace{0.3in} - {\large \@companyName }\\ - \vspace{0.025in} - {\small \@addressPhone }\\ - } - \end{center} -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% Add a stop ``.'' after each section number: -%% - -% Redefine the bibliography environment to use \section{\bibname} -% instead of \section*{\bibname} -\newcommand{\bibname}{References} -\renewenvironment{thebibliography}[1] - {\section*{\bibname}% <-- this line was changed from \chapter* to \section* - \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}% - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy - \clubpenalty4000 - \@clubpenalty \clubpenalty - \widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} - -\makeatother diff --git a/doc/tutorial/interactive-interpreter.md b/doc/tutorial/interactive-interpreter.md new file mode 100644 index 0000000000..c9f5a14797 --- /dev/null +++ b/doc/tutorial/interactive-interpreter.md @@ -0,0 +1,63 @@ +Interactive Interpreter +======================= + +The examples so far have used SAWScript in batch mode on complete +script files. It also has an interactive Read-Eval-Print Loop (REPL) +which can be convenient for experimentation. To start the REPL, run +SAWScript with no arguments: + + > saw + +The REPL can evaluate any command that would appear at the top level +of a standalone script, or in the `main` function, as well as a few +special commands that start with a colon: + +\newpage + + :env display the current sawscript environment + :type check the type of an expression + :browse display the current environment + :eval evaluate an expression and print the result + :? display a brief description about a built-in operator + :help display a brief description about a built-in operator + :quit exit the REPL + :load load a module + :add load an additional module + :cd set the current working directory + +As an example of the sort of interactive use that the REPL allows, +consider the file `code/NQueens.cry`, which provides a Cryptol +specification of the problem of placing a specific number of queens on +a chess board in such a way that none of them threaten any of the +others. + +```` +$include 21-56 code/NQueens.cry +```` + +This example gives us the opportunity to use the satisfiability +checking capabilities of SAWScript on a problem other than +equivalence verification. + +First, we can load a model of the `nQueens` term from the Cryptol file. + + sawscript> m <- cryptol_load "NQueens.cry" + sawscript> let nq8 = {{ m::nQueens`{8} }} + +Once we've extracted this model, we can try it on a specific +configuration to see if it satisfies the property that none of the +queens threaten any of the others. + + sawscript> print {{ nq8 [0,1,2,3,4,5,6,7] }} + False + +This particular configuration didn't work, but we can use the +satisfiability checking tools to automatically find one that does. + + sawscript> sat_print abc nq8 + Sat [qs = [3, 1, 6, 2, 5, 7, 4, 0]] + +And, finally, we can double-check that this is indeed a valid solution. + + sawscript> print {{ nq8 [3,1,6,2,5,7,4,0] }} + True diff --git a/doc/tutorial/introduction.md b/doc/tutorial/introduction.md new file mode 100644 index 0000000000..82c8298978 --- /dev/null +++ b/doc/tutorial/introduction.md @@ -0,0 +1,22 @@ +Introduction +============ + +SAWScript is a special-purpose programming language developed by +Galois to help orchestrate and track the results of the large +collection of proof tools necessary for analysis and verification of +complex software artifacts. + +The language adopts the functional paradigm, and largely follows the +structure of many other typed functional languages, with some special +features specifically targeted at the coordination of verification and +analysis tasks. + +This tutorial introduces the details of the language by walking through +several examples, and showing how simple verification tasks can be +described. The complete examples are available [on +GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/tutorial/code). +Most of the examples make use of inline specifications written in +Cryptol, a language originally designed for high-level descriptions of +cryptographic algorithms. For readers unfamiliar with Cryptol, various +documents describing its use are available +[here](http://cryptol.net/documentation.html). diff --git a/doc/tutorial/other-examples.md b/doc/tutorial/other-examples.md new file mode 100644 index 0000000000..bbe29bae6d --- /dev/null +++ b/doc/tutorial/other-examples.md @@ -0,0 +1,61 @@ +Other Examples +============== + +The `code` directory [on +GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/tutorial/code) +contains a few additional examples not mentioned so far. These remaining +examples don't cover significant new material, but help fill in some +extra use cases that are similar, but not identical to those already +covered. + +Java Equivalence Checking +------------------------- + +The previous examples showed comparison between two different LLVM +implementations, and cross-language comparisons between Cryptol, Java, +and LLVM. The script in `ffs_java.saw` compares two different Java +implementations, instead. + +```` +$include all code/ffs_java.saw +```` + +As with previous Java examples, this one needs to be run with the `-b` +flag to tell the interpreter where to find Java: + + > saw -b ffs_java.saw + +AIG Export and Import +--------------------- + +Most of the previous examples have used the `abc` tactic to discharge +theorems. This tactic works by translating the given term to +And-Inverter Graph (AIG) format, transforming the graph in various +ways, and then using a SAT solver to complete the proof. + +Alternatively, the `write_aig` command can be used to write an AIG +directly to a file, in [AIGER format](http://fmv.jku.at/aiger/), for +later processing by external tools, as shown in +`code/ffs_gen_aig.saw`. + +```` +$include all code/ffs_gen_aig.saw +```` + +Conversely, the `read_aig` command can construct an internal term from +an existing AIG file, as shown in `ffs_compare_aig.saw`. + +```` +$include all code/ffs_compare_aig.saw +```` + +We can use external AIGs to verify the equivalence as follows, +generating the AIGs with the first script and comparing them with the +second: + + > saw -b ffs_gen_aig.saw + > saw ffs_compare_aig.saw + +Files in AIGER format can be produced and processed by several +external tools, including ABC, Cryptol version 1, and various hardware +synthesis and verification systems. diff --git a/doc/tutorial/sawScriptTutorial.bib b/doc/tutorial/sawScriptTutorial.bib deleted file mode 100644 index 23ccb20175..0000000000 --- a/doc/tutorial/sawScriptTutorial.bib +++ /dev/null @@ -1,56 +0,0 @@ -@book{Lindholm:1999:JVM:553607, - author = {Lindholm, Tim and Yellin, Frank}, - title = {Java Virtual Machine Specification}, - year = {1999}, - isbn = {0201432943}, - edition = {2nd}, - publisher = {Addison-Wesley Longman Publishing Co., Inc.}, - address = {Boston, MA, USA}, -} - -@Inproceedings{erkok-matthews-cryptolEqChecking-09, - author = "Levent {Erk\"{o}k} and John Matthews", - title = "Pragmatic Equivalence and Safety Checking in {C}ryptol", - booktitle = "Programming Languages meets Program Verification, PLPV'09, - Savannah, Georgia, USA", - publisher = "ACM Press", - month = jan, - pages = "73--81", - year = "2009", -} - -@INPROCEEDINGS{ABC, - author = "Robert K. Brayton and Alan Mishchenko", - title = "{ABC}: An Academic Industrial-Strength Verification Tool", - booktitle = "CAV'10", - pages = {24-40}, - year = {2010} -} - -@Unpublished{SEC2, - key = Certicom, - title = "Certicom {R}esearch: {SEC 2}: {R}ecommended {E}lliptic {C}urve {D}omain {P}arameters, {S}tandards for {E}fficient {C}ryptography", - year = {2000}, - note = {\url{http://www.secg.org/collateral/sec2_final.pdf}}, -} - -@techreport{CryptolSBV, - author = {Levent Erk\"{o}k}, - title = {Equivalence and Safety Checking in {Cryptol}}, - institution = {Galois, Inc.}, - year = {2008}, - month = aug, -} - -@Unpublished{Cryptol, - key = Cryptol, - note = {\url{http://cryptol.net}}, - title = {{Cryptol} web site}, -} - -@book{DecisionProcedures2008, - author = {Daniel Kroening and Ofer Strichman}, - title = {Decision Procedures: An Algorithmic Point of View}, - year = {2008}, - publisher = {Springer}, -} diff --git a/doc/tutorial/sawScriptTutorial.pdf b/doc/tutorial/sawScriptTutorial.pdf deleted file mode 100644 index 263092dca421596bbb1af73c68bdb250da3778c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109653 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 QI!AEq=Ft>8nk(%rOO@T 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

HF5{C5)g1lBhO$PN9 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

-*HT}ZT*xJ2 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 diff --git a/doc/tutorial/tutorial-after.tex b/doc/tutorial/tutorial-after.tex deleted file mode 100644 index cc9383c255..0000000000 --- a/doc/tutorial/tutorial-after.tex +++ /dev/null @@ -1,4 +0,0 @@ -\newpage -\bibliography{sawScriptTutorial} -\addcontentsline{toc}{section}{References} -\bibliographystyle{abbrv} diff --git a/doc/tutorial/tutorial-before.html b/doc/tutorial/tutorial-before.html deleted file mode 100644 index 2ce0a49c74..0000000000 --- a/doc/tutorial/tutorial-before.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/doc/tutorial/tutorial-before.tex b/doc/tutorial/tutorial-before.tex deleted file mode 100644 index 2a8b21e849..0000000000 --- a/doc/tutorial/tutorial-before.tex +++ /dev/null @@ -1 +0,0 @@ -\maketitle diff --git a/doc/tutorial/tutorial-head.tex b/doc/tutorial/tutorial-head.tex deleted file mode 100644 index 6da511e711..0000000000 --- a/doc/tutorial/tutorial-head.tex +++ /dev/null @@ -1,60 +0,0 @@ -\usepackage{listings} -\usepackage{float} -\usepackage{xspace} -\usepackage{color} -\usepackage{tikz} -\usepackage{url} -\usepackage{amsmath} -\usepackage{amscd} -\usepackage{verbatim} -\usepackage{fancyvrb} - -\let\verbatiminput=\verbatimtabinput -\VerbatimFootnotes -\DefineVerbatimEnvironment{code}{Verbatim}{} -\DefineVerbatimEnvironment{pseudoCode}{Verbatim}{} -\hyphenation{SAW-Script} -\newcommand{\sawScript}{{\sc SAWScript}\xspace} -\renewcommand{\textfraction}{0.05} -\renewcommand{\topfraction}{0.95} -\renewcommand{\bottomfraction}{0.95} -\renewcommand{\floatpagefraction}{0.35} -\setcounter{totalnumber}{5} -\definecolor{MyGray}{rgb}{0.9,0.9,0.9} -\makeatletter\newenvironment{graybox}{% - \begin{lrbox}{\@tempboxa}\begin{minipage}{\columnwidth}}{\end{minipage}\end{lrbox}% - \colorbox{MyGray}{\usebox{\@tempboxa}} -}\makeatother - -\setlength{\parskip}{0.6em} -\setlength{\abovecaptionskip}{0.5em} - -\lstset{ - basicstyle=\footnotesize\ttfamily, % Standardschrift - %numbers=left, % Ort der Zeilennummern - numberstyle=\tiny, % Stil der Zeilennummern - %stepnumber=2, % Abstand zwischen den Zeilennummern - numbersep=5pt, % Abstand der Nummern zum Text - tabsize=2, % Groesse von Tabs - extendedchars=true, % - breaklines=true, % Zeilen werden Umgebrochen - keywordstyle=\color{red}, - frame=lrtb, % left, right, top, bottom frames. - % keywordstyle=[1]\textbf, % Stil der Keywords - % keywordstyle=[2]\textbf, % - % keywordstyle=[3]\textbf, % - % keywordstyle=[4]\textbf, \sqrt{\sqrt{}} % - stringstyle=\color{white}\ttfamily, % Farbe der String - showspaces=false, % Leerzeichen anzeigen ? - showtabs=false, % Tabs anzeigen ? - xleftmargin=10pt, % was 17 - xrightmargin=5pt, - framexleftmargin=5pt, % was 17 - framexrightmargin=-1pt, % was 5pt - framexbottommargin=4pt, - %backgroundcolor=\color{lightgray}, - showstringspaces=false % Leerzeichen in Strings anzeigen ? -} - -\author{The Galois SAW Team\\\texttt{saw@galois.com}} -\title{SAWScript Tutorial} diff --git a/doc/tutorial/tutorial.md b/doc/tutorial/tutorial.md deleted file mode 100644 index bbd28f1ead..0000000000 --- a/doc/tutorial/tutorial.md +++ /dev/null @@ -1,519 +0,0 @@ -Introduction -============ - -SAWScript is a special-purpose programming language developed by -Galois to help orchestrate and track the results of the large -collection of proof tools necessary for analysis and verification of -complex software artifacts. - -The language adopts the functional paradigm, and largely follows the -structure of many other typed functional languages, with some special -features specifically targeted at the coordination of verification and -analysis tasks. - -This tutorial introduces the details of the language by walking through -several examples, and showing how simple verification tasks can be -described. The complete examples are available [on -GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/tutorial/code). -Most of the examples make use of inline specifications written in -Cryptol, a language originally designed for high-level descriptions of -cryptographic algorithms. For readers unfamiliar with Cryptol, various -documents describing its use are available -[here](http://cryptol.net/documentation.html). - -Example: Find First Set -======================= - -As a first example, we consider showing the equivalence of several quite -different implementations of the POSIX `ffs` function, which identifies -the position of the first ``1`` bit in a word. The function takes an -integer as input, treated as a vector of bits, and returns another -integer which indicates the index of the first bit set (zero being the -least significant). This function can be implemented in several ways -with different performance and code clarity tradeoffs, and we would like -to show those different implementations are equivalent. - -Reference Implementation -------------------------- - -One simple implementation takes the form of a loop with an index -initialized to zero, and a mask initialized to have the least -significant bit set. On each iteration, we increment the index, and -shift the mask to the left. Then we can use a bitwise "and" operation to -test the bit at the index indicated by the index variable. The following -C code (which is also in the `ffs.c` file on GitHub) uses this approach. - -``` c -$include 9-17 code/ffs.c -``` - -This implementation is relatively straightforward, and a proficient C -programmer would probably have little difficulty believing its -correctness. However, the number of branches taken during execution -could be as many as 32, depending on the input value. It's possible to -implement the same algorithm with significantly fewer branches, and no -backward branches. - -Alternative Implementations ---------------------------- - -An alternative implementation, taken by the following function (also in -`ffs.c`), treats the bits of the input word in chunks, allowing -sequences of zero bits to be skipped over more quickly. - -``` c -$include 19-26 code/ffs.c -``` - -Another optimized version, in the following rather mysterious program -(also in `ffs.c`), based on the `ffs` implementation in [musl -libc](http://musl.libc.org/). - -``` c -$include 69-76 code/ffs.c -``` - -These optimized versions are much less obvious than the reference -implementation. They might be faster, but how do we gain confidence -that they calculate the same results as the reference implementation? - -Finally, consider a buggy implementation which is correct on all but one -possible input (also in `ffs.c`). Although contrived, this program -represents a case where traditional testing -- as opposed to -verification -- is unlikely to be helpful. - -``` c -$include 43-47 code/ffs.c -``` - -SAWScript allows us to state these problems concisely, and to quickly -and automatically 1) prove the equivalence of the reference and -optimized implementations on all possible inputs, and 2) find an input -exhibiting the bug in the third version. - -Generating LLVM Code --------------------- - -SAW can analyze LLVM code, but most programs are originally written in a -higher-level language such as C, as in our example. Therefore, the C -code must be translated to LLVM, using something like the following -command: - - > clang -g -c -emit-llvm -o ffs.bc ffs.c - -The `-g` flag instructs `clang` to include debugging information, which -is useful in SAW to refer to variables and struct fields using the same -names as in C. We have tested SAW successfully with versions of `clang` -from 3.6 to 7.0. Please report it as a bug [on -GitHub](https://github.com/GaloisInc/saw-script/issues) if SAW fails to -parse any LLVM bitcode file. - -This command, and following command examples in this tutorial, can be -run from the `code` directory [on -GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/tutorial/code). -A `Makefile` also exists in that directory, providing quick shortcuts -for tasks like this. For instance, we can get the same effect as the -previous command by running: - - > make ffs.bc - -\newpage - -Equivalence Proof ------------------ - -We now show how to use SAWScript to prove the equivalence of the -reference and implementation versions of the FFS algorithm, and -exhibit the bug in the buggy implementation. - -A SAWScript program is typically structured as a sequence of commands, -potentially along with definitions of functions that abstract over -commonly-used combinations of commands. - -The following script (in `ffs_llvm.saw`) is sufficient to automatically -prove the equivalence of `ffs_ref` with `ffs_imp` and `ffs_musl`, and -identify the bug in `ffs_bug`. - -``` -$include all code/ffs_llvm.saw -``` - -In this script, the `print` commands simply display text for the user. -The `llvm_extract` command instructs the SAWScript interpreter -to perform symbolic simulation of the given C function (e.g., `ffs_ref`) -from a given bitcode file (e.g., `ffs.bc`), and return a term -representing the semantics of the function. - -The `let` statement then constructs a new term corresponding to the -assertion of equality between two existing terms. Arbitrary -Cryptol expressions can be embedded within SAWScript; to distinguish -Cryptol code from SAWScript commands, the Cryptol code is placed -within double brackets `{{` and `}}`. - -The `prove` command can verify the validity of such an assertion, or -produce a counter-example that invalidates it. The `abc` parameter -indicates what theorem prover to use; SAWScript offers support for many -other SAT and SMT solvers as well as user definable simplification -tactics. - -Similarly, the `sat` command works in the opposite direction to `prove`. -It attempts to find a value for which the given assertion is true, and -fails if there is no such value. - -If the `saw` executable is in your PATH, you can run the script above with - - > saw ffs_llvm.saw - -producing the output - -``` -Loading file "ffs_llvm.saw" -Extracting reference term: ffs_ref -Extracting implementation term: ffs_imp -Extracting implementation term: ffs_musl -Extracting buggy term: ffs_bug -Proving equivalence: ffs_ref == ffs_imp -Valid -Proving equivalence: ffs_ref == ffs_musl -Valid -Finding bug via sat search: ffs_ref != ffs_bug -Sat: [x = 0x101010] -Finding bug via failed proof: ffs_ref == ffs_bug -prove: 1 unsolved subgoal(s) -Invalid: [x = 0x101010] -Done. -``` - -Note that both explicitly searching for an input exhibiting the bug -(with `sat`) and attempting to prove the false equivalence (with -`prove`) exhibit the bug. Symmetrically, we could use `sat` to prove the -equivalence of `ffs_ref` and `ffs_imp`, by checking that the -corresponding disequality is unsatisfiable. Indeed, this exactly what -happens behind the scenes: `prove abc ` is essentially `not (sat -abc (not ))`. - -Cross-Language Proofs ---------------------- - -We can implement the FFS algorithm in Java with code almost identical -to the C version. - -The reference version (in `FFS.java`) uses a loop, like the C version: - -``` java -$include 2-10 code/FFS.java -``` - -And the efficient implementation uses a fixed sequence of masking and -shifting operations: - -``` java -$include 12-19 code/FFS.java -``` - -Although in this case we can look at the C and Java code and see that -they perform almost identical operations, the low-level operators -available in C and Java do differ somewhat. Therefore, it would be -nice to be able to gain confidence that they do, indeed, perform the -same operation. - -We can do this with a process very similar to that used to compare the -reference and implementation versions of the algorithm in a single -language. - -First, we compile the Java code to a JVM class file. - - > javac -g FFS.java - -Like with `clang`, the `-g` flag instructs `javac` to include debugging -information, which can be useful to preserve variable names. - -Using `saw` with Java code requires a command-line option `-b` that -locates Java. Run the code in this section with the command: - - > saw -b ffs_compare.saw - -Alternatively, if Java is located on your `PATH`, you can omit the `-b` -option entirely. - -Both Oracle JDK and OpenJDK versions 6 through 8 work well with SAW. -SAW also includes experimental support for JDK 9 and later. Code that only -involves primitive data types (such as `FFS.java` above) is known to work well -under JDK 9+, but there are some as-of-yet unresolved issues in verifying code -involving classes such as `String`. For more information on these issues, refer -to [this GitHub issue](https://github.com/GaloisInc/crucible/issues/641). - -Now we can do the proof both within and across languages (from -`ffs_compare.saw`): - -``` -$include all code/ffs_compare.saw -``` - -Here, the `jvm_extract` function works like `llvm_extract`, but on a -Java class and method name. The `prove_print` command works similarly -to the `prove` followed by `print` combination used for the LLVM -example above. - -Using SMT-Lib Solvers -===================== - -The examples presented so far have used the internal proof system -provided by SAWScript, based primarily on a version of the ABC tool -from UC Berkeley linked into the `saw` executable. However, there is -internal support for other proof tools -- such as Yices and Z3 as -illustrated in the next example -- and more general support for -exporting models representing theorems as goals in the SMT-Lib -language. These exported goals can then be solved using an external -SMT solver. - -Consider the following C file: - -``` c -$include all code/double.c -``` - -In this trivial example, an integer can be doubled either using -multiplication or shifting. The following SAWScript program (in -`double.saw`) verifies that the two are equivalent using both internal -Yices and Z3 modes, and by exporting an SMT-Lib theorem to be -checked later, by an external SAT solver. - -``` -$include all code/double.saw -``` - -The new primitives introduced here are the tilde operator, `~`, which -constructs the logical negation of a term, and `write_smtlib2`, which -writes a term as a proof obligation in SMT-Lib version 2 format. Because -SMT solvers are satisfiability solvers, their default behavior is to -treat free variables as existentially quantified. By negating the input -term, we can instead treat the free variables as universally quantified: -a result of "unsatisfiable" from the solver indicates that the original -term (before negation) is a valid theorem. The `prove` primitive does -this automatically, but for flexibility the `write_smtlib2` primitive -passes the given term through unchanged, because it might be used for -either satisfiability or validity checking. - -The SMT-Lib export capabilities in SAWScript make use of the Haskell SBV -package, and support ABC, Bitwuzla, Boolector, CVC4, CVC5, MathSAT, Yices, and -Z3. - -\newpage - -External SAT Solvers -==================== - -In addition to the `abc`, `z3`, and `yices` proof tactics used -above, SAWScript can also invoke arbitrary external SAT solvers -that read CNF files and produce results according to the SAT -competition -[input and output conventions](https://jix.github.io/varisat/manual/0.2.0/formats/dimacs.html), -using the `external_cnf_solver` tactic. For example, you can use -[PicoSAT](http://fmv.jku.at/picosat/) to prove the theorem `thm` from -the last example, with the following commands: - - let picosat = external_cnf_solver "picosat" ["%f"]; - prove_print picosat thm; - -The use of `let` is simply a convenient abbreviation. The following -would be equivalent: - - prove_print (external_cnf_solver "picosat" ["%f"]) thm; - -The first argument to `external_cnf_solver` is the name of the -executable. It can be a fully-qualified name, or simply the bare -executable name if it's in your PATH. The second argument is an array -of command-line arguments to the solver. Any occurrence of `%f` is -replaced with the name of the temporary file containing the CNF -representation of the term you're proving. - -The `external_cnf_solver` tactic is based on the same underlying -infrastructure as the `abc` tactic, and is generally capable of -proving the same variety of theorems. - -To write a CNF file without immediately invoking a solver, use the -`offline_cnf` tactic, or the `write_cnf` top-level command. - -Compositional Proofs -==================== - -The examples shown so far treat programs as monolithic entities. A -Java method or C function, along with all of its callees, is -translated into a single mathematical model. SAWScript also has -support for more compositional proofs, as well as proofs about -functions that use heap data structures. - -Compositional Imperative Proofs -------------------------------- - -As a simple example of compositional reasoning on imperative programs, -consider the following Java code. - -``` java -$include all code/Add.java -``` - -Here, the `add` function computes the sum of its arguments. The `dbl` -function then calls `add` to double its argument. While it would be easy -to prove that `dbl` doubles its argument by following the call to `add`, -it's also possible in SAWScript to prove something about `add` first, -and then use the results of that proof in the proof of `dbl`, as in the -following SAWScript code (`java_add.saw` on GitHub). - -\newpage - -```` -$include all code/java_add.saw -```` - -This can be run as follows: - - > saw -b java_add.saw - -In this example, the definitions of `add_spec` and `dbl_spec` provide -extra information about how to configure the symbolic simulator when -analyzing Java code. In this case, the setup blocks provide explicit -descriptions of the implicit configuration used by -`jvm_extract` (used in the earlier Java FFS example and in the -next section). The `jvm_fresh_var` commands instruct the simulator to -create fresh symbolic inputs to correspond to the Java variables `x` and -`y`. Then, the `jvm_return` commands indicate the expected return value -of the each method, in terms of existing models (which can be written -inline). Because Java methods can operate on references, as well, which -do not exist in Cryptol, Cryptol expressions must be translated to JVM -values with `jvm_term`. - -To make use of these setup blocks, the `jvm_verify` command analyzes -the method corresponding to the class and method name provided, using -the setup block passed in as a parameter. It then returns an object -that describes the proof it has just performed. This object can be -passed into later instances of `jvm_verify` to indicate that calls to -the analyzed method do not need to be followed, and the previous proof -about that method can be used instead of re-analyzing it. - -Interactive Interpreter -======================= - -The examples so far have used SAWScript in batch mode on complete -script files. It also has an interactive Read-Eval-Print Loop (REPL) -which can be convenient for experimentation. To start the REPL, run -SAWScript with no arguments: - - > saw - -The REPL can evaluate any command that would appear at the top level -of a standalone script, or in the `main` function, as well as a few -special commands that start with a colon: - -\newpage - - :env display the current sawscript environment - :type check the type of an expression - :browse display the current environment - :eval evaluate an expression and print the result - :? display a brief description about a built-in operator - :help display a brief description about a built-in operator - :quit exit the REPL - :load load a module - :add load an additional module - :cd set the current working directory - -As an example of the sort of interactive use that the REPL allows, -consider the file `code/NQueens.cry`, which provides a Cryptol -specification of the problem of placing a specific number of queens on -a chess board in such a way that none of them threaten any of the -others. - -```` -$include 21-56 code/NQueens.cry -```` - -This example gives us the opportunity to use the satisfiability -checking capabilities of SAWScript on a problem other than -equivalence verification. - -First, we can load a model of the `nQueens` term from the Cryptol file. - - sawscript> m <- cryptol_load "NQueens.cry" - sawscript> let nq8 = {{ m::nQueens`{8} }} - -Once we've extracted this model, we can try it on a specific -configuration to see if it satisfies the property that none of the -queens threaten any of the others. - - sawscript> print {{ nq8 [0,1,2,3,4,5,6,7] }} - False - -This particular configuration didn't work, but we can use the -satisfiability checking tools to automatically find one that does. - - sawscript> sat_print abc nq8 - Sat [qs = [3, 1, 6, 2, 5, 7, 4, 0]] - -And, finally, we can double-check that this is indeed a valid solution. - - sawscript> print {{ nq8 [3,1,6,2,5,7,4,0] }} - True - -Other Examples -============== - -The `code` directory [on -GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/tutorial/code) -contains a few additional examples not mentioned so far. These remaining -examples don't cover significant new material, but help fill in some -extra use cases that are similar, but not identical to those already -covered. - -Java Equivalence Checking -------------------------- - -The previous examples showed comparison between two different LLVM -implementations, and cross-language comparisons between Cryptol, Java, -and LLVM. The script in `ffs_java.saw` compares two different Java -implementations, instead. - -```` -$include all code/ffs_java.saw -```` - -As with previous Java examples, this one needs to be run with the `-b` -flag to tell the interpreter where to find Java: - - > saw -b ffs_java.saw - -AIG Export and Import ---------------------- - -Most of the previous examples have used the `abc` tactic to discharge -theorems. This tactic works by translating the given term to -And-Inverter Graph (AIG) format, transforming the graph in various -ways, and then using a SAT solver to complete the proof. - -Alternatively, the `write_aig` command can be used to write an AIG -directly to a file, in [AIGER format](http://fmv.jku.at/aiger/), for -later processing by external tools, as shown in -`code/ffs_gen_aig.saw`. - -```` -$include all code/ffs_gen_aig.saw -```` - -Conversely, the `read_aig` command can construct an internal term from -an existing AIG file, as shown in `ffs_compare_aig.saw`. - -```` -$include all code/ffs_compare_aig.saw -```` - -We can use external AIGs to verify the equivalence as follows, -generating the AIGs with the first script and comparing them with the -second: - - > saw -b ffs_gen_aig.saw - > saw ffs_compare_aig.saw - -Files in AIGER format can be produced and processed by several -external tools, including ABC, Cryptol version 1, and various hardware -synthesis and verification systems. diff --git a/doc/tutorial/using-smt-lib-solvers.md b/doc/tutorial/using-smt-lib-solvers.md new file mode 100644 index 0000000000..e76a9721e6 --- /dev/null +++ b/doc/tutorial/using-smt-lib-solvers.md @@ -0,0 +1,43 @@ +Using SMT-Lib Solvers +===================== + +The examples presented so far have used the internal proof system +provided by SAWScript, based primarily on a version of the ABC tool +from UC Berkeley linked into the `saw` executable. However, there is +internal support for other proof tools -- such as Yices and Z3 as +illustrated in the next example -- and more general support for +exporting models representing theorems as goals in the SMT-Lib +language. These exported goals can then be solved using an external +SMT solver. + +Consider the following C file: + +``` c +$include all code/double.c +``` + +In this trivial example, an integer can be doubled either using +multiplication or shifting. The following SAWScript program (in +`double.saw`) verifies that the two are equivalent using both internal +Yices and Z3 modes, and by exporting an SMT-Lib theorem to be +checked later, by an external SAT solver. + +``` +$include all code/double.saw +``` + +The new primitives introduced here are the tilde operator, `~`, which +constructs the logical negation of a term, and `write_smtlib2`, which +writes a term as a proof obligation in SMT-Lib version 2 format. Because +SMT solvers are satisfiability solvers, their default behavior is to +treat free variables as existentially quantified. By negating the input +term, we can instead treat the free variables as universally quantified: +a result of "unsatisfiable" from the solver indicates that the original +term (before negation) is a valid theorem. The `prove` primitive does +this automatically, but for flexibility the `write_smtlib2` primitive +passes the given term through unchanged, because it might be used for +either satisfiability or validity checking. + +The SMT-Lib export capabilities in SAWScript make use of the Haskell SBV +package, and support ABC, Bitwuzla, Boolector, CVC4, CVC5, MathSAT, Yices, and +Z3. From f5e4945bcb7bcf44433c0f9bc933ce1825d1ffe3 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 00:10:16 -0800 Subject: [PATCH 09/67] tutorial: Consistently use standard Markdown headings. This is part of a larger effort to standardize the Markdown sources for SAW's various pieces of documentation. --- doc/tutorial/compositional-proofs.md | 6 ++---- doc/tutorial/example-find-first-set.md | 18 ++++++------------ doc/tutorial/external-sat-solvers.md | 3 +-- doc/tutorial/interactive-interpreter.md | 3 +-- doc/tutorial/introduction.md | 3 +-- doc/tutorial/other-examples.md | 9 +++------ doc/tutorial/using-smt-lib-solvers.md | 3 +-- 7 files changed, 15 insertions(+), 30 deletions(-) diff --git a/doc/tutorial/compositional-proofs.md b/doc/tutorial/compositional-proofs.md index 180a082276..af37cd376c 100644 --- a/doc/tutorial/compositional-proofs.md +++ b/doc/tutorial/compositional-proofs.md @@ -1,5 +1,4 @@ -Compositional Proofs -==================== +# Compositional Proofs The examples shown so far treat programs as monolithic entities. A Java method or C function, along with all of its callees, is @@ -7,8 +6,7 @@ translated into a single mathematical model. SAWScript also has support for more compositional proofs, as well as proofs about functions that use heap data structures. -Compositional Imperative Proofs -------------------------------- +## Compositional Imperative Proofs As a simple example of compositional reasoning on imperative programs, consider the following Java code. diff --git a/doc/tutorial/example-find-first-set.md b/doc/tutorial/example-find-first-set.md index 183a1c27d6..6896df418c 100644 --- a/doc/tutorial/example-find-first-set.md +++ b/doc/tutorial/example-find-first-set.md @@ -1,5 +1,4 @@ -Example: Find First Set -======================= +# Example: Find First Set As a first example, we consider showing the equivalence of several quite different implementations of the POSIX `ffs` function, which identifies @@ -10,8 +9,7 @@ least significant). This function can be implemented in several ways with different performance and code clarity tradeoffs, and we would like to show those different implementations are equivalent. -Reference Implementation -------------------------- +## Reference Implementation One simple implementation takes the form of a loop with an index initialized to zero, and a mask initialized to have the least @@ -31,8 +29,7 @@ could be as many as 32, depending on the input value. It's possible to implement the same algorithm with significantly fewer branches, and no backward branches. -Alternative Implementations ---------------------------- +## Alternative Implementations An alternative implementation, taken by the following function (also in `ffs.c`), treats the bits of the input word in chunks, allowing @@ -68,8 +65,7 @@ and automatically 1) prove the equivalence of the reference and optimized implementations on all possible inputs, and 2) find an input exhibiting the bug in the third version. -Generating LLVM Code --------------------- +## Generating LLVM Code SAW can analyze LLVM code, but most programs are originally written in a higher-level language such as C, as in our example. Therefore, the C @@ -96,8 +92,7 @@ previous command by running: \newpage -Equivalence Proof ------------------ +## Equivalence Proof We now show how to use SAWScript to prove the equivalence of the reference and implementation versions of the FFS algorithm, and @@ -169,8 +164,7 @@ corresponding disequality is unsatisfiable. Indeed, this exactly what happens behind the scenes: `prove abc ` is essentially `not (sat abc (not ))`. -Cross-Language Proofs ---------------------- +## Cross-Language Proofs We can implement the FFS algorithm in Java with code almost identical to the C version. diff --git a/doc/tutorial/external-sat-solvers.md b/doc/tutorial/external-sat-solvers.md index c7fb1d7dd8..0833f7fabc 100644 --- a/doc/tutorial/external-sat-solvers.md +++ b/doc/tutorial/external-sat-solvers.md @@ -1,5 +1,4 @@ -External SAT Solvers -==================== +# External SAT Solvers In addition to the `abc`, `z3`, and `yices` proof tactics used above, SAWScript can also invoke arbitrary external SAT solvers diff --git a/doc/tutorial/interactive-interpreter.md b/doc/tutorial/interactive-interpreter.md index c9f5a14797..514315e046 100644 --- a/doc/tutorial/interactive-interpreter.md +++ b/doc/tutorial/interactive-interpreter.md @@ -1,5 +1,4 @@ -Interactive Interpreter -======================= +# Interactive Interpreter The examples so far have used SAWScript in batch mode on complete script files. It also has an interactive Read-Eval-Print Loop (REPL) diff --git a/doc/tutorial/introduction.md b/doc/tutorial/introduction.md index 82c8298978..4e0e45a760 100644 --- a/doc/tutorial/introduction.md +++ b/doc/tutorial/introduction.md @@ -1,5 +1,4 @@ -Introduction -============ +# Introduction SAWScript is a special-purpose programming language developed by Galois to help orchestrate and track the results of the large diff --git a/doc/tutorial/other-examples.md b/doc/tutorial/other-examples.md index bbe29bae6d..57e5a13fb2 100644 --- a/doc/tutorial/other-examples.md +++ b/doc/tutorial/other-examples.md @@ -1,5 +1,4 @@ -Other Examples -============== +# Other Examples The `code` directory [on GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/tutorial/code) @@ -8,8 +7,7 @@ examples don't cover significant new material, but help fill in some extra use cases that are similar, but not identical to those already covered. -Java Equivalence Checking -------------------------- +## Java Equivalence Checking The previous examples showed comparison between two different LLVM implementations, and cross-language comparisons between Cryptol, Java, @@ -25,8 +23,7 @@ flag to tell the interpreter where to find Java: > saw -b ffs_java.saw -AIG Export and Import ---------------------- +## AIG Export and Import Most of the previous examples have used the `abc` tactic to discharge theorems. This tactic works by translating the given term to diff --git a/doc/tutorial/using-smt-lib-solvers.md b/doc/tutorial/using-smt-lib-solvers.md index e76a9721e6..389e1069d6 100644 --- a/doc/tutorial/using-smt-lib-solvers.md +++ b/doc/tutorial/using-smt-lib-solvers.md @@ -1,5 +1,4 @@ -Using SMT-Lib Solvers -===================== +# Using SMT-Lib Solvers The examples presented so far have used the internal proof system provided by SAWScript, based primarily on a version of the ABC tool From 748ed1d0423e88e54c9535b707437f04c26e1673 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 00:36:26 -0800 Subject: [PATCH 10/67] tutorial: Use consistent code block style. Namely: Fenced with ``` ... ```, no extra space between the fence marker and the language specifier, and _always_ labeled with a language specifier. --- doc/tutorial/compositional-proofs.md | 12 ++++---- doc/tutorial/example-find-first-set.md | 40 +++++++++++++++---------- doc/tutorial/external-sat-solvers.md | 10 +++++-- doc/tutorial/interactive-interpreter.md | 36 ++++++++++++++-------- doc/tutorial/other-examples.md | 22 ++++++++------ doc/tutorial/using-smt-lib-solvers.md | 4 +-- 6 files changed, 75 insertions(+), 49 deletions(-) diff --git a/doc/tutorial/compositional-proofs.md b/doc/tutorial/compositional-proofs.md index af37cd376c..5cf49c0ccc 100644 --- a/doc/tutorial/compositional-proofs.md +++ b/doc/tutorial/compositional-proofs.md @@ -11,7 +11,7 @@ functions that use heap data structures. As a simple example of compositional reasoning on imperative programs, consider the following Java code. -``` java +```java $include all code/Add.java ``` @@ -22,15 +22,15 @@ it's also possible in SAWScript to prove something about `add` first, and then use the results of that proof in the proof of `dbl`, as in the following SAWScript code (`java_add.saw` on GitHub). -\newpage - -```` +```sawscript $include all code/java_add.saw -```` +``` This can be run as follows: - > saw -b java_add.saw +```console +> saw -b java_add.saw +``` In this example, the definitions of `add_spec` and `dbl_spec` provide extra information about how to configure the symbolic simulator when diff --git a/doc/tutorial/example-find-first-set.md b/doc/tutorial/example-find-first-set.md index 6896df418c..afc318825f 100644 --- a/doc/tutorial/example-find-first-set.md +++ b/doc/tutorial/example-find-first-set.md @@ -18,7 +18,7 @@ shift the mask to the left. Then we can use a bitwise "and" operation to test the bit at the index indicated by the index variable. The following C code (which is also in the `ffs.c` file on GitHub) uses this approach. -``` c +```c $include 9-17 code/ffs.c ``` @@ -35,7 +35,7 @@ An alternative implementation, taken by the following function (also in `ffs.c`), treats the bits of the input word in chunks, allowing sequences of zero bits to be skipped over more quickly. -``` c +```c $include 19-26 code/ffs.c ``` @@ -43,7 +43,7 @@ Another optimized version, in the following rather mysterious program (also in `ffs.c`), based on the `ffs` implementation in [musl libc](http://musl.libc.org/). -``` c +```c $include 69-76 code/ffs.c ``` @@ -56,7 +56,7 @@ possible input (also in `ffs.c`). Although contrived, this program represents a case where traditional testing -- as opposed to verification -- is unlikely to be helpful. -``` c +```c $include 43-47 code/ffs.c ``` @@ -72,7 +72,9 @@ higher-level language such as C, as in our example. Therefore, the C code must be translated to LLVM, using something like the following command: - > clang -g -c -emit-llvm -o ffs.bc ffs.c +```console +> clang -g -c -emit-llvm -o ffs.bc ffs.c +``` The `-g` flag instructs `clang` to include debugging information, which is useful in SAW to refer to variables and struct fields using the same @@ -88,9 +90,9 @@ A `Makefile` also exists in that directory, providing quick shortcuts for tasks like this. For instance, we can get the same effect as the previous command by running: - > make ffs.bc - -\newpage +```console +> make ffs.bc +``` ## Equivalence Proof @@ -106,7 +108,7 @@ The following script (in `ffs_llvm.saw`) is sufficient to automatically prove the equivalence of `ffs_ref` with `ffs_imp` and `ffs_musl`, and identify the bug in `ffs_bug`. -``` +```sawscript $include all code/ffs_llvm.saw ``` @@ -134,11 +136,13 @@ fails if there is no such value. If the `saw` executable is in your PATH, you can run the script above with - > saw ffs_llvm.saw +```console +> saw ffs_llvm.saw +``` producing the output -``` +```output Loading file "ffs_llvm.saw" Extracting reference term: ffs_ref Extracting implementation term: ffs_imp @@ -171,14 +175,14 @@ to the C version. The reference version (in `FFS.java`) uses a loop, like the C version: -``` java +```java $include 2-10 code/FFS.java ``` And the efficient implementation uses a fixed sequence of masking and shifting operations: -``` java +```java $include 12-19 code/FFS.java ``` @@ -194,7 +198,9 @@ language. First, we compile the Java code to a JVM class file. - > javac -g FFS.java +```console +> javac -g FFS.java +``` Like with `clang`, the `-g` flag instructs `javac` to include debugging information, which can be useful to preserve variable names. @@ -202,7 +208,9 @@ information, which can be useful to preserve variable names. Using `saw` with Java code requires a command-line option `-b` that locates Java. Run the code in this section with the command: - > saw -b ffs_compare.saw +```console +> saw -b ffs_compare.saw +``` Alternatively, if Java is located on your `PATH`, you can omit the `-b` option entirely. @@ -217,7 +225,7 @@ to [this GitHub issue](https://github.com/GaloisInc/crucible/issues/641). Now we can do the proof both within and across languages (from `ffs_compare.saw`): -``` +```sawscript $include all code/ffs_compare.saw ``` diff --git a/doc/tutorial/external-sat-solvers.md b/doc/tutorial/external-sat-solvers.md index 0833f7fabc..99b5cf25a0 100644 --- a/doc/tutorial/external-sat-solvers.md +++ b/doc/tutorial/external-sat-solvers.md @@ -9,13 +9,17 @@ using the `external_cnf_solver` tactic. For example, you can use [PicoSAT](http://fmv.jku.at/picosat/) to prove the theorem `thm` from the last example, with the following commands: - let picosat = external_cnf_solver "picosat" ["%f"]; - prove_print picosat thm; +```sawscript +let picosat = external_cnf_solver "picosat" ["%f"]; +prove_print picosat thm;x +``` The use of `let` is simply a convenient abbreviation. The following would be equivalent: - prove_print (external_cnf_solver "picosat" ["%f"]) thm; +```sawscript +prove_print (external_cnf_solver "picosat" ["%f"]) thm; +``` The first argument to `external_cnf_solver` is the name of the executable. It can be a fully-qualified name, or simply the bare diff --git a/doc/tutorial/interactive-interpreter.md b/doc/tutorial/interactive-interpreter.md index 514315e046..0191de50e3 100644 --- a/doc/tutorial/interactive-interpreter.md +++ b/doc/tutorial/interactive-interpreter.md @@ -5,14 +5,15 @@ script files. It also has an interactive Read-Eval-Print Loop (REPL) which can be convenient for experimentation. To start the REPL, run SAWScript with no arguments: - > saw +```console +> saw +``` The REPL can evaluate any command that would appear at the top level of a standalone script, or in the `main` function, as well as a few special commands that start with a colon: -\newpage - +```output :env display the current sawscript environment :type check the type of an expression :browse display the current environment @@ -23,6 +24,7 @@ special commands that start with a colon: :load load a module :add load an additional module :cd set the current working directory +``` As an example of the sort of interactive use that the REPL allows, consider the file `code/NQueens.cry`, which provides a Cryptol @@ -30,9 +32,9 @@ specification of the problem of placing a specific number of queens on a chess board in such a way that none of them threaten any of the others. -```` +```cryptol $include 21-56 code/NQueens.cry -```` +``` This example gives us the opportunity to use the satisfiability checking capabilities of SAWScript on a problem other than @@ -40,23 +42,31 @@ equivalence verification. First, we can load a model of the `nQueens` term from the Cryptol file. - sawscript> m <- cryptol_load "NQueens.cry" - sawscript> let nq8 = {{ m::nQueens`{8} }} +```console +sawscript> m <- cryptol_load "NQueens.cry" +sawscript> let nq8 = {{ m::nQueens`{8} }} +``` Once we've extracted this model, we can try it on a specific configuration to see if it satisfies the property that none of the queens threaten any of the others. - sawscript> print {{ nq8 [0,1,2,3,4,5,6,7] }} - False +```console +sawscript> print {{ nq8 [0,1,2,3,4,5,6,7] }} +False +``` This particular configuration didn't work, but we can use the satisfiability checking tools to automatically find one that does. - sawscript> sat_print abc nq8 - Sat [qs = [3, 1, 6, 2, 5, 7, 4, 0]] +```console +sawscript> sat_print abc nq8 +Sat [qs = [3, 1, 6, 2, 5, 7, 4, 0]] +``` And, finally, we can double-check that this is indeed a valid solution. - sawscript> print {{ nq8 [3,1,6,2,5,7,4,0] }} - True +```console +sawscript> print {{ nq8 [3,1,6,2,5,7,4,0] }} +True +``` diff --git a/doc/tutorial/other-examples.md b/doc/tutorial/other-examples.md index 57e5a13fb2..de412a7640 100644 --- a/doc/tutorial/other-examples.md +++ b/doc/tutorial/other-examples.md @@ -14,14 +14,16 @@ implementations, and cross-language comparisons between Cryptol, Java, and LLVM. The script in `ffs_java.saw` compares two different Java implementations, instead. -```` +```sawscript $include all code/ffs_java.saw -```` +``` As with previous Java examples, this one needs to be run with the `-b` flag to tell the interpreter where to find Java: - > saw -b ffs_java.saw +```console +> saw -b ffs_java.saw +``` ## AIG Export and Import @@ -35,23 +37,25 @@ directly to a file, in [AIGER format](http://fmv.jku.at/aiger/), for later processing by external tools, as shown in `code/ffs_gen_aig.saw`. -```` +```sawscript $include all code/ffs_gen_aig.saw -```` +``` Conversely, the `read_aig` command can construct an internal term from an existing AIG file, as shown in `ffs_compare_aig.saw`. -```` +```sawscript $include all code/ffs_compare_aig.saw -```` +``` We can use external AIGs to verify the equivalence as follows, generating the AIGs with the first script and comparing them with the second: - > saw -b ffs_gen_aig.saw - > saw ffs_compare_aig.saw +```console +> saw -b ffs_gen_aig.saw +> saw ffs_compare_aig.saw +``` Files in AIGER format can be produced and processed by several external tools, including ABC, Cryptol version 1, and various hardware diff --git a/doc/tutorial/using-smt-lib-solvers.md b/doc/tutorial/using-smt-lib-solvers.md index 389e1069d6..9ed8854993 100644 --- a/doc/tutorial/using-smt-lib-solvers.md +++ b/doc/tutorial/using-smt-lib-solvers.md @@ -11,7 +11,7 @@ SMT solver. Consider the following C file: -``` c +```c $include all code/double.c ``` @@ -21,7 +21,7 @@ multiplication or shifting. The following SAWScript program (in Yices and Z3 modes, and by exporting an SMT-Lib theorem to be checked later, by an external SAT solver. -``` +```sawscript $include all code/double.saw ``` From 49a85d9b91776c9366769b160a0eaaed0a842a48 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 01:20:18 -0800 Subject: [PATCH 11/67] tutorial: Repair broken code references. Because we are using Sphinx/MyST, there is no need to use the docode.hs script to insert code fragments, as we have the literalinclude directive. tutorial/using-smt-lib-solvers: Repair broken code references. tutorial/compositional-proofs.md: Repair broken code references. tutorial/interactive-interpreter: Repair broken code references. tutorial/other-examples: Repair broken code references. tutorial: Remove docode.hs. --- doc/tutorial/compositional-proofs.md | 10 +++--- doc/tutorial/docode.hs | 30 ---------------- doc/tutorial/example-find-first-set.md | 46 ++++++++++++++++--------- doc/tutorial/interactive-interpreter.md | 6 ++-- doc/tutorial/other-examples.md | 15 ++++---- doc/tutorial/using-smt-lib-solvers.md | 10 +++--- 6 files changed, 55 insertions(+), 62 deletions(-) delete mode 100644 doc/tutorial/docode.hs diff --git a/doc/tutorial/compositional-proofs.md b/doc/tutorial/compositional-proofs.md index 5cf49c0ccc..93533879b6 100644 --- a/doc/tutorial/compositional-proofs.md +++ b/doc/tutorial/compositional-proofs.md @@ -11,8 +11,9 @@ functions that use heap data structures. As a simple example of compositional reasoning on imperative programs, consider the following Java code. -```java -$include all code/Add.java +```{literalinclude} code/Add.java +:linenos: +:language: java ``` Here, the `add` function computes the sum of its arguments. The `dbl` @@ -22,8 +23,9 @@ it's also possible in SAWScript to prove something about `add` first, and then use the results of that proof in the proof of `dbl`, as in the following SAWScript code (`java_add.saw` on GitHub). -```sawscript -$include all code/java_add.saw +```{literalinclude} code/java_add.saw +:linenos: +:language: sawscript ``` This can be run as follows: diff --git a/doc/tutorial/docode.hs b/doc/tutorial/docode.hs deleted file mode 100644 index 550c9fec15..0000000000 --- a/doc/tutorial/docode.hs +++ /dev/null @@ -1,30 +0,0 @@ -module Main where - -import Control.Monad -import System.Process - -interactIO :: (String -> IO String) -> IO () -interactIO act = do - txt <- getContents - mapM_ (act >=> putStr) (lines txt) - --- TODO: this does no error handling whatsoever -processCommand :: String -> IO String -processCommand line = - case words line of - ("$cmd":cmd:args) -> do - result <- readProcess cmd args "" - return $ unlines [ unwords ("#" : cmd : args) ] ++ result - ["$include", "all", file] -> readFile file - ["$include", range, file] -> - do txt <- readFile file - return . unlines . take (endN - startN) $ drop startN (lines txt) - where - (start, end') = break (== '-') range - end = tail end' - startN = read start - 1 - endN = read end - _ -> return (line ++ "\n") - -main :: IO () -main = interactIO processCommand diff --git a/doc/tutorial/example-find-first-set.md b/doc/tutorial/example-find-first-set.md index afc318825f..76e1d4c3df 100644 --- a/doc/tutorial/example-find-first-set.md +++ b/doc/tutorial/example-find-first-set.md @@ -18,8 +18,10 @@ shift the mask to the left. Then we can use a bitwise "and" operation to test the bit at the index indicated by the index variable. The following C code (which is also in the `ffs.c` file on GitHub) uses this approach. -```c -$include 9-17 code/ffs.c +```{literalinclude} code/ffs.c +:lines: 9-17 +:lineno-start: 9 +:language: c ``` This implementation is relatively straightforward, and a proficient C @@ -35,16 +37,20 @@ An alternative implementation, taken by the following function (also in `ffs.c`), treats the bits of the input word in chunks, allowing sequences of zero bits to be skipped over more quickly. -```c -$include 19-26 code/ffs.c +```{literalinclude} code/ffs.c +:lines: 19-26 +:lineno-start: 19 +:language: c ``` Another optimized version, in the following rather mysterious program (also in `ffs.c`), based on the `ffs` implementation in [musl libc](http://musl.libc.org/). -```c -$include 69-76 code/ffs.c +```{literalinclude} code/ffs.c +:lines: 69-76 +:lineno-start: 69 +:language: c ``` These optimized versions are much less obvious than the reference @@ -56,8 +62,10 @@ possible input (also in `ffs.c`). Although contrived, this program represents a case where traditional testing -- as opposed to verification -- is unlikely to be helpful. -```c -$include 43-47 code/ffs.c +```{literalinclude} code/ffs.c +:lines: 43-47 +:lineno-start: 43 +:language: c ``` SAWScript allows us to state these problems concisely, and to quickly @@ -108,8 +116,9 @@ The following script (in `ffs_llvm.saw`) is sufficient to automatically prove the equivalence of `ffs_ref` with `ffs_imp` and `ffs_musl`, and identify the bug in `ffs_bug`. -```sawscript -$include all code/ffs_llvm.saw +```{literalinclude} code/ffs_llvm.saw +:linenos: +:language: sawscript ``` In this script, the `print` commands simply display text for the user. @@ -175,15 +184,19 @@ to the C version. The reference version (in `FFS.java`) uses a loop, like the C version: -```java -$include 2-10 code/FFS.java +```{literalinclude} code/FFS.java +:lines: 2-10 +:lineno-start: 2 +:language: java ``` And the efficient implementation uses a fixed sequence of masking and shifting operations: -```java -$include 12-19 code/FFS.java +```{literalinclude} code/FFS.java +:lines: 12-19 +:lineno-start: 12 +:language: java ``` Although in this case we can look at the C and Java code and see that @@ -225,8 +238,9 @@ to [this GitHub issue](https://github.com/GaloisInc/crucible/issues/641). Now we can do the proof both within and across languages (from `ffs_compare.saw`): -```sawscript -$include all code/ffs_compare.saw +```{literalinclude} code/ffs_compare.saw +:linenos: +:language: sawscript ``` Here, the `jvm_extract` function works like `llvm_extract`, but on a diff --git a/doc/tutorial/interactive-interpreter.md b/doc/tutorial/interactive-interpreter.md index 0191de50e3..f269d7f00a 100644 --- a/doc/tutorial/interactive-interpreter.md +++ b/doc/tutorial/interactive-interpreter.md @@ -32,8 +32,10 @@ specification of the problem of placing a specific number of queens on a chess board in such a way that none of them threaten any of the others. -```cryptol -$include 21-56 code/NQueens.cry +```{literalinclude} code/NQueens.cry +:lines: 21-56 +:lineno-start: 21 +:language: cryptol ``` This example gives us the opportunity to use the satisfiability diff --git a/doc/tutorial/other-examples.md b/doc/tutorial/other-examples.md index de412a7640..354c50be5e 100644 --- a/doc/tutorial/other-examples.md +++ b/doc/tutorial/other-examples.md @@ -14,8 +14,9 @@ implementations, and cross-language comparisons between Cryptol, Java, and LLVM. The script in `ffs_java.saw` compares two different Java implementations, instead. -```sawscript -$include all code/ffs_java.saw +```{literalinclude} code/ffs_java.saw +:linenos: +:language: sawscript ``` As with previous Java examples, this one needs to be run with the `-b` @@ -37,15 +38,17 @@ directly to a file, in [AIGER format](http://fmv.jku.at/aiger/), for later processing by external tools, as shown in `code/ffs_gen_aig.saw`. -```sawscript -$include all code/ffs_gen_aig.saw +```{literalinclude} code/ffs_gen_aig.saw +:linenos: +:language: sawscript ``` Conversely, the `read_aig` command can construct an internal term from an existing AIG file, as shown in `ffs_compare_aig.saw`. -```sawscript -$include all code/ffs_compare_aig.saw +```{literalinclude} code/ffs_compare_aig.saw +:linenos: +:language: sawscript ``` We can use external AIGs to verify the equivalence as follows, diff --git a/doc/tutorial/using-smt-lib-solvers.md b/doc/tutorial/using-smt-lib-solvers.md index 9ed8854993..b6e1b6dcf5 100644 --- a/doc/tutorial/using-smt-lib-solvers.md +++ b/doc/tutorial/using-smt-lib-solvers.md @@ -11,8 +11,9 @@ SMT solver. Consider the following C file: -```c -$include all code/double.c +```{literalinclude} code/double.c +:linenos: +:language: c ``` In this trivial example, an integer can be doubled either using @@ -21,8 +22,9 @@ multiplication or shifting. The following SAWScript program (in Yices and Z3 modes, and by exporting an SMT-Lib theorem to be checked later, by an external SAT solver. -```sawscript -$include all code/double.saw +```{literalinclude} code/double.saw +:linenos: +:language: sawscript ``` The new primitives introduced here are the tilde operator, `~`, which From a362222c4062215652e6eec0572cc440fb4ed323 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 02:07:22 -0800 Subject: [PATCH 12/67] Move figures directory from tutorial to doc root. And delete the PNG version, as the PDF will suffice to add the Galois logo to PDF documentation. --- doc/{tutorial => }/figures/galois.pdf | Bin doc/tutorial/figures/galois.png | Bin 6570 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename doc/{tutorial => }/figures/galois.pdf (100%) delete mode 100644 doc/tutorial/figures/galois.png diff --git a/doc/tutorial/figures/galois.pdf b/doc/figures/galois.pdf similarity index 100% rename from doc/tutorial/figures/galois.pdf rename to doc/figures/galois.pdf diff --git a/doc/tutorial/figures/galois.png b/doc/tutorial/figures/galois.png deleted file mode 100644 index 39a5ba86cb4e6949fec7f2cf4872135116108d71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6570 zcmZ`+2QZw`+TQ4d=w|!YiMm>>PDG8eOZ2vS&+5H~6{5uwB@tZ^(N~G+LI@#< z-h2Dq`_H{I|NQsPyx;kr?>x`@yytv#=FB;>8|=%B2u>tJgO0Qk*jX4>nfo6z^|9?GsqDo`m!>nf-6affA4m_8b-C{y^G zr>o)|(}cqx7bC7hp{LMc#9Q+W`lD8*d z{mzrqTylEAE9vJ{t#v%0lKZWBTiM}?9k4xA=a~a9vyP6`UUGmuX~Bx08~)iTClrd= z&sypn8(1kN8oL)(ll5GT{|N$3E-d;)_J%*-!mdLOQ9^eZ* zQ6+8=1uj)M03L2$O-2*OSxvY_XjDKa9tIjA(MD;zvzp(V?r?FZCq?ln5P`n(v*YY` z$l@tJk0Bjp2dWe6M>XxMV1#p%7`!UA%qs; zu1cs8u9u`aQ8!U?9YnBK>(w}w_cptnvvFHGzwDVxGipbAEe82X-IeR&S$uFt62!zB z6}iXnM|Y2i(wcoBMyOM@DTa_L0m^{`7t@c);5t_4A4@#qIHlkKqk^E;y5cm{CGj=T z$HiB=L56&eV&x1*k&vVfh2x@~!d_j@33_p$VDglrS%Lpw1*ACSzD1ajnpDxx(dm({ zzr;s@qy$}Gt3~V>>|qq32ep(236EnOy3Bh?ZF)s(p9?%As6f?s23U1fum8Yt=03qY zq4FV;3BL~GTFP)&l~yws5hBit=I@hO7FvpOPjB*Xm9}JY3qSp;wkWlzxkq;9dc|^u z7xI=}(TcK?=u3ojr=${oVWxYc$WuSfhg3!}t59JZ0T2F9ul(ZtP|~Vb>P2aF8s_>$ zyr{Z2$OI(%DCX!j4CIvJ(%XZM{9(<>c{(d8x|{a@TK?wN|4hLm|5Gfhd3CXIfW`cjO$nZ41y!8`#p z54W`b!s(!L9Y<-AcDJ4k8dZE@$%Si}tkUWCr=~BodVT#A#}W2*wH1e!Ym{$slD|7G#hMS9OEw>U zPBRZSuQ1PVacCi)`#f*$OMe=?Q(Q4=%u}^<1Yng-4rbMPV)FL=+x7tKR@t`lHcLOI zfVF_r^O2ybOYzIr)A~cf{otk2^{n61%R2ky`)&vM_p8Ytkx>wA5W14IvOHv>VVa;# zAUh#_@^wlU3D`i!_-e#G!2^8d;*NZ?d;u?xkO^8a{~?%wR0H3MR<4)1 z%baFt-i6#Nu4 z30rk@CYRJ3r9bise5&S*nm0AAp}(s*QAGzukv1XwRrzG0AI|(ed?$9osm9Zk14RPU zPGo;L)t>sjhdOAlpUIsDvml0QI%|9{r+3>;T+J;5!`#`I!>T*0iYoN0Jatx-j9`=Q z^%mY{i9z2!N{%s~~~(?7gPb{a>J3494z!HI1%`yBKi+#m2VqZ0q>cZ!}ERi_XSrhZ_J(EpMnU z22tZ5N&|`;$={o#_CLEbF;56~CDU6X~wKaPuμ49xYOnz=bLu?t{vG*cgM&onAY4( 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 oC!_h7>>0w-%fZbRpbJ$M6crL;D_2e%GFumAu6 From f9396ecaabd88e7b974621149b919a4f61fa8c06 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 02:56:14 -0800 Subject: [PATCH 13/67] Rename tutorial -> llvm-java-tutorial. A much more descriptive name :) --- doc/{tutorial => llvm-java-tutorial}/code/Add.class | Bin doc/{tutorial => llvm-java-tutorial}/code/Add.java | 0 .../code/Cipher.cry | 0 doc/{tutorial => llvm-java-tutorial}/code/DES.cry | 0 doc/{tutorial => llvm-java-tutorial}/code/FFS.class | Bin doc/{tutorial => llvm-java-tutorial}/code/FFS.java | 0 doc/{tutorial => llvm-java-tutorial}/code/Makefile | 0 .../code/NQueens.cry | 0 doc/{tutorial => llvm-java-tutorial}/code/WARNING | 0 doc/{tutorial => llvm-java-tutorial}/code/basic.bc | Bin doc/{tutorial => llvm-java-tutorial}/code/basic.c | 0 .../code/des-cryptol2.saw | 0 doc/{tutorial => llvm-java-tutorial}/code/des3.saw | 0 .../code/dotprod.bc | Bin doc/{tutorial => llvm-java-tutorial}/code/dotprod.c | 0 .../code/dotprod.cry | 0 .../code/dotprod.saw | 0 doc/{tutorial => llvm-java-tutorial}/code/double.bc | Bin doc/{tutorial => llvm-java-tutorial}/code/double.c | 0 .../code/double.saw | 0 doc/{tutorial => llvm-java-tutorial}/code/ffs.bc | Bin doc/{tutorial => llvm-java-tutorial}/code/ffs.c | 0 doc/{tutorial => llvm-java-tutorial}/code/ffs.cry | 0 .../code/ffs_compare.saw | 0 .../code/ffs_compare_aig.saw | 0 .../code/ffs_gen_aig.saw | 0 .../code/ffs_java.saw | 0 .../code/ffs_java_crucible.saw | 0 .../code/ffs_llvm.saw | 0 .../code/java_add.saw | 0 .../code/nqueens.saw | 0 .../code/picosat.saw | 0 .../compositional-proofs.md | 0 .../example-find-first-set.md | 0 .../external-sat-solvers.md | 0 .../interactive-interpreter.md | 0 .../introduction.md | 0 .../other-examples.md | 0 .../using-smt-lib-solvers.md | 0 39 files changed, 0 insertions(+), 0 deletions(-) rename doc/{tutorial => llvm-java-tutorial}/code/Add.class (100%) rename doc/{tutorial => llvm-java-tutorial}/code/Add.java (100%) rename doc/{tutorial => llvm-java-tutorial}/code/Cipher.cry (100%) rename doc/{tutorial => llvm-java-tutorial}/code/DES.cry (100%) rename doc/{tutorial => llvm-java-tutorial}/code/FFS.class (100%) rename doc/{tutorial => llvm-java-tutorial}/code/FFS.java (100%) rename doc/{tutorial => llvm-java-tutorial}/code/Makefile (100%) rename doc/{tutorial => llvm-java-tutorial}/code/NQueens.cry (100%) rename doc/{tutorial => llvm-java-tutorial}/code/WARNING (100%) rename doc/{tutorial => llvm-java-tutorial}/code/basic.bc (100%) rename doc/{tutorial => llvm-java-tutorial}/code/basic.c (100%) rename doc/{tutorial => llvm-java-tutorial}/code/des-cryptol2.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/des3.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/dotprod.bc (100%) rename doc/{tutorial => llvm-java-tutorial}/code/dotprod.c (100%) rename doc/{tutorial => llvm-java-tutorial}/code/dotprod.cry (100%) rename doc/{tutorial => llvm-java-tutorial}/code/dotprod.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/double.bc (100%) rename doc/{tutorial => llvm-java-tutorial}/code/double.c (100%) rename doc/{tutorial => llvm-java-tutorial}/code/double.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs.bc (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs.c (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs.cry (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs_compare.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs_compare_aig.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs_gen_aig.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs_java.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs_java_crucible.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/ffs_llvm.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/java_add.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/nqueens.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/code/picosat.saw (100%) rename doc/{tutorial => llvm-java-tutorial}/compositional-proofs.md (100%) rename doc/{tutorial => llvm-java-tutorial}/example-find-first-set.md (100%) rename doc/{tutorial => llvm-java-tutorial}/external-sat-solvers.md (100%) rename doc/{tutorial => llvm-java-tutorial}/interactive-interpreter.md (100%) rename doc/{tutorial => llvm-java-tutorial}/introduction.md (100%) rename doc/{tutorial => llvm-java-tutorial}/other-examples.md (100%) rename doc/{tutorial => llvm-java-tutorial}/using-smt-lib-solvers.md (100%) diff --git a/doc/tutorial/code/Add.class b/doc/llvm-java-tutorial/code/Add.class similarity index 100% rename from doc/tutorial/code/Add.class rename to doc/llvm-java-tutorial/code/Add.class diff --git a/doc/tutorial/code/Add.java b/doc/llvm-java-tutorial/code/Add.java similarity index 100% rename from doc/tutorial/code/Add.java rename to doc/llvm-java-tutorial/code/Add.java diff --git a/doc/tutorial/code/Cipher.cry b/doc/llvm-java-tutorial/code/Cipher.cry similarity index 100% rename from doc/tutorial/code/Cipher.cry rename to doc/llvm-java-tutorial/code/Cipher.cry diff --git a/doc/tutorial/code/DES.cry b/doc/llvm-java-tutorial/code/DES.cry similarity index 100% rename from doc/tutorial/code/DES.cry rename to doc/llvm-java-tutorial/code/DES.cry diff --git a/doc/tutorial/code/FFS.class b/doc/llvm-java-tutorial/code/FFS.class similarity index 100% rename from doc/tutorial/code/FFS.class rename to doc/llvm-java-tutorial/code/FFS.class diff --git a/doc/tutorial/code/FFS.java b/doc/llvm-java-tutorial/code/FFS.java similarity index 100% rename from doc/tutorial/code/FFS.java rename to doc/llvm-java-tutorial/code/FFS.java diff --git a/doc/tutorial/code/Makefile b/doc/llvm-java-tutorial/code/Makefile similarity index 100% rename from doc/tutorial/code/Makefile rename to doc/llvm-java-tutorial/code/Makefile diff --git a/doc/tutorial/code/NQueens.cry b/doc/llvm-java-tutorial/code/NQueens.cry similarity index 100% rename from doc/tutorial/code/NQueens.cry rename to doc/llvm-java-tutorial/code/NQueens.cry diff --git a/doc/tutorial/code/WARNING b/doc/llvm-java-tutorial/code/WARNING similarity index 100% rename from doc/tutorial/code/WARNING rename to doc/llvm-java-tutorial/code/WARNING diff --git a/doc/tutorial/code/basic.bc b/doc/llvm-java-tutorial/code/basic.bc similarity index 100% rename from doc/tutorial/code/basic.bc rename to doc/llvm-java-tutorial/code/basic.bc diff --git a/doc/tutorial/code/basic.c b/doc/llvm-java-tutorial/code/basic.c similarity index 100% rename from doc/tutorial/code/basic.c rename to doc/llvm-java-tutorial/code/basic.c diff --git a/doc/tutorial/code/des-cryptol2.saw b/doc/llvm-java-tutorial/code/des-cryptol2.saw similarity index 100% rename from doc/tutorial/code/des-cryptol2.saw rename to doc/llvm-java-tutorial/code/des-cryptol2.saw diff --git a/doc/tutorial/code/des3.saw b/doc/llvm-java-tutorial/code/des3.saw similarity index 100% rename from doc/tutorial/code/des3.saw rename to doc/llvm-java-tutorial/code/des3.saw diff --git a/doc/tutorial/code/dotprod.bc b/doc/llvm-java-tutorial/code/dotprod.bc similarity index 100% rename from doc/tutorial/code/dotprod.bc rename to doc/llvm-java-tutorial/code/dotprod.bc diff --git a/doc/tutorial/code/dotprod.c b/doc/llvm-java-tutorial/code/dotprod.c similarity index 100% rename from doc/tutorial/code/dotprod.c rename to doc/llvm-java-tutorial/code/dotprod.c diff --git a/doc/tutorial/code/dotprod.cry b/doc/llvm-java-tutorial/code/dotprod.cry similarity index 100% rename from doc/tutorial/code/dotprod.cry rename to doc/llvm-java-tutorial/code/dotprod.cry diff --git a/doc/tutorial/code/dotprod.saw b/doc/llvm-java-tutorial/code/dotprod.saw similarity index 100% rename from doc/tutorial/code/dotprod.saw rename to doc/llvm-java-tutorial/code/dotprod.saw diff --git a/doc/tutorial/code/double.bc b/doc/llvm-java-tutorial/code/double.bc similarity index 100% rename from doc/tutorial/code/double.bc rename to doc/llvm-java-tutorial/code/double.bc diff --git a/doc/tutorial/code/double.c b/doc/llvm-java-tutorial/code/double.c similarity index 100% rename from doc/tutorial/code/double.c rename to doc/llvm-java-tutorial/code/double.c diff --git a/doc/tutorial/code/double.saw b/doc/llvm-java-tutorial/code/double.saw similarity index 100% rename from doc/tutorial/code/double.saw rename to doc/llvm-java-tutorial/code/double.saw diff --git a/doc/tutorial/code/ffs.bc b/doc/llvm-java-tutorial/code/ffs.bc similarity index 100% rename from doc/tutorial/code/ffs.bc rename to doc/llvm-java-tutorial/code/ffs.bc diff --git a/doc/tutorial/code/ffs.c b/doc/llvm-java-tutorial/code/ffs.c similarity index 100% rename from doc/tutorial/code/ffs.c rename to doc/llvm-java-tutorial/code/ffs.c diff --git a/doc/tutorial/code/ffs.cry b/doc/llvm-java-tutorial/code/ffs.cry similarity index 100% rename from doc/tutorial/code/ffs.cry rename to doc/llvm-java-tutorial/code/ffs.cry diff --git a/doc/tutorial/code/ffs_compare.saw b/doc/llvm-java-tutorial/code/ffs_compare.saw similarity index 100% rename from doc/tutorial/code/ffs_compare.saw rename to doc/llvm-java-tutorial/code/ffs_compare.saw diff --git a/doc/tutorial/code/ffs_compare_aig.saw b/doc/llvm-java-tutorial/code/ffs_compare_aig.saw similarity index 100% rename from doc/tutorial/code/ffs_compare_aig.saw rename to doc/llvm-java-tutorial/code/ffs_compare_aig.saw diff --git a/doc/tutorial/code/ffs_gen_aig.saw b/doc/llvm-java-tutorial/code/ffs_gen_aig.saw similarity index 100% rename from doc/tutorial/code/ffs_gen_aig.saw rename to doc/llvm-java-tutorial/code/ffs_gen_aig.saw diff --git a/doc/tutorial/code/ffs_java.saw b/doc/llvm-java-tutorial/code/ffs_java.saw similarity index 100% rename from doc/tutorial/code/ffs_java.saw rename to doc/llvm-java-tutorial/code/ffs_java.saw diff --git a/doc/tutorial/code/ffs_java_crucible.saw b/doc/llvm-java-tutorial/code/ffs_java_crucible.saw similarity index 100% rename from doc/tutorial/code/ffs_java_crucible.saw rename to doc/llvm-java-tutorial/code/ffs_java_crucible.saw diff --git a/doc/tutorial/code/ffs_llvm.saw b/doc/llvm-java-tutorial/code/ffs_llvm.saw similarity index 100% rename from doc/tutorial/code/ffs_llvm.saw rename to doc/llvm-java-tutorial/code/ffs_llvm.saw diff --git a/doc/tutorial/code/java_add.saw b/doc/llvm-java-tutorial/code/java_add.saw similarity index 100% rename from doc/tutorial/code/java_add.saw rename to doc/llvm-java-tutorial/code/java_add.saw diff --git a/doc/tutorial/code/nqueens.saw b/doc/llvm-java-tutorial/code/nqueens.saw similarity index 100% rename from doc/tutorial/code/nqueens.saw rename to doc/llvm-java-tutorial/code/nqueens.saw diff --git a/doc/tutorial/code/picosat.saw b/doc/llvm-java-tutorial/code/picosat.saw similarity index 100% rename from doc/tutorial/code/picosat.saw rename to doc/llvm-java-tutorial/code/picosat.saw diff --git a/doc/tutorial/compositional-proofs.md b/doc/llvm-java-tutorial/compositional-proofs.md similarity index 100% rename from doc/tutorial/compositional-proofs.md rename to doc/llvm-java-tutorial/compositional-proofs.md diff --git a/doc/tutorial/example-find-first-set.md b/doc/llvm-java-tutorial/example-find-first-set.md similarity index 100% rename from doc/tutorial/example-find-first-set.md rename to doc/llvm-java-tutorial/example-find-first-set.md diff --git a/doc/tutorial/external-sat-solvers.md b/doc/llvm-java-tutorial/external-sat-solvers.md similarity index 100% rename from doc/tutorial/external-sat-solvers.md rename to doc/llvm-java-tutorial/external-sat-solvers.md diff --git a/doc/tutorial/interactive-interpreter.md b/doc/llvm-java-tutorial/interactive-interpreter.md similarity index 100% rename from doc/tutorial/interactive-interpreter.md rename to doc/llvm-java-tutorial/interactive-interpreter.md diff --git a/doc/tutorial/introduction.md b/doc/llvm-java-tutorial/introduction.md similarity index 100% rename from doc/tutorial/introduction.md rename to doc/llvm-java-tutorial/introduction.md diff --git a/doc/tutorial/other-examples.md b/doc/llvm-java-tutorial/other-examples.md similarity index 100% rename from doc/tutorial/other-examples.md rename to doc/llvm-java-tutorial/other-examples.md diff --git a/doc/tutorial/using-smt-lib-solvers.md b/doc/llvm-java-tutorial/using-smt-lib-solvers.md similarity index 100% rename from doc/tutorial/using-smt-lib-solvers.md rename to doc/llvm-java-tutorial/using-smt-lib-solvers.md From e98eea5d6fa0b68b6afeda2d99168d12b74be28b Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 03:36:05 -0800 Subject: [PATCH 14/67] llvm-java-tutorial: Update code block style to use colon fences. This prevents rendering issues, and is more consistent with the directive mechanism. It also allows for the use of 'admonitions', which may be helpful in improving the documentation. --- .../compositional-proofs.md | 16 ++-- .../example-find-first-set.md | 74 ++++++++----------- .../external-sat-solvers.md | 8 +- .../interactive-interpreter.md | 32 ++++---- doc/llvm-java-tutorial/other-examples.md | 29 ++++---- .../using-smt-lib-solvers.md | 10 +-- 6 files changed, 76 insertions(+), 93 deletions(-) diff --git a/doc/llvm-java-tutorial/compositional-proofs.md b/doc/llvm-java-tutorial/compositional-proofs.md index 93533879b6..4e78513387 100644 --- a/doc/llvm-java-tutorial/compositional-proofs.md +++ b/doc/llvm-java-tutorial/compositional-proofs.md @@ -11,10 +11,9 @@ functions that use heap data structures. As a simple example of compositional reasoning on imperative programs, consider the following Java code. -```{literalinclude} code/Add.java -:linenos: +:::{literalinclude} code/Add.java :language: java -``` +::: Here, the `add` function computes the sum of its arguments. The `dbl` function then calls `add` to double its argument. While it would be easy @@ -23,16 +22,15 @@ it's also possible in SAWScript to prove something about `add` first, and then use the results of that proof in the proof of `dbl`, as in the following SAWScript code (`java_add.saw` on GitHub). -```{literalinclude} code/java_add.saw -:linenos: +:::{literalinclude} code/java_add.saw :language: sawscript -``` +::: This can be run as follows: -```console -> saw -b java_add.saw -``` +:::{code-block} console +$ saw -b java_add.saw +::: In this example, the definitions of `add_spec` and `dbl_spec` provide extra information about how to configure the symbolic simulator when diff --git a/doc/llvm-java-tutorial/example-find-first-set.md b/doc/llvm-java-tutorial/example-find-first-set.md index 76e1d4c3df..9ac5aba229 100644 --- a/doc/llvm-java-tutorial/example-find-first-set.md +++ b/doc/llvm-java-tutorial/example-find-first-set.md @@ -18,11 +18,10 @@ shift the mask to the left. Then we can use a bitwise "and" operation to test the bit at the index indicated by the index variable. The following C code (which is also in the `ffs.c` file on GitHub) uses this approach. -```{literalinclude} code/ffs.c +:::{literalinclude} code/ffs.c :lines: 9-17 -:lineno-start: 9 :language: c -``` +::: This implementation is relatively straightforward, and a proficient C programmer would probably have little difficulty believing its @@ -37,21 +36,19 @@ An alternative implementation, taken by the following function (also in `ffs.c`), treats the bits of the input word in chunks, allowing sequences of zero bits to be skipped over more quickly. -```{literalinclude} code/ffs.c +:::{literalinclude} code/ffs.c :lines: 19-26 -:lineno-start: 19 :language: c -``` +::: Another optimized version, in the following rather mysterious program (also in `ffs.c`), based on the `ffs` implementation in [musl libc](http://musl.libc.org/). -```{literalinclude} code/ffs.c +:::{literalinclude} code/ffs.c :lines: 69-76 -:lineno-start: 69 :language: c -``` +::: These optimized versions are much less obvious than the reference implementation. They might be faster, but how do we gain confidence @@ -62,11 +59,10 @@ possible input (also in `ffs.c`). Although contrived, this program represents a case where traditional testing -- as opposed to verification -- is unlikely to be helpful. -```{literalinclude} code/ffs.c +:::{literalinclude} code/ffs.c :lines: 43-47 -:lineno-start: 43 :language: c -``` +::: SAWScript allows us to state these problems concisely, and to quickly and automatically 1) prove the equivalence of the reference and @@ -80,9 +76,9 @@ higher-level language such as C, as in our example. Therefore, the C code must be translated to LLVM, using something like the following command: -```console -> clang -g -c -emit-llvm -o ffs.bc ffs.c -``` +:::{code-block} console +$ clang -g -c -emit-llvm -o ffs.bc ffs.c +::: The `-g` flag instructs `clang` to include debugging information, which is useful in SAW to refer to variables and struct fields using the same @@ -98,9 +94,9 @@ A `Makefile` also exists in that directory, providing quick shortcuts for tasks like this. For instance, we can get the same effect as the previous command by running: -```console -> make ffs.bc -``` +:::{code-block} console +$ make ffs.bc +::: ## Equivalence Proof @@ -116,10 +112,9 @@ The following script (in `ffs_llvm.saw`) is sufficient to automatically prove the equivalence of `ffs_ref` with `ffs_imp` and `ffs_musl`, and identify the bug in `ffs_bug`. -```{literalinclude} code/ffs_llvm.saw -:linenos: +:::{literalinclude} code/ffs_llvm.saw :language: sawscript -``` +::: In this script, the `print` commands simply display text for the user. The `llvm_extract` command instructs the SAWScript interpreter @@ -145,13 +140,11 @@ fails if there is no such value. If the `saw` executable is in your PATH, you can run the script above with -```console -> saw ffs_llvm.saw -``` +:::{code-block} console +$ saw ffs_llvm.saw + -producing the output -```output Loading file "ffs_llvm.saw" Extracting reference term: ffs_ref Extracting implementation term: ffs_imp @@ -167,7 +160,7 @@ Finding bug via failed proof: ffs_ref == ffs_bug prove: 1 unsolved subgoal(s) Invalid: [x = 0x101010] Done. -``` +::: Note that both explicitly searching for an input exhibiting the bug (with `sat`) and attempting to prove the false equivalence (with @@ -184,20 +177,18 @@ to the C version. The reference version (in `FFS.java`) uses a loop, like the C version: -```{literalinclude} code/FFS.java +:::{literalinclude} code/FFS.java :lines: 2-10 -:lineno-start: 2 :language: java -``` +::: And the efficient implementation uses a fixed sequence of masking and shifting operations: -```{literalinclude} code/FFS.java +:::{literalinclude} code/FFS.java :lines: 12-19 -:lineno-start: 12 :language: java -``` +::: Although in this case we can look at the C and Java code and see that they perform almost identical operations, the low-level operators @@ -211,9 +202,9 @@ language. First, we compile the Java code to a JVM class file. -```console -> javac -g FFS.java -``` +:::{code-block} console +$ javac -g FFS.java +::: Like with `clang`, the `-g` flag instructs `javac` to include debugging information, which can be useful to preserve variable names. @@ -221,9 +212,9 @@ information, which can be useful to preserve variable names. Using `saw` with Java code requires a command-line option `-b` that locates Java. Run the code in this section with the command: -```console -> saw -b ffs_compare.saw -``` +:::{code-block} console +$ saw -b ffs_compare.saw +::: Alternatively, if Java is located on your `PATH`, you can omit the `-b` option entirely. @@ -238,10 +229,9 @@ to [this GitHub issue](https://github.com/GaloisInc/crucible/issues/641). Now we can do the proof both within and across languages (from `ffs_compare.saw`): -```{literalinclude} code/ffs_compare.saw -:linenos: +:::{literalinclude} code/ffs_compare.saw :language: sawscript -``` +::: Here, the `jvm_extract` function works like `llvm_extract`, but on a Java class and method name. The `prove_print` command works similarly diff --git a/doc/llvm-java-tutorial/external-sat-solvers.md b/doc/llvm-java-tutorial/external-sat-solvers.md index 99b5cf25a0..5e38363d6a 100644 --- a/doc/llvm-java-tutorial/external-sat-solvers.md +++ b/doc/llvm-java-tutorial/external-sat-solvers.md @@ -9,17 +9,17 @@ using the `external_cnf_solver` tactic. For example, you can use [PicoSAT](http://fmv.jku.at/picosat/) to prove the theorem `thm` from the last example, with the following commands: -```sawscript +:::{code-block} sawscript let picosat = external_cnf_solver "picosat" ["%f"]; prove_print picosat thm;x -``` +::: The use of `let` is simply a convenient abbreviation. The following would be equivalent: -```sawscript +:::{code-block} sawscript prove_print (external_cnf_solver "picosat" ["%f"]) thm; -``` +::: The first argument to `external_cnf_solver` is the name of the executable. It can be a fully-qualified name, or simply the bare diff --git a/doc/llvm-java-tutorial/interactive-interpreter.md b/doc/llvm-java-tutorial/interactive-interpreter.md index f269d7f00a..eae1a95325 100644 --- a/doc/llvm-java-tutorial/interactive-interpreter.md +++ b/doc/llvm-java-tutorial/interactive-interpreter.md @@ -5,15 +5,16 @@ script files. It also has an interactive Read-Eval-Print Loop (REPL) which can be convenient for experimentation. To start the REPL, run SAWScript with no arguments: -```console -> saw -``` +:::{code-block} console +$ saw +::: The REPL can evaluate any command that would appear at the top level of a standalone script, or in the `main` function, as well as a few special commands that start with a colon: -```output +:::{code-block} console + :env display the current sawscript environment :type check the type of an expression :browse display the current environment @@ -24,7 +25,7 @@ special commands that start with a colon: :load load a module :add load an additional module :cd set the current working directory -``` +::: As an example of the sort of interactive use that the REPL allows, consider the file `code/NQueens.cry`, which provides a Cryptol @@ -32,11 +33,10 @@ specification of the problem of placing a specific number of queens on a chess board in such a way that none of them threaten any of the others. -```{literalinclude} code/NQueens.cry +:::{literalinclude} code/NQueens.cry :lines: 21-56 -:lineno-start: 21 :language: cryptol -``` +::: This example gives us the opportunity to use the satisfiability checking capabilities of SAWScript on a problem other than @@ -44,31 +44,31 @@ equivalence verification. First, we can load a model of the `nQueens` term from the Cryptol file. -```console +:::{code-block} console sawscript> m <- cryptol_load "NQueens.cry" sawscript> let nq8 = {{ m::nQueens`{8} }} -``` +::: Once we've extracted this model, we can try it on a specific configuration to see if it satisfies the property that none of the queens threaten any of the others. -```console +:::{code-block} console sawscript> print {{ nq8 [0,1,2,3,4,5,6,7] }} False -``` +::: This particular configuration didn't work, but we can use the satisfiability checking tools to automatically find one that does. -```console +:::{code-block} console sawscript> sat_print abc nq8 Sat [qs = [3, 1, 6, 2, 5, 7, 4, 0]] -``` +::: And, finally, we can double-check that this is indeed a valid solution. -```console +:::{code-block} console sawscript> print {{ nq8 [3,1,6,2,5,7,4,0] }} True -``` +::: diff --git a/doc/llvm-java-tutorial/other-examples.md b/doc/llvm-java-tutorial/other-examples.md index 354c50be5e..dd033d369d 100644 --- a/doc/llvm-java-tutorial/other-examples.md +++ b/doc/llvm-java-tutorial/other-examples.md @@ -14,17 +14,16 @@ implementations, and cross-language comparisons between Cryptol, Java, and LLVM. The script in `ffs_java.saw` compares two different Java implementations, instead. -```{literalinclude} code/ffs_java.saw -:linenos: +:::{literalinclude} code/ffs_java.saw :language: sawscript -``` +::: As with previous Java examples, this one needs to be run with the `-b` flag to tell the interpreter where to find Java: -```console -> saw -b ffs_java.saw -``` +:::{code-block} console +$ saw -b ffs_java.saw +::: ## AIG Export and Import @@ -38,27 +37,25 @@ directly to a file, in [AIGER format](http://fmv.jku.at/aiger/), for later processing by external tools, as shown in `code/ffs_gen_aig.saw`. -```{literalinclude} code/ffs_gen_aig.saw -:linenos: +:::{literalinclude} code/ffs_gen_aig.saw :language: sawscript -``` +::: Conversely, the `read_aig` command can construct an internal term from an existing AIG file, as shown in `ffs_compare_aig.saw`. -```{literalinclude} code/ffs_compare_aig.saw -:linenos: +:::{literalinclude} code/ffs_compare_aig.saw :language: sawscript -``` +::: We can use external AIGs to verify the equivalence as follows, generating the AIGs with the first script and comparing them with the second: -```console -> saw -b ffs_gen_aig.saw -> saw ffs_compare_aig.saw -``` +:::{code-block} console +$ saw -b ffs_gen_aig.saw +$ saw ffs_compare_aig.saw +::: Files in AIGER format can be produced and processed by several external tools, including ABC, Cryptol version 1, and various hardware diff --git a/doc/llvm-java-tutorial/using-smt-lib-solvers.md b/doc/llvm-java-tutorial/using-smt-lib-solvers.md index b6e1b6dcf5..a2e73cb9db 100644 --- a/doc/llvm-java-tutorial/using-smt-lib-solvers.md +++ b/doc/llvm-java-tutorial/using-smt-lib-solvers.md @@ -11,10 +11,9 @@ SMT solver. Consider the following C file: -```{literalinclude} code/double.c -:linenos: +:::{literalinclude} code/double.c :language: c -``` +::: In this trivial example, an integer can be doubled either using multiplication or shifting. The following SAWScript program (in @@ -22,10 +21,9 @@ multiplication or shifting. The following SAWScript program (in Yices and Z3 modes, and by exporting an SMT-Lib theorem to be checked later, by an external SAT solver. -```{literalinclude} code/double.saw -:linenos: +:::{literalinclude} code/double.saw :language: sawscript -``` +::: The new primitives introduced here are the tilde operator, `~`, which constructs the logical negation of a term, and `write_smtlib2`, which From 9a72549d7e96b05b223a3c572a23954d6a9ca45f Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 05:29:52 -0800 Subject: [PATCH 15/67] rust-tutorial: Remove PDF generation and split up rust-tutorial.md. See 0df615677 (this is analogous). --- doc/rust-tutorial/Makefile | 66 - doc/rust-tutorial/README.md | 8 - doc/rust-tutorial/a-final-word.md | 6 + doc/rust-tutorial/about-mir-json.md | 287 ++ doc/rust-tutorial/case-study-salsa20.md | 1253 +++++++ doc/rust-tutorial/compound-data-types.md | 503 +++ doc/rust-tutorial/doc.css | 93 - doc/rust-tutorial/figures/galois.pdf | Bin 10165 -> 0 bytes doc/rust-tutorial/figures/galois.png | Bin 6570 -> 0 bytes doc/rust-tutorial/galois-whitepaper.cls | 143 - doc/rust-tutorial/introduction.md | 24 + ...verrides-and-compositional-verification.md | 350 ++ doc/rust-tutorial/prerequisites.md | 12 + doc/rust-tutorial/reference-types.md | 122 + doc/rust-tutorial/rust-tutorial-after.tex | 4 - doc/rust-tutorial/rust-tutorial-before.html | 1 - doc/rust-tutorial/rust-tutorial-before.tex | 1 - doc/rust-tutorial/rust-tutorial-head.tex | 60 - doc/rust-tutorial/rust-tutorial.md | 3171 ----------------- doc/rust-tutorial/saw-basics.md | 379 ++ doc/rust-tutorial/static-items.md | 226 ++ 21 files changed, 3162 insertions(+), 3547 deletions(-) delete mode 100644 doc/rust-tutorial/Makefile delete mode 100644 doc/rust-tutorial/README.md create mode 100644 doc/rust-tutorial/a-final-word.md create mode 100644 doc/rust-tutorial/about-mir-json.md create mode 100644 doc/rust-tutorial/case-study-salsa20.md create mode 100644 doc/rust-tutorial/compound-data-types.md delete mode 100644 doc/rust-tutorial/doc.css delete mode 100644 doc/rust-tutorial/figures/galois.pdf delete mode 100644 doc/rust-tutorial/figures/galois.png delete mode 100644 doc/rust-tutorial/galois-whitepaper.cls create mode 100644 doc/rust-tutorial/introduction.md create mode 100644 doc/rust-tutorial/overrides-and-compositional-verification.md create mode 100644 doc/rust-tutorial/prerequisites.md create mode 100644 doc/rust-tutorial/reference-types.md delete mode 100644 doc/rust-tutorial/rust-tutorial-after.tex delete mode 100644 doc/rust-tutorial/rust-tutorial-before.html delete mode 100644 doc/rust-tutorial/rust-tutorial-before.tex delete mode 100644 doc/rust-tutorial/rust-tutorial-head.tex delete mode 100644 doc/rust-tutorial/rust-tutorial.md create mode 100644 doc/rust-tutorial/saw-basics.md create mode 100644 doc/rust-tutorial/static-items.md diff --git a/doc/rust-tutorial/Makefile b/doc/rust-tutorial/Makefile deleted file mode 100644 index 32ec78184d..0000000000 --- a/doc/rust-tutorial/Makefile +++ /dev/null @@ -1,66 +0,0 @@ -TARGET = tmp/sawScriptRustTutorial -SRCS = ${TARGET}.md ${wildcard *.bib} ${wildcard *.cls} ${wildcard *.sty} -CODE = ${wildcard code/*.c} \ - ${wildcard code/*.cry} \ - ${wildcard code/*.java} \ - ${wildcard code/*.saw} -TARBALL = tmp/saw-rust-tutorial-code.tar.gz -SPELLSRC = ${TARGET}.tex -NEWSPELL = ${TARGET}.SPELLNEW -OLDSPELL = ${TARGET}.SPELLOLD -SPELL = aspell -t -l -AUX = ${wildcard *.blg} ${wildcard *.bbl} ${wildcard *.aux} \ - ${wildcard *.eps} ${wildcard *.log} ${wildcard *.toc} \ - ${TARGET}.md -PDFARGS = -H rust-tutorial-head.tex \ - -B rust-tutorial-before.tex \ - -A rust-tutorial-after.tex \ - --toc \ - --listings \ - -V documentclass:galois-whitepaper \ - -V fontsize:12 \ - --pdf-engine=xelatex -HTMLARGS = --css doc.css \ - -B rust-tutorial-before.html \ - --toc \ - --standalone \ - --metadata title="SAWScript Rust Tutorial" \ - --self-contained - -all: ${TARGET}.pdf ${TARGET}.html ${TARBALL} - -${TARGET}.pdf: ${SRCS} Makefile | tmp - pandoc ${PDFARGS} -o $@ ${TARGET}.md - -${TARGET}.html: ${SRCS} Makefile | tmp - pandoc ${HTMLARGS} -o $@ ${TARGET}.md - -${TARBALL}: ${CODE} - tar czf ${TARBALL} code - -# Pre-processing step. Right now, does nothing. -${TARGET}.md: rust-tutorial.md docode.hs ${CODE} | tmp - runhaskell docode.hs < $< > $@ - -docode: ${TARGET}.md | tmp - -.PHONY: spellClean superClean clean quickSpell - -tmp: - mkdir -p tmp - -clean: - -rm -f ${AUX} - -superClean: clean - -rm -f ${TARGET}.pdf ${TARGET}.html ${TARGET}.md tmp - -spellClean: - rm -f ${NEWSPELL} ${OLDSPELL} - -quickSpell: - @touch ${NEWSPELL} - @mv -f ${NEWSPELL} ${OLDSPELL} - @cat ${SPELLSRC} | ${SPELL} | tr "A-Z" "a-z" | sort | uniq | less > ${NEWSPELL} - @echo '(The ones marked with < are new.)' - @diff ${NEWSPELL} ${OLDSPELL} diff --git a/doc/rust-tutorial/README.md b/doc/rust-tutorial/README.md deleted file mode 100644 index c3c5147261..0000000000 --- a/doc/rust-tutorial/README.md +++ /dev/null @@ -1,8 +0,0 @@ -To update the tutorial, edit `rust-tutorial.md` and then run `make`. The output -is generated in `./tmp`. If you want to version a new copy of the tutorial, -copy `./tmp/sawScriptRustTutorial.pdf` to `./sawScriptRustTutorial.pdf` and -commit. - -Note that some uses of the `^` character in this tutorial cause problems with -especially old versions of `pandoc`. I have confirmed that the tutorial builds -successfully with `pandoc 2.17.1.1` or later. diff --git a/doc/rust-tutorial/a-final-word.md b/doc/rust-tutorial/a-final-word.md new file mode 100644 index 0000000000..a88c8f36a5 --- /dev/null +++ b/doc/rust-tutorial/a-final-word.md @@ -0,0 +1,6 @@ +# A final word + +Like everything else in the `saw-script` repo, this tutorial is being +maintained and developed. If you see something in the tutorial that is wrong, +misleading, or confusing, please file an issue about it +[here](https://github.com/GaloisInc/saw-script/issues). diff --git a/doc/rust-tutorial/about-mir-json.md b/doc/rust-tutorial/about-mir-json.md new file mode 100644 index 0000000000..ab3825f905 --- /dev/null +++ b/doc/rust-tutorial/about-mir-json.md @@ -0,0 +1,287 @@ +# About `mir-json` + +We are interested in verifying code written in Rust, but Rust is an extremely +rich programming language that has many distinct language features. To make the +process of verifying Rust simpler, SAW targets an intermediate language used in +the Rust compiler called [MIR](https://blog.rust-lang.org/2016/04/19/MIR.html) +(short for "Mid-level IR"). MIR takes the variety of different features and +syntactic extensions in Rust and boils them down to a minimal subset that is +easier for a computer program to analyze. + +The process of extracting MIR code that is suitable for SAW's needs is somewhat +tricky, so we wrote a suite of tools called `mir-json` to automate this +process. `mir-json` provides a plugin for tools like `rustc` and `cargo` that +lets you compile Rust code as you normally would and produce an additional +`.json` file as output. This `.json` file contains the MIR code that was +produced internally by the Rust compiler, with some additional minor tweaks to +make it suitable for SAW's needs. + +`mir-json` is not a single tool but rather a suite of related tools that +leverage the same underlying plugin. For SAW purposes, the two `mir-json` tools +that are most relevant are: + +* `saw-rustc`: A thin wrapper around `rustc` (the Rust compiler), which is + suitable for individual `.rs` files. +* `cargo-saw-build`: A thin wrapper around the `cargo build` command, which is + suitable for `cargo`-based Rust projects. + +Most of the examples in this tutorial involve self-contained examples, which +will use `saw-rustc`. Later in the tutorial, we will examine a Salsa20 case +study that involves a `cargo`-based project, which will use `cargo-saw-build`. + +## A first example with `saw-rustc` + +Let's try out `saw-rustc` on a small example file, which we'll name +`first-example.rs`: + +``` rust +$include all code/first-example.rs +``` + +This is the identity function, but specialized to the type `u8`. We can compile +this with `saw-rustc` like so: + +``` +$ saw-rustc first-example.rs + +note: Emitting MIR for first_example/abef32c5::id_u8 + +linking 1 mir files into first-example.linked-mir.json + +``` + +`saw-rustc` prints out some additional information that `rustc` alone does not +print, and we have displayed the parts of this information that are most +interesting. In particular: + +* `saw-rustc` notes that is is `Emitting MIR for first_example/abef32c5::id_u8`, + where `first_example/abef32c5::id_u8` is the full _identifier_ used to uniquely + refer to the `id_u8` function. It's entirely possible that the `abef32c5` + bit will look different on your machine; we'll talk more about identifiers in + the "Identifiers" section. +* Once `saw-rustc` produced a MIR JSON file named + `first-example.linked-mir.json`. This is an important bit of information, as + SAW will ingest this JSON file. + +If you'd like, you can inspect the `first-example.linked-mir.json` file with +JSON tools (e.g., [`jq`](https://jqlang.github.io/jq/)), but it is not +important to understand everything that is going on there. This is +machine-generated JSON, and as such, it is not meant to be particularly +readable by human eyes. + +## The `SAW_RUST_LIBRARY_PATH` environment variable + +Rust has a large set of standard libraries that ship with the compiler, and +parts of the standard library are quite low-level and tricky. SAW's primary +objective is to provide a tool that can analyze code in a tractable way. For +this reason, SAW sometimes needs to invoke simplified versions of Rust standard +library functions that are more reasonable for an SMT-based tool like SAW to +handle. These simplified functions are equivalent in behavior, but avoid using +problematic code patterns (e.g., gnarly pointer arithmetic or the +[`transmute`](https://doc.rust-lang.org/std/intrinsics/fn.transmute.html) +function). + +If you are only ever compiling self-contained pieces of code with `saw-rustc`, +there is a good chance that you can get away without needing to use SAW's +custom version of the Rust standard libraries. However, if you ever need to +build something more complicated than that (e.g., the Salsa20 case study later +in this tutorial), then you _will_ need the custom libraries. For this reason, +it is worthwhile to teach SAW the location of the custom libraries now. + +At present, the best way to obtain the custom version of the Rust standard +libraries is to perform the following steps: + +1. Clone the [`crucible`](https://github.com/GaloisInc/crucible) repo like so: + + ``` + $ git clone https://github.com/GaloisInc/crucible + ``` + +2. Navigate to the + [`crux-mir`](https://github.com/GaloisInc/crucible/tree/master/crux-mir) + subdirectory of the `crucible` checkout: + + ``` + $ cd crucible/crux-mir/ + ``` + +3. Run the `translate_libs.sh` script: + + ``` + $ ./translate_libs.sh + ``` + + This will compile the custom versions of the Rust standard libraries using + `mir-json`, placing the results under the `rlibs` subdirectory. + +4. Finally, define a `SAW_RUST_LIBRARY_PATH` environment variable that points + to the newly created `rlibs` subdirectory: + + ``` + $ export SAW_RUST_LIBRARY_PATH=<...>/crucible/crux-mir/rlibs + ``` + +An upcoming release of SAW will include these custom libraries pre-built, which +will greatly simplify the steps above. Either way, you will need to set the +`SAW_RUST_LIBRARY_PATH` environment variable to point to the location of the +custom libraries. + +## A note about generics + +The `id_u8` function above is likely not how most Rust programmers would define +the identity function. Instead, it would seem more natural to define it +generically, that is, by parameterizing the function by a type parameter: + +``` rust +$include all code/generics-take-1.rs +``` + +If you compile this with `saw-rustc`, however, the resulting JSON file will +lack a definition for `id`! We can see this by using `jq`: + +``` +$ saw-rustc generics-take-1.rs + +$ jq . generics-take-1.linked-mir.json +{ + "fns": [], + "adts": [], + "statics": [], + "vtables": [], + "traits": [], + "intrinsics": [], + "tys": [], + "roots": [] +} +``` + +What is going on here? This is the result of an important design choice that +SAW makes: _SAW only supports verifying monomorphic functions_. To be more +precise, SAW's approach to symbolic simulation requires all of the code being +simulated to have fixed types without any type parameters. + +In order to verify a function using generics in your Rust code, you must +provide a separate, monomorphic function that calls into the generic function. +For example, you can rewrite the example above like so: + +``` rust +$include all code/generics-take-2.rs +``` + +If you compile this version with `saw-rustc`, you'll see: + +``` +$ saw-rustc generics-take-2.rs + +note: Emitting MIR for generics_take_2/8b1bf337::id_u8 + +note: Emitting MIR for generics_take_2/8b1bf337::id::_instaddce72e1232152c[0] + +linking 1 mir files into generics-take-2.linked-mir.json + +``` + +This time, the resulting JSON file contains a definition for `id_u8`. The +reason that this works is because when `id_u8` calls `id`, the Rust compile +will generate a specialized version of `id` where `A` is instantiated with the +type `u8`. This specialized version of `id` is named +`id::_instaddce72e1232152c[0]` in the output above. (You don't have to remember +this name, thankfully!) + +Although the resulting JSON file contains a definition for `id_u8`, it does +_not_ contain a definition for the generic `id` function. As a result, SAW will +only be able to verify the `id_u8` function from this file. If you are ever in +doubt about which functions are accessible for verification with SAW, you can +check this with `jq` like so: + +``` +$ jq '.intrinsics | map(.name)' generics-take-2.linked-mir.json +[ + "generics_take_2/8b1bf337::id_u8", + "generics_take_2/8b1bf337::id::_instaddce72e1232152c[0]" +] +``` + +Here, "intrinsics" are monomorphic functions that are visible to SAW. Note that +`saw-rustc` will optimize away all definitions that are not accessible from one +of these intrinsic functions. This explains why the original program that only +defined a generic `id` function resulted in a definition-less JSON file, as +that program did not contain monomorphic functions (and therefore no +intrinsics). + +Generally speaking, we prefer to verify functions that are defined directly in +the Rust source code, such as `id_u8`, as these functions' names are more +stable than the specialized versions of functions that the compiler generates, +such as `id::_instaddce72e1232152c[0]`. Do note that SAW is capable of +verifying both types of functions, however. (We will see an example of +verifying an autogenerated function in the Salsa20 case study later in this +tutorial.) + +## Identifiers + +When you compile a function named `id_u8`, `saw-rustc` will expand it to a much +longer name such as `first_example/abef32c5::id_u8`. This longer name is called +an _identifier_, and it provides a globally unique name for that function. In +the small examples we've seen up to this point, there hasn't been any risk of +name collisions, but you could imagine compiling this code alongside another +file (or crate) that also defines an `id_u8` function. If that happens, then it +is essential that we can tell apart all of the different `id_u8` functions, and +identifiers provide us the mechanism for doing so. + +Let's take a closer look at what goes into an identifier. In general, an identifier +will look like the following: + +* `/::` + +`` is the name of the crate in which the function is defined. All +of the examples we've seen up to this point have been defined in standalone +files, and as a result, the crate name has been the same as the file name, but +without the `.rs` extension and with all hyphens replaced with underscores +(e.g., `first-example.rs` is given the crate name `first_example`). In +`cargo`-based projects, the crate name will likely differ from the file name. + +`` is a hash of the crate and its dependencies. In extreme +cases, it is possible for two different crates to have identical crate names, +in which case the disambiguator must be used to distinguish between the two +crates. In the common case, however, most crate names will correspond to +exactly one disambiguator. (More on this in a bit.) + +`` is the path to the function within the crate. Sometimes, this +is as simple as the function name itself. In other cases, a function path may +involve multiple _segments_, depending on the module hierarchy for the program +being verified. For instance, a `read` function located in +`core/src/ptr/mod.rs` will have the identifier: + +``` +core/::ptr::read +``` + +Where `core` is the crate name and `ptr::read` is the function path, which +has two segments `ptr` and `read`. There are also some special forms of +segments that appear for functions defined in certain language constructs. +For instance, if a function is defined in an `impl` block, then it will have +`{impl}` as one of its segments, e.g., + +``` +core/::ptr::const_ptr::{impl}::offset +``` + +The most cumbersome part of writing an identifier is the disambiguator, as it +is extremely sensitive to changes in the code (not to mention hard to remember +and type). Luckily, the vast majority of crate names correspond to exactly one +disambiguator, and we can exploit this fact to abbreviate identifiers that live +in such crates. For instance, we can abbreviate this identifier: + +``` +core/::ptr::read +``` + +To simply: + +``` +core::ptr::read +``` + +We will adopt the latter, shorter notation throughout the rest of the tutorial. +SAW also understands this shorthand, so we will also use this notation when +passing identifiers to SAW commands. diff --git a/doc/rust-tutorial/case-study-salsa20.md b/doc/rust-tutorial/case-study-salsa20.md new file mode 100644 index 0000000000..4da4b94ce8 --- /dev/null +++ b/doc/rust-tutorial/case-study-salsa20.md @@ -0,0 +1,1253 @@ +# Case study: Salsa20 + +If you've made it this far into the tutorial, congrats! You've now been exposed +to all of the SAW fundamentals that you need to verify Rust code found in the +wild. Of course, talking about verifying real-world code is one thing, but +actually _doing_ the verification is another thing entirely. Making the jump +from the small examples to "industrial-strength" code can be intimidating. + +To make this jump somewhat less frightening, the last part of this tutorial +will consist of a case study in using SAW to verify a non-trivial piece of Rust +code. In particular, we will be looking at a Rust implementation of the +[Salsa20](https://en.wikipedia.org/wiki/Salsa20) stream cipher. We do not +assume any prior expertise in cryptography or stream ciphers in this tutorial, +so don't worry if you are not familiar with Salsa20. + +More than anything, this case study is meant to emphasize that verification is +an iterative process. It's not uncommon to try something with SAW and encounter +an error message. That's OK! We will explain what can go wrong when verifying +Salsa20 and how to recover from these mistakes. Later, if you encounter similar +issues when verifying your own code with SAW, the experience you have developed +when developing these proofs can inform you of possible ways to fix the issues. + +## The `salsa20` crate + +The code for this Salsa20 implementation we will be verifying can be found +under the +[`code/salsa20`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20) +subdirectory. This code is adapted from version 0.3.0 of the `salsa20` crate, +which is a part of the +[`stream-ciphers`](https://github.com/RustCrypto/stream-ciphers) project. The +code implements Salsa20 as well as variants such as HSalsa20 and XSalsa20, but +we will only be focusing on the original Salsa20 cipher in this tutorial. + +The parts of the crate that are relevant for our needs are mostly contained in +the +[`src/core.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/core.rs) +file, as well as some auxiliary definitions in the +[`src/rounds.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/rounds.rs) +and +[`src/lib.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/lib.rs) +files. You can take a look at these files if you'd like, but you don't need to +understand everything in them just yet. We will introduce the relevant parts of +the code in the tutorial as they come up. + +## Salsa20 preliminaries + +Salsa20 is a stream cipher, which is a cryptographic technique for encrypting +and decrypting messages. A stream cipher encrypts a message by combining it +with a _keystream_ to produce a ciphertext (the encrypted message). Moreover, +the same keystream can then be combined with the ciphertext to decrypt it back +into the original message. + +The original author of Salsa20 has published a specification for Salsa20 +[here](https://cr.yp.to/snuffle/spec.pdf). This is a great starting point for a +formal verification project, as this gives us a high-level description of +Salsa20's behavior that will guide us in proving the functional correctness of +the `salsa20` crate. When we say that `salsa20` is functionally correct, we +really mean "proven correct with respect to the Salsa20 specification". + +The first step in our project would be to port the Salsa20 spec to Cryptol +code, as we will need to use this code when writing SAW proofs. The process of +transcribing an English-language specification to executable Cryptol code is +interesting in its own right, but it is not the primary focus of this tutorial. +As such, we will save you some time by providing a pre-baked Cryptol +implementation of the Salsa20 spec +[here](https://github.com/GaloisInc/saw-script/blob/master/doc/rust-tutorial/code/salsa20/Salsa20.cry). +(This implementation is +[adapted](https://github.com/GaloisInc/cryptol-specs/blob/1366ccf71db9dca58b16ff04ca7d960a4fe20e34/Primitive/Symmetric/Cipher/Stream/Salsa20.cry) +from the [`cryptol-specs`](https://github.com/GaloisInc/cryptol-specs) repo.) + +Writing the Cryptol version of the spec is only half the battle, however. We +still have to prove that the Rust implementation in the `salsa20` crate adheres +to the behavior prescribed by the spec, which is where SAW enters the picture. +As we will see shortly, the code in `salsa20` is not a direct port of the +pseudocode shown in the Salsa20 spec, as it is somewhat more low-level. SAW's +role is to provide us assurance that the behavior of the low-level Rust code +and the high-level Cryptol code coincide. + +## A note about cryptographic security + +As noted in the previous section, our goal is to prove that the behavior of +`salsa20` functions is functionally correct. This property should _not_ be +confused with cryptographic security. While functional correctness is an +important aspect of cryptographic security, a full cryptographic security audit +would encompass additional properties such as whether the code runs in constant +time on modern CPUs. As such, the SAW proofs we will write would not constitute +a full security audit (and indeed, the [`salsa20` +`README`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/README.md) +states that the crate has never received such an audit). + +## An overview of the `salsa20` code + +Before diving into proofs, it will be helpful to have a basic understanding of +the functions and data types used in the `salsa20` crate. Most of the +interesting code lives in +[`src/core.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/core.rs). +At the top of this file, we have the `Core` struct: + +``` rust +$include 8-14 code/salsa20/src/core.rs +``` + +Let's walk through this: + +* The `state` field is an array that is `STATE_WORDS` elements long, where + `STATE_WORDS` is a commonly used alias for `16`: + + ``` rust + $include 88-89 code/salsa20/src/lib.rs + ``` + +* The `rounds` field is of type `PhantomData`. If you haven't seen it + before, + [`PhantomData`](https://doc.rust-lang.org/std/marker/struct.PhantomData.html) + is a special type that tells the Rust compiler to pretend as though the + struct is storing something of type `R`, even though a `PhantomData` value + will not take up any space at runtime. + +The reason that `Core` needs a `PhantomData` field is because `R` +implements the `Rounds` trait: + +``` rust +$include 1-5 code/salsa20/src/rounds.rs +``` + +A core operation in Salsa20 is hashing its input through a series of +_rounds_. The `COUNT` constant indicates how many rounds should be performed. +The Salsa20 spec assumes 20 rounds: + +``` rust +$include 23-29 code/salsa20/src/rounds.rs +``` + +However, there are also reduced-round variants that perform 8 and 12 rounds, +respectively: + +``` rust +$include 7-21 code/salsa20/src/rounds.rs +``` + +Each number of rounds has a corresponding struct whose names begins with the +letter `R`. For instance, a `Core` value represents a 20-round Salsa20 +cipher. Here is the typical use case for a `Core` value: + +* A `Core` value is created using the `new` function: + + ``` rust + $include 18-18 code/salsa20/src/core.rs + ``` + + We'll omit the implementation for now. This function takes a secret `Key` + value and a unique `Nonce` value and uses them to produce the initial `state` + in the `Core` value. + +* After creating a `Core` value, the `counter_setup` and `rounds` functions are + used to produce the Salsa20 keystream: + + ``` rust + $include 83-83 code/salsa20/src/core.rs + ``` + ``` rust + $include 90-90 code/salsa20/src/core.rs + ``` + + We'll have more to say about these functions later. + +* The _pièce de résistance_ is the `apply_keystream` function. This takes a + newly created `Core` value, produces its keystream, and applies it to a + message to produce the `output`: + + ``` rust + $include 68-68 code/salsa20/src/core.rs + ``` + +Our ultimate goal is to verify the `apply_keystream` function, which is the +Rust equivalent of the Salsa20 encryption function described in the spec. + +## Building `salsa20` + +The next step is to build the `salsa20` crate. Unlike the examples we have seen +up to this point, which have been self-contained Rust files, `salsa20` is a +`cargo`-based project. As such, we will need to build it using `cargo +saw-build`, an extension to the `cargo` package manager that integrates with +`mir-json`. Before you proceed, make sure that you have defined the +`SAW_RUST_LIBRARY_PATH` environment variable as described in [this +section](./about-mir-json.md#the-saw_rust_library_path-environment-variable). + +To build the `salsa20` crate, perform the following steps: + +``` +$ cd code/salsa20/ +$ cargo saw-build +``` + +Near the end of the build output, you will see a line that looks like this: + +``` +linking 9 mir files into <...>/saw-script/doc/rust-tutorial/code/salsa20/target/x86_64-unknown-linux-gnu/debug/deps/salsa20-dd0d90f28492b9cb.linked-mir.json +``` + +This is the location of the MIR JSON file that we will need to provide to SAW. +(When we tried it, the hash in the file name was `dd0d90f28492b9cb`, but it +could very well be different on your machine.) Due to how `cargo` works, the +location of this file is in a rather verbose, hard-to-remember location. For +this reason, we recommend copying this file to a different path, e.g., + +``` +$ cp <...>/saw-script/doc/rust-tutorial/code/salsa20/target/x86_64-unknown-linux-gnu/debug/deps/salsa20-dd0d90f28492b9cb.linked-mir.json code/salsa20/salsa20.linked-mir.json +``` + +As a safeguard, we have also checked in a compressed version of this MIR JSON +file as +[`code/salsa20/salsa/salsa20.linked-mir.json.tar.gz`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/salsa20.linked-mir.json.tar.gz). +In a pinch, you can extract this archive to obtain a copy of the MIR JSON file, +which is approximately 4.6 megabytes when uncompressed. + +## Getting started with SAW + +Now that we've built the `salsa20` crate, it's time to start writing some +proofs! Let's start a new `code/salsa20/salsa20.saw` file as fill it in with +the usual preamble: + +``` +$include 1-3 code/salsa20/salsa20-reference.saw +``` + +We are also going to need to make use of the Cryptol implementation of the +Salsa20 spec, which is defined in +[`code/salsa20/Salsa20.cry`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/Salsa20.cry). +SAW allows you to import standalone Cryptol `.cry` files by using the `import` +command: + +``` +$include 4-4 code/salsa20/salsa20-reference.saw +``` + +As an aside, note that we have also checked in a +[`code/salsa20/salsa20-reference.saw`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/salsa20-reference.saw), +which contains a complete SAW file. We encourage you _not_ to look at this file +for now, since following along with the tutorial is meant to illustrate the +"a-ha moments" that one would have in the process of writing the proofs. In you +become stuck while following along and absolutely need a hint, however, then +this file can help you become unstuck. + +## Verifying our first `salsa20` function + +Now it's time to start verifying some `salsa20` code. But where do we start? +It's tempting to start with `apply_keystream`, which is our end goal. This is +likely going to be counter-productive, however, as `apply_keystream` is a +large function with several moving parts. Throwing SAW at it immediately is +likely to cause it to spin forever without making any discernible progress. + +For this reason, we will instead take the approach of working from the +bottom-up. That is, we will first verify the functions that `apply_keystream` +transitively invokes, and then leverage compositional verification to verify a +proof of `apply_keystream` using overrides. This approach naturally breaks up +the problem into smaller pieces that are easier to understand in isolation. + +If we look at the implementation of `apply_keystream`, we see that it invokes +the `round` function, which in turn invokes the `quarter_round` function: + +``` rust +$include 122-142 code/salsa20/src/core.rs +``` + +`quarter_round` is built on top of the standard library functions +[`wrapping_add`](https://doc.rust-lang.org/std/primitive.usize.html#method.wrapping_add) +and +[`rotate_left`](https://doc.rust-lang.org/std/primitive.usize.html#method.rotate_left), +so we have finally reached the bottom of the call stack. This makes +`quarter_round` a good choice for the first function to verify. + +The implementation of the Rust `quarter_round` function is quite similar to the +Cryptol `quarterround` function in `Salsa20.cry`: + +``` +$include 10-16 code/salsa20/Salsa20.cry +``` + +The Cryptol `quarterround` function doesn't have anything like the `state` +argument in the Rust `quarter_round` function, but let's not fret about that +too much yet. Our SAW spec is going to involve `quarterround` _somehow_—we just +have to figure out how to make it fit. + +Let's start filling out the SAW spec for `quarter_round`: + +``` +$include 6-6 code/salsa20/salsa20-quarter_round-fail1.saw +``` + +We are going to need some fresh variables for the `a`, `b`, `c`, and `d` +arguments: + +``` +$include 7-10 code/salsa20/salsa20-quarter_round-fail1.saw +``` + +We will also need to allocate a reference for the `state` argument. The +reference's underlying type is `STATE_WORDS` (`16`) elements long: + +``` +$include 11-13 code/salsa20/salsa20-quarter_round-fail1.saw +``` + +Finally, we will need to pass these arguments to the function: + +``` +$include 15-21 code/salsa20/salsa20-quarter_round-fail1.saw +``` + +With that, we have a spec for `quarter_round`! It's not very interesting just +yet, as we don't specify what `state_ref` should point to after the function +has returned. But that's fine for now. When developing a SAW proof, it can be +helpful to first write out the "skeleton" of a function spec that only contains +the call to `mir_execute_func`, without any additional preconditions or +postconditions. We can add those later after ensuring that the skeleton works +as expected. + +Let's check our progress thus far by running this through SAW: + +``` +$ saw salsa20.saw +... +[23:16:05.080] Type errors: + salsa20.saw:12:39-12:68: Unbound variable: "STATE_WORDS" (salsa20.saw:12:49-12:60) +Note that some built-in commands are available only after running +either `enable_deprecated` or `enable_experimental`. + + salsa20/salsa20.saw:11:31-11:60: Unbound variable: "STATE_WORDS" (salsa20.saw:11:41-11:52) +Note that some built-in commands are available only after running +either `enable_deprecated` or `enable_experimental`. +``` + +We've already run into some type errors. Not too surprising, considering this +was our first attempt. The error message contains that `STATE_WORDS` is +unbound. This makes sense if you think about it, as `STATE_WORDS` is defined in +the Rust code, but not in the SAW file itself. Let's fix that by adding this +line to `salsa20.saw`: + +``` +$include 6-6 code/salsa20/salsa20-quarter_round-fail2.saw +``` + +That change fixes the type errors in `quarter_round_spec`. Hooray! Let's press +on. + +Next, we need to add a call to `mir_verify`. In order to do this, we need to +know what the full identifier for the `quarter_round` function is. Because it +is defined in the `salsa20` crate and in the `core.rs` file, so we would expect +the identifier to be named `salsa20::core::quarter_round`: + +``` +$include 25-26 code/salsa20/salsa20-quarter_round-fail2.saw +``` + +However, SAW disagrees: + +``` +[00:22:56.970] Stack trace: +"mir_verify" (salsa20.saw:26:3-26:13) +Couldn't find MIR function named: salsa20::core::quarter_round +``` + +Ugh. This is a consequence of how `mir-json` disambiguates identifiers. Because +there is a separate `core` crate in the Rust standard libraries, `mir-json` +uses "`core#1`", a distinct name, to refer to the `core.rs` file. You can see +this for yourself by digging around in the MIR JSON file, if you'd like. (In a +future version of SAW, one will be able to [look this name +up](https://github.com/GaloisInc/saw-script/issues/1980) more easily.) + +Once we change the identifier: + +``` +$include 25-26 code/salsa20/salsa20-quarter_round-fail3.saw +``` + +We can run SAW once more. This time, SAW complains about a different thing: + +``` +[01:00:19.697] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[01:00:19.714] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[01:00:19.717] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[01:00:19.739] Subgoal failed: salsa20/10e438b3::core#1[0]::quarter_round[0] index out of bounds: the length is move _10 but the index is _9 +[01:00:19.739] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 53} +[01:00:19.739] ----------Counterexample---------- +[01:00:19.739] a: 2147483648 +``` + +Here, SAW complains that we have an `index out of bounds`. Recall that we are +indexing into the `state` array, which is of length 16, using the +`a`/`b`/`c`/`d` arguments. Each of these arguments are of type `usize`, and +because we are declaring these to be symbolic, it is quite possible for each +argument to be 16 or greater, which would cause the index into `state` to be +out of bounds. + +In practice, however, the only values of `a`/`b`/`c`/`d` that we will use are +less than 16. We can express this fact as a precondition: + +``` +$include 13-16 code/salsa20/salsa20-quarter_round-fail4.saw +``` + +That is enough to finally get SAW to verify this very stripped-down version of +`quarter_round_spec`. Some good progress! But we aren't done yet, as we don't +yet say what happens to the value that `state` points to after the function +returns. This will be a requirement if we want to use `quarter_round_spec` in +compositional verification (and we do want this), so we should address this +shortly. + +Recall that unlike the Rust `quarter_round` function, the Cryptol +`quarterround` function doesn't have a `state` argument. This is because the +Rust function does slightly more than what the Cryptol function does. The Rust +function will look up elements of the `state` array, use them to perform the +computations that the Cryptol function does, and then insert the new values +back into the `state` array. To put it another way: the Rust function can be +thought of as a wrapper around the Cryptol function that also performs an +in-place bulk update of the `state` array. + +In Cryptol, one can look up elements of an array using the `(@@)` function, +and one can perform in-place array updates using the `updates` function. +This translates into a postcondition that looks like this: + +``` +$include 28-30 code/salsa20/salsa20-quarter_round-fail4.saw +``` + +What does SAW think of this? Someone surprisingly, SAW finds a counterexample: + +``` +[01:43:30.065] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[01:43:30.078] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[01:43:30.084] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[01:43:30.801] Subgoal failed: salsa20/10e438b3::core#1[0]::quarter_round[0] Literal equality postcondition + +[01:43:30.801] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 1999} +[01:43:30.802] ----------Counterexample---------- +[01:43:30.802] a: 13 +[01:43:30.802] b: 3 +[01:43:30.802] c: 0 +[01:43:30.802] d: 0 +[01:43:30.802] state: [3788509705, 0, 0, 3223325776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1074561051, 0, 0] +``` + +Note that in this counterexample, the values of `c` and `d` are the same. In +the Rust version of the function, each element in `state` is updated +sequentially, so if two of the array indices are the same, then the value that +was updated with the first index will later be overwritten by the value at the +later index. In the Cryptol version of the function, however, all of the +positions in the array are updated simultaneously. This implicitly assumes that +all of the array indices are disjoint from each other, an assumption that we +are not encoding into `quarter_round_spec`'s preconditions. + +At this point, it can be helpful to observe _how_ the `quarter_round` function +is used in practice. The call sites are found in the `rounds` function: + +``` rust +$include 92-102 code/salsa20/src/core.rs +``` + +Here, we can see that the values of `a`/`b`/`c`/`d` will only ever be chosen +from a set of eight possible options. We can take advantage of this fact to +constrain the possible set of values for `a`/`b`/`c`/`d`. The latest iteration +of the `quarter_round_spec` is now: + +``` +$include 10-38 code/salsa20/salsa20-reference.saw +``` + +Note that: + +* The `indices` value is constrained (via a precondition) to be one of the set + of values that is chosen in the `rounds` function. (Note that `\/` is the + logical-or function in Cryptol.) Each of these are concrete values that are + less than `STATE_WORDS` (`16`), so we no longer need a precondition stating + `a < `STATE_WORDS /\ ...`. + +* Because we now reference `indices` in the preconditions, we have moved its + definition up. (Previously, it was defined in the postconditions section.) + +With this in place, will SAW verify `quarter_round_spec` now? + +``` +[02:14:02.037] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[02:14:02.051] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[02:14:02.057] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... +[02:14:18.616] Proof succeeded! salsa20/10e438b3::core#1[0]::quarter_round[0] +``` + +At long last, it succeeds. Hooray! SAW does have to think for a while, however, +as this proof takes about 17 seconds to complete. It would be unfortunate to +have to wait 17 seconds on every subsequent invocation of SAW, and since we +still have other functions to verify, this is a very real possibility. For this +reason, it can be helpful to temporarily turn this use of `mir_verify` into a +`mir_unsafe_assume_spec`: + +``` +$include 40-44 code/salsa20/salsa20-reference.saw +``` + +Once we are done with the entire proof, we can come back and remove this use of +`mir_unsafe_assume_spec`, as we're only using it as a time-saving measure. + +## Verifying the `rounds` function + +Now that we've warmed up, let's try verifying the `rounds` function, which is +where `quarter_round` is invoked. Here is the full definition of `rounds`: + +``` rust +$include 90-108 code/salsa20/src/core.rs +``` + +First, `rounds` performs `COUNT` rounds on the `state` argument. After this, it +takes each element of `self.state` and adds it to the corresponding element in +`state`. + +Linking back at the Salsa20 spec, we can see that the `rounds` function is +_almost_ an implementation of the Salsa20(x) hash function. The only notable +difference is that while the Salsa20(x) hash function converts the results to +little-endian form, the `rounds` function does not. `Salsa20.cry` implements +this part of the spec here: + +``` +$include 139-147 code/salsa20/Salsa20.cry +``` + +Where `Salsa20` is the hash function, and `Salsa20_rounds` is the part of the +hash function that excludes the little-endian conversions. In other words, +`Salsa20_rounds` precisely captures the behavior of the Rust `rounds` function. + +One aspect of the `rounds` function that will make verifying it slightly +different from verifying `quarter_rounds` is that `rounds` is defined in an +`impl` block for the `Core` struct. This means that the `&mut self` argument in +`rounds` has the type `&mut Core`. As such, we will have to look up the +`Core` ADT in SAW using `mir_find_adt`. + +This raises another question, however: when looking up `Core`, what type +should we use to instantiate `R`? As noted above, our choices are `R8`, `R12`, +and `R20`, depending on how many rounds you want. For now, we'll simply +hard-code it so that `R` is instantiated to be `R8`, but we will generalize +this a bit later. + +Alright, enough chatter—time to start writing a proof. First, let's look up the +`R8` ADT. This is defined in the `salsa20` crate in the `rounds.rs` file, so +its identifier becomes `salsa20::rounds::R8`: + +``` +$include 46-46 code/salsa20/salsa20-rounds-take-1.saw +``` + +Next, we need to look up the `PhantomData` ADT, which is used in the +`rounds` field of the `Core` struct. This is defined in `core::marker`: + +``` +$include 47-47 code/salsa20/salsa20-rounds-take-1.saw +``` + +Finally, we must look up `Core` itself. Like `quarter_round`, the `Core` +struct` is defined in `salsa20::core#1`: + +``` +$include 48-48 code/salsa20/salsa20-rounds-take-1.saw +``` + +Now that we have the necessary prerequisites, let's write a spec for the +`rounds` function. First, we need to allocate a reference for the `self` +argument: + +``` +$include 50-51 code/salsa20/salsa20-rounds-take-1.saw +``` + +Next, we need to create symbolic values for the fields of the `Core` struct, +which `self_ref` will point to. The `self.state` field will be a fresh array, +and the `self.rounds` field will be a simple, empty struct value: + +``` +$include 52-53 code/salsa20/salsa20-rounds-take-1.saw +``` + +Finally, putting all of the `self` values together: + +``` +$include 54-55 code/salsa20/salsa20-rounds-take-1.saw +``` + +Next, we need a `state` argument (not to be confused with the `self.state` +field in `Core`). This is handled much the same as it was in +`quarter_round_spec`: + +``` +$include 57-59 code/salsa20/salsa20-rounds-take-1.saw +``` + +Lastly, we cap it off with a call to `mir_execute_func`: + +``` +$include 61-62 code/salsa20/salsa20-rounds-take-1.saw +``` + +(Again, we're missing some postconditions describing what `self_ref` and +`state_ref` point to after the function returns, but we'll return to that in a +bit.) + +If we run SAW at this point, we see that everything in `rounds_spec` +typechecks, so we're off to a good start. Let's keep going and add a +`mir_verify` call. + +Here, we are faced with an interesting question: what is the identifier for +`rounds::`? The `rounds` function is defined using generics, so we can't +verify it directly—we must instead verify a particular instantiation of +`rounds`. At present, there isn't a good way to look up what the identifiers +for instantiations of generic functions are (there [will be in the +future](https://github.com/GaloisInc/saw-script/issues/1980)), but it turns out +that the identifier for `rounds::` is this: + +``` +$include 64-65 code/salsa20/salsa20-rounds-take-1.saw +``` + +Note that we are using `quarter_round_ov` as a compositional override. Once +again, SAW is happy with our work thus far: + +``` +[03:12:35.990] Proof succeeded! salsa20/10e438b3::core#1[0]::{impl#0}[0]::rounds[0]::_inst6e4a2d7250998ef7[0] +``` + +Nice. Now let's go back and fill in the missing postconditions in +`rounds_spec`. In particular, we must declare what happens to both `self_ref` +and `state_ref`. A closer examination of the code in the Rust `rounds` function +reveals that the `self` argument is never modified at all, so that part is +easy: + +``` +$include 63-63 code/salsa20/salsa20-rounds-take-2.saw +``` + +The `state` argument, on the other hand, is modified in-place. This time, our +job is made easier by the fact that `Salsa20_rounds` implements _exactly_ what +we need. Because we are instantiating `rounds` at type `R8`, we must explicitly +state that we are using 8 rounds: + +``` +$include 64-64 code/salsa20/salsa20-rounds-take-2.saw +``` + +Once again, SAW is happy with our work. We're on a roll! + +Now let's address the fact that we are hard-coding everything to `R8`, which is +somewhat uncomfortable. We can make things better by allowing the user to +specify the number of rounds. The first thing that we will need to change is +the `r_adt` definition, which is response for looking up `R8`. We want to turn +this into a function that, depending on the user input, will look up `R8`, +`R12`, or `R20`: + +``` +$include 46-46 code/salsa20/salsa20-rounds-take-3.saw +``` + +Where `str_concat` is a SAW function for concatenating strings together: + +``` +sawscript> :type str_concat +String -> String -> String +``` + +We also want to parameterize `phantom_data_adt` and `core_adt`: + +``` +$include 47-48 code/salsa20/salsa20-rounds-take-3.saw +``` + +Next, we need to parameterize `rounds_spec` by the number of rounds. This will +require changes in both the preconditions and postconditions. On the +preconditions side, we must pass the number of rounds to the relevant +functions: + +``` +$include 50-56 code/salsa20/salsa20-rounds-take-3.saw +``` + +And on the postconditions side, we must pass the number of rounds to the +Cryptol `Salsa20_rounds` function: + +``` +$include 66-67 code/salsa20/salsa20-rounds-take-3.saw +``` + +Finally, we must adjust the call to `rounds_spec` in the context of +`mir_verify` so that we pick `8` as the number of rounds: + +``` +$include 69-70 code/salsa20/salsa20-rounds-take-3.saw +``` + +SAW is happy with this generalization. To demonstrate that we have generalized +things correctly, we can also verify the same function at `R20` instead of +`R8`: + +``` +$include 71-72 code/salsa20/salsa20-rounds-take-3.saw +``` + +The only things that we had to change were the identifier and the argument to +`rounds_spec`. Not bad! + +## Verifying the `counter_setup` function + +We're very nearly at the point of being able to verify `apply_keystream`. +Before we do, however, there is one more function that `apply_keystream` calls, +which we ought to verify first: `counter_setup`. Thankfully, the implementation +of `counter_setup` is short and sweet: + +``` rust +$include 83-86 code/salsa20/src/core.rs +``` + +This updates the elements of the `state` array at indices `8` and `9` with the +lower 32 bits and the upper 32 bits of the `counter` argument, respecitvely. +At a first glance, there doesn't appear to be any function in `Salsa20.cry` +that directly corresponds to what `counter_setup` does. This is a bit of a +head-scratcher, but the answer to this mystery will become more apparent as we +get further along in the proof. + +For now, we should take matters into our own hands and write our own Cryptol +spec for `counter_setup`. To do this, we will create a new Cryptol file named +`Salsa20Extras.cry`, which imports from `Salsa20.cry`: + +``` +$include 1-3 code/salsa20/Salsa20Extras.cry +``` + +The Cryptol implementation of `counter_setup` will need arrays of length +`STATE_WORDS`, so we shall define `STATE_WORDS` first: + +``` +$include 5-5 code/salsa20/Salsa20Extras.cry +``` + +Note that we preceded this definition with the `type` keyword. In Cryptol, +sequence lengths are encoded at the type level, so if we want to use +`STATE_WORDS` at the type level, we must declare it as a `type`. + +Finally, we can write a Cryptol version of `counter_setup` using our old friend +`updates` to perform a bulk sequence update: + +``` +$include 8-10 code/salsa20/Salsa20Extras.cry +``` + +Note that `counter` is a 64-bit word, but the elements of the `state` sequence +are 32-bit words. As a result, we have to explicitly truncate `counter` and +`counter >> 32` to 32-bit words by using the `drop` function, which drops the +first 32 bits from each word. + +Returning to `salsa20.saw`, we must now make use of our new Cryptol file by +`import`ing it at the top: + +``` +$include 5-5 code/salsa20/salsa20-reference.saw +``` + +With the `counter_setup` Cryptol implementation in scope, we can now write +a spec for the Rust `counter_setup` function. There's not too much to remark +on here, as the spec proves relatively straightforward to write: + +``` +$include 74-90 code/salsa20/salsa20-reference.saw +``` + +We can now verify `counter_setup` against `counter_setup_spec` at lengths `8` +and `20`: + +``` +$include 92-95 code/salsa20/salsa20-reference.saw +``` + +That wasn't so bad. It's a bit unsatisfying that we had to resort to writing a +Cryptol function not found in `Salsa20.cry`, but go along with this for now—it +will become apparent later why this needed to be done. + +## Verifying the `apply_keystream` function (first attempt) + +It's time. Now that we've verified `rounds` and `counter_setup`, it's time to +tackle the topmost function in the call stack: `apply_keystream`: + +``` rust +$include 68-80 code/salsa20/src/core.rs +``` + +There aren't _that_ many lines of code in this function, but there is still +quite a bit going on. Let's walk through `apply_keystream` in more detail: + +1. The `output` argument represents the message to encrypt (or decrypt). + `output` is a slice of bytes, so in principle, `output` can have an arbitrary + length. That being said, the first line of `apply_keystream`'s implementation + checks that `output`'s length is equal to `BLOCK_SIZE`: + + ``` rust + $include 69-69 code/salsa20/src/core.rs + ``` + + Where `BLOCK_SIZE` is defined here: + + ``` rust + $include 82-83 code/salsa20/src/lib.rs + ``` + + So in practice, `output` must have exactly 64 elements. + +2. Next, `apply_keystream` invokes the `counter_setup` and `rounds` functions + to set up the keystream (the local `state` variable). + +3. Finally, `apply_keystream` combines the keystream with `output`. It does + so by chunking `output` into a sequence of 4 bytes, and then it XOR's the + value of each byte in-place with the corresponding byte from the keystream. + This performs little-endian conversions as necessary. + +The fact that we are XOR'ing bytes strongly suggests that this is an +implementation of the Salsa20 encryption function from the spec. There is an +important difference between how the Salsa20 spec defines the encryption +function versus how `apply_keystream` defines it, however. In the Salsa20 spec, +encryption is a function of a key, nonce, and a message. `apply_keystream`, on +the other hand, is a function of `self`'s internal state, a counter, and a +message. The two aren't _quite_ the same, which is makes it somewhat tricky to +describe one in terms of the other. + +`Salsa20.cry` defines a straightforward Cryptol port of the Salsa20 encryption +function from the spec, named `Salsa20_encrypt`. Because it takes a key and a +nonce as an argument, it's not immediately clear how we'd tie this back to +`apply_keystream`. But no matter: we can do what we did before and define our +own Cryptol version of `apply_keystream` in `Salsa20Extras.cry`: + +``` +$include 12-17 code/salsa20/Salsa20Extras.cry +``` + +This implementation builds on top of the Cryptol `counter_setup` and +`Salsa20_rounds` functions, which we used as the reference implementations for +the Rust `counter_setup` and `rounds` functions, respectively. We also make +sure to define a `BLOCK_SIZE` type alias at the top of the file: + +``` +$include 6-6 code/salsa20/Salsa20Extras.cry +``` + +Now let's write a SAW spec for `apply_keystream`. Once again, we will need to +reference `BLOCK_SIZE` when talking about the `output`-related parts of the +spec, so make sure to define `BLOCK_SIZE` at the top of the `.saw` file: + +``` +$include 8-8 code/salsa20/salsa20-reference.saw +``` + +First, we need to declare all of our arguments, which proceeds as you would +expect: + +``` +$include 120-136 code/salsa20/salsa20-reference.saw +``` + +What about the postconditions? We have two mutable references to contend with: +`self_ref` and `output_ref`. The postcondition for `self_ref` is fairly +straightforward: the only time it is ever modified is when `counter_setup` is +called. This means that after the `apply_keystream` function has returned, +`self_ref` will point to the results of calling the `counter_setup` Cryptol +function: + +``` +$include 138-140 code/salsa20/salsa20-reference.saw +``` + +`output_ref` is where the interesting work happenings. After the Rust +`apply_keystream` function has returned, it will point to the results of +calling the Cryptol `apply_keystream` function that we just defined: + +``` +$include 141-142 code/salsa20/salsa20-reference.saw +``` + +Finally, we can put this all together and verify `apply_keystream` against +`apply_keystream_spec` at lengths `8` and `20`: + +``` +$include 144-148 code/salsa20/salsa20-reference.saw +``` + +SAW will successfully verify these. We've achieved victory... or have we? +Recall that we had to tailor the Cryptol `apply_keystream` function to +specifically match the behavior of the corresponding Rust code. This makes the +proof somewhat underwhelming, since the low-level implementation is nearly +identical to the high-level spec. + +A more impressive proof would require linking `apply_keystream` to a Cryptol +function in the `Salsa20.cry` file, which was developed independently of the +Rust code. As we mentioned before, however, doing so will force us to reconcile +the differences in the sorts of arguments that each function takes, as +`apply_keystream` doesn't take a key or nonce argument. Time to think for a +bit. + +## Verifying the `new_raw` function + +At this point, we should ask ourselves: _why_ doesn't `apply_keystream` take a +key or nonce argument? The reason lies in the fact that the `salsa20` crate +implements Salsa20 in a stateful way. Specifically, the `Core` struct stores +internal state that is used to compute the keystream to apply when hashing. In +order to use this internal state, however, we must first initialize it. The +`new` function that is responsible for this initialization: + +``` rust +$include 17-20 code/salsa20/src/core.rs +``` + +Sure enough, this function takes a key and a nonce as an argument! This is a +critical point that we overlooked. When using the `salsa20` crate, you wouldn't +use the `apply_keystream` function in isolation. Instead, you would create an +initial `Core` value using `new`, and _then_ you would invoke +`apply_keystream`. The Salsa20 spec effectively combines both of these +operations in is encryption function, whereas the `salsa20` splits these two +operations into separate functions altogether. + +Strictly speaking, we don't need to verify `new` in order to verify +`apply_keystream`, as the latter never invokes the former. Still, it will be a +useful exercise to verify `new`, as the insights we gain when doing so will +help us write a better version of `apply_keystream_spec`. + +All that being said, we probably to verify `new_raw` (a lower-level helper +function) rather than `new` itself. This is because the definitions of `Key` +and `Nonce` are somewhat involved. For instance, `Key` is defined as: + +``` rust +$include 27-27 code/salsa20/src/salsa.rs +``` + +[`GenericArray`](https://docs.rs/generic-array/latest/generic_array/struct.GenericArray.html) +is a somewhat complicated abstraction. Luckily, we don't really _need_ to deal +with it, since `new_raw` deals with simple array references rather than +`GenericArray`s: + +``` rust +$include 22-23 code/salsa20/src/core.rs +``` + +The full implementation of `new_raw` is rather long, so we won't inline the +whole thing here. At a high level, it initializes the `state` array of a `Core` +value by populating each element of the array with various things. Some +elements of the array are populated with `key`, some parts are populated with +`iv` (i.e., the nonce), and other parts are populated with an array named +`CONSTANTS`: + +``` rust +$include 91-92 code/salsa20/src/lib.rs +``` + +The comment about `"expand 32-byte k"` is a strong hint that `new_raw` is +implementing a portion of the Salsa20 expansion function from the spec. (No +really, the spec literally says to use the exact string `"expand 32-byte +k"`—look it up!) The `Salsa20.cry` Cryptol file has an implementation of this +portion of the expansion function, which is named `Salsa20_init`: + +``` +$include 182-189 code/salsa20/Salsa20.cry +``` + +Note that we were careful to say a _portion_ of the Salsa20 expansion function. +There is also a Cryptol implementation of the full expansion function, named +`Salsa20_expansion`: + +``` +$include 179-180 code/salsa20/Salsa20.cry +``` + +This calls `Salsa20_init` followed by `Salsa20`, the latter of which performs +hashing. Importantly, `new_raw` does _not_ do any hashing on its own, just +initialization. For this reason, we want to use `Salsa20_init` as the reference +implementation of `new_raw`, not `Salsa20_expansion`. + +Alright, time to write a SAW spec. The first part of the spec is straightforward: + +``` +$include 97-106 code/salsa20/salsa20-new_raw-fail1.saw +``` + +As is usually the case, the postconditions are the tricky part. We know that +the behavior of `new_raw` will roughly coincide with the `Salsa20_init` +function, so let's try that first: + +``` +$include 108-112 code/salsa20/salsa20-new_raw-fail1.saw +``` + +If we attempt to verify this using `mir_verify`: + +``` +$include 115-118 code/salsa20/salsa20-new_raw-fail1.saw +``` + +SAW complains thusly: + +``` +Cryptol error: +[error] at salsa20.saw:109:45--109:54: + Type mismatch: + Expected type: 16 + Inferred type: 8 + Context: [ERROR] _ + When checking type of 2nd tuple field +``` + +Here, the 2nd tuple field is the `nonce_arr` in `Salsa20_init(key_arr, +nonce_arr)`. And sure enough, `Salsa20_init` expects the 2nd tuple field to be +a sequence of 16 elements, but `nonce_arr` only has 8 elements. Where do we get +the remaining 8 elements from? + +The answer to this question can be found by looking at the implementation of +`new_raw` more closely. Let's start at this code: + +``` rust +$include 35-36 code/salsa20/src/core.rs +``` + +This will chunk up `iv` (the nonce) into two 4-byte chunks and copies them over +to the elements of `state` array at indices `6` and `7`. This is immediately +followed by two updates at indices `8` and `9`, which are updated to be `0`: + +``` rust +$include 39-40 code/salsa20/src/core.rs +``` + +If you take the two 4-bytes chunks of `iv` and put two 4-byte `0` values after +them, then you would have a total of 16 bytes. This suggests that the nonce +value that `Salsa20_init` expects is actually this: + +``` +nonce_arr # zero : [16][8] +``` + +Where `zero : [8][8]` is a Cryptol expression that returns all zeroes, and +`(#)` is the Cryptol operator for concatenating two sequences together. Let's +update `new_raw_spec` to reflect this: + +``` +$include 109-109 code/salsa20/salsa20-new_raw-fail2.saw +``` + +This is closer to what we want, but not quite. SAW still complains: + +``` +could not match specified value with actual value: + ... + type of actual value: [u32; 16] + type of specified value: [u8; 64] +``` + +This is because `Salsa20_init` returns something of type `[64][8]`, which +corresponds to the Rust type `[u8; 64]`. `self.state`, on the other hand, is of +type `[u32; 16]`. These types are very close, as they both contain the same +number of bytes, but they are chunked up differently. Recall the code that +copies the nonce value over to `self.state`: + +``` rust +$include 35-36 code/salsa20/src/core.rs +``` + +In order to resolve the type differences between `iv` and `state`, this code +needed to explicitly convert `iv` to little-endian form using the +[`u32::from_le_bytes`](https://doc.rust-lang.org/std/primitive.u32.html#method.from_le_bytes) +function. There is a similar Cryptol function in `Salsa20.cry` named +`littleendian_state`: + +``` +$include 131-132 code/salsa20/Salsa20.cry +``` + +Note that `[64][8]` is the Cryptol equivalent of `[u8; 64]`, and `[16][32]` is +the Cryptol equivalent of `[u32; 16]`. As such, this is exactly the function +that we need to resolve the differences in types: + +``` +$include 109-109 code/salsa20/salsa20-reference.saw +``` + +With that change, SAW is finally happy with `new_raw_spec` and successfully +verifies it. + +There is an interesting connection between the `new_raw` and `counter_setup` +functions. Both functions perform in-place updates on `state` at indices `8` +and `9`. Whereas `new_raw` always sets these elements of `state` to `0`, +`counter_setup` will set them to the bits of the `counter` argument (after +converting `counter` to little-endian form). This means that if you invoke +`counter_setup` right after `new_raw`, then `counter_setup` would overwrite the +`0` values with the `counter` argument. In order words, it would be tantamount +to initializing `state` like so: + +``` +littleendian_state (Salsa20_init(key, nonce # littleendian_inverse counter)) +``` + +Where `littleendian_inverse` (a sibling of `littleendian_state`) converts a +`[64]` value to a `[8][8]` one. This pattern is a curious one... + +## Verifying the `apply_keystream` function (second attempt) + +Let's now return to the problem of linking `apply_keystream` up to +`Salsa20_encrypt`. In particular, let's take a closer look at the definition of +`Salsa20_encrypt` itself: + +``` +$include 198-201 code/salsa20/Salsa20.cry +``` + +Does anything about this definition strike you as interesting? Take a look at +the `v#(littleendian_inverse i)` part—we _just_ saw a use of +`littleendian_inverse` earlier in our discussion about initializing the +`state`! Moreover, `v` is the nonce argument, so it is becoming clearer that +`Sals20_encrypt` is creating an initial state is much the same way that +`new_raw` is. + +A related question: what is the `i` value? The answer is somewhat technical: +the Salsa20 encryption function is designed to work with messages with +differing numbers of bytes (up to `2^^70` bytes, to be exact). Each 8-byte +chunk in the message will be encrypted with a slightly difference nonce. For +instance, the first 8-byte chunk's nonce will have its lower 32 bits set to +`0`, the second 8-byte chunk's nonce will have its lower 32 bits set to `1`, +and so on. In general, the `i`th 8-byte chunk's nonce will have its lower 32 +bits set to `i`, and this corresponds exactly to the `i` in the expression +`littleendian_inverse i`. + +Note, however, that `apply_keystream` only ever uses a message that consists of +exactly eight 8-byte chunks. This means that `Salsa20_encrypt` will only ever +invoke `Salsa20_expansion` once with a nonce value where the lower 32 bits are +set to `0`. That is, it will perform encryption with an initial state derived +from: + +``` +Salsa20_init(k, v#(littleendian_inverse zero)) +``` + +Which can be further simplified to `Salsa20_init(k, v # zero)`. This is very +nearly what we want, as this gives us the behavior of the Rust `new_raw` +function. There's just one problem though: it doesn't take the behavior of +`counter_setup` into account. How do we go from `zero` to `littleendian_inverse +counter`? + +While `Salsa20_encrypt` doesn't take counters into account at all, it is not +too difficult to generalize `Salsa20_encrypt` in this way. There is a variant +of `Salsa20_encrypt` in the same file named `Salsa20_encrypt_with_offset`, +where the offset argument `o` serves the same role that `counter` does in +`counter_setup`: + +``` +$include 191-196 code/salsa20/Salsa20.cry +``` + +(Observe that `Salsa20_encrypt(count, k, v, m)` is equivalent to +`Salsa20_encrypt_with_offset(count, k, v, 0, m)`.) + +At long last, we have discovered the connection between `apply_keystream` and +the Salsa20 spec. If you assume that you invoke `new_raw` beforehand, then the +behavior of `apply_keystream` corresponds exactly to that of +`Salsa20_encrypt_with_offset`. This insight will inform us how to write an +alternative SAW spec for `apply_keystream`: + +``` +$include 149-160 code/salsa20/salsa20-apply_keystream_alt-fail1.saw +``` + +Observe the following differences between `apply_keystream_alt_spec` and our +earlier `apply_keystream_spec`: + +1. In `apply_keystream_alt_spec`, we declare fresh `key` and `nonce` values, + which weren't present at all in `apply_keystream_spec`. + +2. In `apply_keystream_alt_spec`, we no longer make `self_state` a fresh, + unconstrained value. Instead, we declare that it must be the result of + calling `Salsa20_init` on the `key`, `nonce`, and `counter` values. This + is the part that encodes the assumption that `new_raw` was invoked + beforehand. + +The parts of the spec relating to `output` remain unchanged: + +``` +$include 162-167 code/salsa20/salsa20-apply_keystream_alt-fail1.saw +``` + +The postconditions are slightly different in `apply_keystream_alt_spec`. While +the parts relating to `self_ref` remain unchanged, we now have `output_ref` +point to the results of calling `Salsa20_encrypt_with_offset`: + +``` +$include 169-172 code/salsa20/salsa20-apply_keystream_alt-fail1.saw +``` + +Tying this all together, we call `mir_verify`, making sure to use compositional +overrides involving `counter_setup` and `rounds`: + +``` +$include 175-178 code/salsa20/salsa20-apply_keystream_alt-fail1.saw +``` + +At long last, it is time to run SAW on this. When we do, we see this: + +``` +[15:11:44.576] Checking proof obligations salsa20/10e438b3::core#1[0]::{impl#0}[0]::apply_keystream[0]::_inst6e4a2d7250998ef7[0] ... +``` + +After this, SAW loops forever. Oh no! While somewhat disheartening, this is a +reality of SMT-based verification that we must content with. SMT solvers are +extremely powerful, but their performance can sometimes be unpredictable. The +task of verifying `apply_keystream_alt_spec` is _just_ complicated enough that +Z3 cannot immediately figure out that the proof is valid, so it resorts to much +slower algorithms to solve proof goals. + +We could try waiting for Z3 to complete, but we'd be waiting for a long time. +It's not unheard of for SMT solvers to take many hours on especially hard +problems, but we don't have that many hours to spare. We should try a slightly +different approach instead. + +When confronted with an infinite loop in SAW, there isn't a one-size-fits-all +solution that will cure the problem. Sometimes, it is worth stating your SAW +spec in a slightly different way such that the SMT solver can spot patterns +that it couldn't before. Other times, it can be useful to try and break the +problem up into smaller functions and use compositional verification to handle +the more complicated subfunctions. As we mentioned before, the performance of +SMT solvers in unpredictable, and it's not always obvious what the best +solution is. + +In this example, however, the problem lies with Z3 itself. As it turns out, +Yices (a different SMT solver) _can_ spot the patterns needed to prove +`apply_keystream_alt_spec` immediately. Fortunately, SAW includes support for +both Z3 and Yices. In order to switch from Z3 to Yices, swap out the `z3` proof +script with `yices`: + +``` +$include 175-178 code/salsa20/salsa20-reference.saw +``` + +After doing this, SAW is leverage Yices to solve the proof goals almost +immediately: + +``` +[15:22:00.745] Proof succeeded! salsa20/10e438b3::core#1[0]::{impl#0}[0]::apply_keystream[0]::_instfa33e77d840484a0[0] +``` + +And with that, we're finally done! You've successfully completed a non-trivial +SAW exercise in writing some interesting proofs. Give yourself a well-deserved +pat on the back. + +The process of developing these proofs was bumpy at times, but that is to be +expected. You very rarely get a proof correct on the very first try, and when +SAW doesn't accept your proof, it is important to be able to figure out what +went wrong and how to fix it. This is a skill that takes some time to grow, but +with enough time and experience, you will be able to recognize common pitfalls. +This case study showed off some of these pitfalls, but there are likely others. diff --git a/doc/rust-tutorial/compound-data-types.md b/doc/rust-tutorial/compound-data-types.md new file mode 100644 index 0000000000..a0f8618593 --- /dev/null +++ b/doc/rust-tutorial/compound-data-types.md @@ -0,0 +1,503 @@ +# Compound data types + +Besides integer types and reference types, Rust also features a variety of other +interesting data types. This part of the tutorial will briefly go over some of +these data types and how to interface with them in SAW. + +## Array types + +Rust includes array types where the length of the array is known ahead of time. +For instance, this `index` function takes an `arr` argument that must contain +exactly three `u32` values: + +``` rust +$include 1-3 code/arrays.rs +``` + +While Rust is good at catching many classes of programmer errors at compile +time, one thing that it cannot catch in general is out-of-bounds array +accesses. In this `index` example, calling the function with a value of `idx` +ranging from `0` to `2` is fine, but any other choice of `idx` will cause the +program to crash, since the `idx` will be out of the bounds of `arr`. + +SAW is suited to checking for these sorts of out-of-bound accesses. Let's write +an incorrect spec for `index` to illustrate this: + +``` +$include 3-14 code/arrays-fail.saw +``` + +Before we run this with SAW, let's highlight some of the new concepts that this +spec uses: + +1. The type of the `arr` variable is specified using `mir_array 3 mir_u32`. + Here, the `mir_array` function takes the length of the array and the element + type as arguments, just as in Rust. +2. The spec declares the return value to be `{{ arr @ idx }}`, where `@` is + Cryptol's indexing operator. Also note that it is completely valid to embed + a MIR array type into a Cryptol expression, as Cryptol has a sequence type + that acts much like arrays do in MIR. + +As we hinted above, this spec is wrong, as it says that this should work for +_any_ possible values of `idx`. SAW will catch this mistake: + +``` +$ saw arrays-fail.saw + + + +[21:03:05.374] Loading file "arrays-fail.saw" +[21:03:05.411] Verifying arrays/47a26581::index[0] ... +[21:03:05.425] Simulating arrays/47a26581::index[0] ... +[21:03:05.426] Checking proof obligations arrays/47a26581::index[0] ... +[21:03:05.445] Subgoal failed: arrays/47a26581::index[0] index out of bounds: the length is move _4 but the index is _3 +[21:03:05.445] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 53} +[21:03:05.445] ----------Counterexample---------- +[21:03:05.445] idx: 2147483648 +[21:03:05.445] Stack trace: +"mir_verify" (arrays-fail.saw:14:1-14:11) +Proof failed. +``` + +We can repair this spec by adding some preconditions: + +``` +$include 3-12 code/arrays.saw +``` + +An alternative way of writing this spec is by using SAW's `mir_array_value` +command: + +``` +sawscript> :type mir_array_value +MIRType -> [MIRValue] -> MIRValue +``` + +Here, the `MIRType` argument represents the element type, and the list of +`MIRValue` arguments are the element values of the array. We can rewrite +`index_spec` using `mir_array_value` like so: + +``` +$include 18-30 code/arrays.saw +``` + +Here, `[arr0, arr1, arr2]` is Cryptol notation for constructing a length-3 +sequence consisting of `arr0`, `arr1`, and `arr2` as the elements. +`index_alt_spec` is equivalent to `index_spec`, albeit more verbose. For this +reason, it is usually preferable to use `mir_fresh_var` to create an entire +symbolic array rather than creating separate symbolic values for each element +and combining them with `mir_array_value`. + +There are some situations where `mir_array_value` is the only viable choice, +however. Consider this variant of the `index` function: + +``` rust +$include 5-7 code/arrays.rs +``` + +When writing a SAW spec for `index_ref_arr`, we can't just create a symbolic +variable for `arr` using `mir_alloc (mir_array 3 ...)`, as the reference values +in the array wouldn't point to valid memory. Instead, we must individually +allocate the elements of `arr` using separate calls to `mir_alloc` and then +build up the array using `mir_array_value`. (As an exercise, try writing and +verifying a spec for `index_ref_arr`). + +## Tuple types + +Rust includes tuple types where the elements of the tuple can be of different +types. For example: + +``` rust +$include 1-3 code/tuples.rs +``` + +SAW includes a `mir_tuple` function for specifying the type of a tuple value. +In addition, one can embed MIR tuples into Cryptol, as Cryptol also includes +tuple types whose fields can be indexed with `.0`, `.1`, etc. Here is a spec +for `flip` that makes use of all these features: + +``` +$include 3-9 code/tuples.saw +``` + +SAW also includes a `mir_tuple_value` function for constructing a tuple value +from other `MIRValue`s: + +``` +sawscript> :type mir_tuple_value +[MIRValue] -> MIRValue +``` + +`mir_tuple_value` plays a similar role for tuples as `mir_array_value` does for +arrays. + +## Struct types + +Rust supports the ability for users to define custom struct types. Structs are +uniquely identified by their names, so if you have two structs like these: + +``` rust +$include 1-2 code/structs.rs +``` + +Then even though the fields of the `S` and `T` structs are the same, they are +_not_ the same struct. This is a type system feature that Cryptol does not +have, and for this reason, it is not possible to embed MIR struct values into +Cryptol. It is also not possible to use `mir_fresh_var` to create a symbolic +struct value. Instead, one can use the `mir_struct_value` command: + +``` +sawscript> :type mir_struct_value +MIRAdt -> [MIRValue] -> MIRValue +``` + +Like with `mir_array_value` and `mir_tuple_value`, the `mir_struct_value` +function takes a list of `MIRValue`s as arguments. What makes +`mir_struct_value` unique is its `MIRAdt` argument, which we have not seen up +to this point. In this context, "`Adt`" is shorthand for "[algebraic data +type](https://en.wikipedia.org/wiki/Algebraic_data_type)", and Rust's structs +are an example of ADTs. (Rust also supports enums, another type of ADT that we +will see later in this tutorial.) + +ADTs in Rust are named entities, and as such, they have unique identifiers in +the MIR JSON file in which they are defined. Looking up these identifiers can +be somewhat error-prone, so SAW offers a `mir_find_adt` command that computes +an ADT's identifier and returns the `MIRAdt` associated with it: + +``` +sawscript> :type mir_find_adt +MIRModule -> String -> [MIRType] -> MIRAdt +``` + +Here, `MIRModule` correspond to the MIR JSON file containing the ADT +definition, and the `String` is the name of the ADT whose identifier we want to +look up. The list of `MIRType`s represent types to instantiate any type +parameters to the struct (more on this in a bit). + +As an example, we can look up the `S` and `T` structs from above like so: + +``` +$include 3-6 code/structs.saw +``` + +We pass an empty list of `MIRType`s to each use of `mir_find_adt`, as neither +`S` nor `T` have any type parameters. An example of a struct that does include +type parameters can be seen here: + +``` rust +$include 12-12 code/structs.rs +``` + +As mentioned before, SAW doesn't support generic definitions out of the box, so +the only way that we can make use of the `Foo` struct is by looking up a +particular instantiation of `Foo`'s type parameters. If we define a function +like this, for example: + +``` rust +$include 14-16 code/structs.rs +``` + +Then this function instantiates `Foo`'s `A` type parameter with `u32` and the +`B` type parameter with `u64`. We can use `mir_find_adt` to look up this +particular instantiation of `Foo` like so: + +``` +$include 7-7 code/structs.saw +``` + +In general, a MIR JSON file can have many separate instantiations of a single +struct's type parameters, and each instantiation must be looked up separately +using `mir_find_adt`. + +Having looked up `Foo` using `mir_find_adt`, let's use the resulting +`MIRAdt` in a spec: + +``` +$include 9-18 code/structs.saw +``` + +Note that we are directly writing out the values `27` and `42` in Cryptol. +Cryptol's numeric literals can take on many different types, so in order to +disambiguate which type they should be, we give each numeric literal an +explicit type annotation. For instance, the expression `27 : [32]` means that +`27` should be a 32-bit integer. + +### Symbolic structs + +Let's now verify a function that takes a struct value as an argument: + +``` rust +$include 18-22 code/structs.rs +``` + +Moreover, let's verify this function for all possible `Bar` values. One way to +do this is to write a SAW spec that constructs a struct value whose fields are +themselves symbolic: + +``` +$include 20-38 code/structs.saw +``` + +This is a rather tedious process, however, as we had to repeatedly use +`mir_fresh_var` to create a fresh, symbolic value for each field. Moreover, +because `mit_fresh_var` does not work for structs, we had to recursively apply +this process in order to create a fresh `Foo` value. It works, but it takes a +lot of typing to accomplish. + +To make this process less tedious, SAW offers a `mir_fresh_expanded_value` +command that allows one to create symbolic values of many more types. While +`mir_fresh_var` is limited to those MIR types that can be directly converted to +Cryptol, `mir_fresh_expanded_value` can create symbolic structs by automating +the process of creating fresh values for each field. This process also applies +recursively for struct fields, such as the `Foo` field in `Bar`. + +As an example, a much shorter way to write the spec above using +`mir_fresh_expanded_value` is: + +``` +$include 42-48 code/structs.saw +``` + +That's it! Note that the string `"b"` is used as a prefix for all fresh names +that `mir_fresh_expanded_value` generates, so if SAW produces a counterexample +involving this symbolic struct value, one can expect to see names such as +`b_0`, `b_1`, etc. for the fields of the struct. + +`mir_fresh_expanded_value` makes it easier to construct large, compound values +that consist of many smaller, inner values. The drawback is that you can't +refer to these inner values in the postconditions of a spec. As a result, there +are some functions for which `mir_fresh_expanded_value` isn't suitable, so keep +this in mind before reaching for it. + +## Enum types + +Besides structs, another form of ADT that Rust supports are enums. Each enum +has a number of different _variants_ that describe the different ways that an +enum value can look like. A famous example of a Rust enum is the `Option` type, +which is defined by the standard library like so: + +``` rust +enum Option { + None, + Some(T), +} +``` + +`Option` is commonly used in Rust code to represent a value that may be present +(`Some`) or absent (`None`). For this reason, we will use `Option` as our +motivating example of an enum in this section. + +First, let's start by defining some functions that make use of `Option`'s +variants: + +``` rust +$include 1-7 code/enums.rs +``` + +Both functions return an `Option` value, but each function returns a +different variant. In order to tell these variants apart, we need a SAW +function which can construct an enum value that allows the user to pick which +variant they want to construct. The `mir_enum_value function does exactly that: + +``` +sawscript> :type mir_enum_value +MIRAdt -> String -> [MIRValue] -> MIRValue +``` + +Like `mir_struct_value`, `mir_enum_value` also requires a `MIRAdt` argument in +order to discern which particular enum you want. Unlike `mir_struct_value`, +however, it also requires a `String` which variant of the enum you want. In the +case of `Option`, this `String` will either be `"None"` or `"Some"`. Finally, +the `[MIRValue]` arguments represent the fields of the enum variant. + +Let's now verify some enum-related code with SAW. First, we must look up the +`Option` ADT, which works just as if you had a struct type: + +``` +$include 5-5 code/enums.saw +``` + +Next, we can use this ADT to construct enum values. We shall use +`mir_enum_value` to create a `Some` value in the spec for `i_found_something`: + +``` +$include 7-16 code/enums.saw +``` + +Note that while we used the full identifier `core::option::Option` to look up +the `Option` ADT, we do not need to use the `core::option` prefix when +specifying the `"Some"` variant. This is because SAW already knows what the +prefix should be from the `option_u32` ADT, so the `"Some"` shorthand suffices. + +Similarly, we can also write a spec for `i_got_nothing`, which uses the `None` +variant: + +``` +$include 18-25 code/enums.saw +``` + +### Symbolic enums + +In order to create a symbolic struct, one could create symbolic fields and pack +them into a larger struct value using `mir_struct_value`. The same process is +not possible with `mir_enum_value`, however, as a symbolic enum value would +need to range over _all_ possible variants in an enum. + +Just as `mir_fresh_expanded_value` supports creating symbolic structs, +`mir_fresh_expanded_value` also supports creating symbolic enum values. For +example, given this function that accepts an `Option` value as an +argument: + +``` rust +$include 9-11 code/enums.rs +``` + +We can write a spec for this function that considers all possible `Option` +values like so: + +``` +$include 27-33 code/enums.saw +``` + +Here, `o` can be a `None` value, or it can be a `Some` value with a symbolic +field. + +## Slices + +Slices are a particular type of reference that allow referencing contiguous +sequences of elements in a collection, such as an array. Unlike ordinary +references (e.g., `&u32`), SAW does not permit allocating a slice directly. +Instead, one must take a slice of an existing reference. To better illustrate +this distinction, consider this function: + +``` rust +$include 1-3 code/slices.rs +``` + +`sum_of_prefix` takes a slice to a sequence of `u32`s as an argument, indexes +into the first two elements in the sequence, and adds them together. There are +many possible ways we can write a spec for this function, as the slice argument +may be backed by many different sequences. For example, the slice might be +backed by an array whose length is exactly two: + +``` rust +$include 6-8 code/slices.rs +``` + +We could also make a slice whose length is longer than two: + +``` rust +$include 10-12 code/slices.rs +``` + +Alternatively, the slice might be a subset of an array whose length is longer +than two: + +``` rust +$include 14-16 code/slices.rs +``` + +All of these are valid ways of building the slice argument to `sum_of_prefix`. +Let's try to write SAW specifications that construct these different forms of +slices. To do so, we will need SAW functions that take a reference to a +collection (e.g., an array) and converts them into a slice reference. The +`mir_slice_value` function is one such function: + +``` +sawscript> :type mir_slice_value +MIRValue -> MIRValue +``` + +`mir_slice_value arr_ref` is the SAW equivalent of writing `arr_ref[..]`. That +is, if `arr_ref` is of type `&[T; N]`, then `mir_slice_value arr_ref` is of +type `&[T]`. Note that `arr_ref` must be a _reference_ to an array, not an +array itself. + +Let's use `mir_slice_value` to write a spec for `sum_of_prefix` when the slice +argument is backed by an array of length two: + +``` +$include 5-15 code/slices.saw +``` + +The first part of this spec allocates an array reference `a_ref` and declares +that it points to a fresh array value `a_val`. The next part declares a slice +`s` that is backed by the entirety of `a_ref`, which is then passed as an +argument to the function itself. Finally, the return value is declared to be +the sum of the first and second elements of `a_val`, which are the same values +that back the slice `s` itself. + +As noted above, the `sum_of_prefix` function can work with slices of many +different lengths. Here is a slight modification to this spec that declares it +to take a slice of length 5 rather than a slice of length 2: + +``` +$include 19-29 code/slices.saw +``` + +Both of these examples declare a slice whose length matches the length of the +underlying array. In general, there is no reason that these have to be the +same, and it is perfectly fine for a slice's length to be less than the the +length of the underlying array. In Rust, for example, we can write a slice of a +subset of an array by writing `&arr_ref[0..2]`. The SAW equivalent of this can +be achieved with the `mir_slice_range_value` function: + +``` +sawscript> :type mir_slice_range_value +MIRValue -> Int -> Int -> MIRValue +``` + +`mir_slice_range_value` takes takes two additional `Int` arguments that +represent (1) the index to start the slice from, and (2) the index at which the +slice ends. For example, `mir_slice_range_value arr_ref 0 2` creates a slice +that is backed by the first element (index `0`) and the second element (index +`1`) of `arr_ref`. Note that the range `[0..2]` is half-open, so this range +does _not_ include the third element (index `2`). + +For example, here is how to write a spec for `sum_of_prefix` where the slice is +a length-2 subset of the original array: + +``` +$include 33-43 code/slices.saw +``` + +Note that both `Int` arguments to `mir_slice_range_value` must be concrete +(i.e., not symbolic). (See the section below if you want an explanation for why +they are not allowed to be symbolic.) + +### Aside: slices of arbitrary length + +After reading the section about slices above, one might reasonably wonder: is +there a way to write a more general spec for `sum_of_prefix`: that covers all +possible slice lengths `n`, where `n` is greater than or equal to 2? In this +case, the answer is "no". + +This is a fundamental limitation of the way SAW's symbolic execution works. The +full reason for why this is the case is somewhat technical (keep reading if you +want to learn more), but the short answer is that if SAW attempts to +simulate code whose length is bounded by a symbolic integer, then SAW will go +into an infinite loop. To avoid this pitfall, the `mir_slice_range_value` +function very deliberately requires the start and end values to be concrete +integers, as allowing these values to be symbolic would allow users to +inadvertently introduce infinite loops in their specifications. + +A longer answer as to why SAW loops forever on computations that are bounded by +symbolic lengths: due to the way SAW's symblolic execution works, it creates a +complete model of the behavior of a function for all possible inputs. The way +that SAW achieves this is by exploring all possible execution paths through a +program. If a program involves a loop, for example, then SAW will unroll all +iterations of the loop to construct a model of the loop's behavior. Similarly, +if a sequence (e.g., a slice or array) has an unspecified length, then SAW must +consider all possible lengths of the array. + +SAW's ability to completely characterize the behavior of all paths through a +function is one of its strengths, as this allows it to prove theorems that +other program verification techniques would not. This strength is also a +weakness, however. If a loop has a symbolic number of iterations, for example, +then SAW will spin forever trying to unroll the loop. Similarly, if a slice +were to have a symbolic length, then SAW would spin forever trying to simulate +the program for all possible slice lengths. + +In general, SAW cannot prevent users from writing programs whose length is +bounded by a symbolic value. For now, however, SAW removes one potential +footgun by requiring that slice values always have a concrete length. diff --git a/doc/rust-tutorial/doc.css b/doc/rust-tutorial/doc.css deleted file mode 100644 index 08327aa2df..0000000000 --- a/doc/rust-tutorial/doc.css +++ /dev/null @@ -1,93 +0,0 @@ -body { - font-size: 14px; - line-height: 21px; - color: #333; - font-family: "Helvetica Neue", "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, sans-serif !important; -} -.container { - width: 950px; - margin: 0; - padding: 80px 0px 50px 50px; -} -p, li { - width: 625px; -} -a { - color: #191933; -} -h1, h2, h3, h4, h5, h6, b.header { - color: #000; - margin-top: 40px; - margin-bottom: 15px; - text-shadow: #fff 0 1px 1px; -} -h1 { font-size: 18px } -h2 { font-size: 16px } -h3, h4, h5, h6 { font-size: 14px } -.author { font-weight: normal } - -br.clear { - height: 0; - clear: both; -} -ul { - padding-left: 20px; -} -b.header { - display: block; -} -li { - margin-bottom: 10px; -} -code, pre, tt, textarea { - font-family: Monaco, Consolas, "Lucida Console", monospace; - font-size: 12px; - line-height: 18px; - color: #155; - white-space: pre-wrap; - word-wrap: break-word; -} - tt { - display: inline-block; - background: #fff; - border: 1px solid #dedede; - padding: 0px 0.2em; - } - pre { - border-left: 5px solid rgba(0,0,0,0.2); - padding: 3px 0 3px 12px; - font-size: 12px; - } - pre.no_bar { - border-left: 0; - margin-left: 0; - padding-left: 0; - } -div.code { - position: relative; - background: #fff; - border: 1px solid #d8d8d8; - -webkit-box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - -moz-box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - zoom: 1; -} - div.code { - text-transform: none; - position: absolute; - right: 8px; bottom: 8px; - } - div.code { - left: 8px; right: auto; - } - div.code pre, div.code textarea { - float: left; - width: 450px; - background: #fff; - border-left: 1px dotted #d0d0d0; - margin: 10px 0 15px 3px; - padding: 0 0 0 12px; - } - div.code pre:first-child { - border-left: 0; - } diff --git a/doc/rust-tutorial/figures/galois.pdf b/doc/rust-tutorial/figures/galois.pdf deleted file mode 100644 index 58cbef37a024e8ce3904c4a3b45faf66e4eee23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10165 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μ49xYOnz=bLu?t{vG*cgM&onAY4( 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 oC!_h7>>0w-%fZbRpbJ$M6crL;D_2e%GFumAu6 diff --git a/doc/rust-tutorial/galois-whitepaper.cls b/doc/rust-tutorial/galois-whitepaper.cls deleted file mode 100644 index 9e47c94810..0000000000 --- a/doc/rust-tutorial/galois-whitepaper.cls +++ /dev/null @@ -1,143 +0,0 @@ -% This class file defines a style useful for writing whitepapers at Galois. -\ProvidesClass{galois-whitepaper}[2010/11/02 Galois whitepaper class] -\newif\if@xelatex -\@xelatexfalse -\DeclareOption{xelatex}{\@xelatextrue} -\DeclareOption*{% -\PassOptionsToClass{\CurrentOption}{article}% -} -\ProcessOptions\relax -\LoadClass{article} - -% Useful packages: -% \RequirePackage[table]{xcolor} -\RequirePackage{graphicx} -%\RequirePackage[headheight=144pt,top=1in,left=1in,right=1in,bottom=1in]{geometry} -\RequirePackage[top=1in,left=1in,right=1in,bottom=1in]{geometry} -\RequirePackage{lastpage} - -% Define fonts -\if@xelatex -\RequirePackage{fontspec} -\RequirePackage{xunicode} -\RequirePackage{xltxtra} -\setmainfont[Mapping=tex-text]{Palatino} -\setsansfont[Mapping=tex-text]{Arial} -\else -\RequirePackage[sc]{mathpazo} -\linespread{1.05} -\RequirePackage[scaled]{helvet} -\fi - -\RequirePackage{sectsty} -\allsectionsfont{\sffamily} - -\newcommand{\highlight}[2][yellow]{\colorbox{#1}{#2}} - -% Misc defines -\makeatletter - \newcommand{\@companyName}{Galois, Inc.} - \newcommand{\@addressPhone}{ - 421 SW 6th Ave., Ste.\ 300\\ - Portland, OR 97204 - } - \newcommand{\@contact}{\todo[Contact]} - \newcommand{\@subtitle}{TODO: Subtitle} - \newcommand{\contact}[1]{\renewcommand{\@contact}{{#1}}} -\makeatother - -\renewcommand{\paragraph}[1]{\textbf{\sffamily{#1}}\quad} - -% \definecolor{galoislightgray}{gray}{0.6} -% Define header and footer -\RequirePackage{fancyhdr} -\pagestyle{fancy} -\fancyheadoffset[l]{1in} -\fancyheadoffset[r]{0in} -%\fancyheadoffset[r]{0.2in} -\fancyhead{}%clear -\fancyfoot{}%clear -\renewcommand{\headrulewidth}{0pt} -\renewcommand{\footrulewidth}{1pt} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% Define a special header style for the title page: -% - \makeatletter - \newcommand{\ps@title}{% - \renewcommand{\@oddhead}{% - \sffamily\includegraphics[width=1in]{figures/galois.pdf} - }} -\makeatother - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% Set up the headers/footers for the rest of the document: -%% -\lhead{\sffamily\hspace{1in}\includegraphics[width=1in]{figures/galois.pdf}} - -\makeatletter -\rhead{\sffamily \textit{\@title{}}} -\makeatother - -\lfoot{\sffamily\color{lightgray}\small\copyright{} 2023 Galois, Inc.} - -\rfoot{ - % \sffamily \color{galoislightgray}\small - \sffamily \color{lightgray}\small - Page \thepage{}% of \pageref{LastPage} -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% The title content definition: -%% -\makeatletter -\DeclareRobustCommand{\maketitle}{ - \thispagestyle{title} - \begin{center} - {\sffamily - {\large \textbf{}}\\ - \vspace{0.3in} - \textbf{\sffamily \LARGE \@title}\\ - %\vspace{0.5in} - %{ \@author }\\ - \vspace{0.3in} - {\large \@companyName }\\ - \vspace{0.025in} - {\small \@addressPhone }\\ - } - \end{center} -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% Add a stop ``.'' after each section number: -%% - -% Redefine the bibliography environment to use \section{\bibname} -% instead of \section*{\bibname} -\newcommand{\bibname}{References} -\renewenvironment{thebibliography}[1] - {\section*{\bibname}% <-- this line was changed from \chapter* to \section* - \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}% - \list{\@biblabel{\@arabic\c@enumiv}}% - {\settowidth\labelwidth{\@biblabel{#1}}% - \leftmargin\labelwidth - \advance\leftmargin\labelsep - \@openbib@code - \usecounter{enumiv}% - \let\p@enumiv\@empty - \renewcommand\theenumiv{\@arabic\c@enumiv}}% - \sloppy - \clubpenalty4000 - \@clubpenalty \clubpenalty - \widowpenalty4000% - \sfcode`\.\@m} - {\def\@noitemerr - {\@latex@warning{Empty `thebibliography' environment}}% - \endlist} - -\makeatother diff --git a/doc/rust-tutorial/introduction.md b/doc/rust-tutorial/introduction.md new file mode 100644 index 0000000000..8110d9a812 --- /dev/null +++ b/doc/rust-tutorial/introduction.md @@ -0,0 +1,24 @@ +# Introduction + +SAW is a special-purpose programming environment developed by Galois to help +orchestrate and track the results of the large collection of proof tools +necessary for analysis and verification of complex software artifacts. + +SAW adopts the functional paradigm, and largely follows the structure of many +other typed functional languages, with some special features specifically +targeted at the coordination of verification and analysis tasks. + +This tutorial introduces the details of the language by walking through several +examples, and showing how simple verification tasks can be described. The +complete examples are available [on +GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code). +Most of the examples make use of inline specifications written in Cryptol, a +language originally designed for high-level descriptions of cryptographic +algorithms. For readers unfamiliar with Cryptol, various documents describing +its use are available [here](http://cryptol.net/documentation.html). + +This tutorial also include a [case study](#case-study-salsa20) on how to use +SAW to verify a real-world implementation of the Salsa20 stream cipher based on +the [`stream-ciphers`](https://github.com/RustCrypto/stream-ciphers) Rust +project. The code for this case study is also available [on +GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20). diff --git a/doc/rust-tutorial/overrides-and-compositional-verification.md b/doc/rust-tutorial/overrides-and-compositional-verification.md new file mode 100644 index 0000000000..900824f08b --- /dev/null +++ b/doc/rust-tutorial/overrides-and-compositional-verification.md @@ -0,0 +1,350 @@ +# Overrides and compositional verification + +Up until this point, all uses of `mir_verify` in this tutorial have provided an +empty list (`[]`) of overrides. This means that any time SAW has simulated a +function which calls another function, it will step into the definition of the +callee function and verify its behavior alongside the behavior of the callee +function. This is a fine thing to do, but it can be inefficient. For example, +consider a function like this: + +``` rust +$include 5-9 code/overrides.rs +``` + +Here, the caller function `f` invokes the callee function `g` three separate +times. If we verify `f` with `mir_verify` as we have done up until this point, +then SAW must analyze the behavior of `g` three separate times. This is +wasteful, and especially so if `g` is a large and complicated function. + +This is where _compositional verification_ enters the picture. The idea behind +compositional verification is that when we prove properties of a caller +function, we can reuse properties that we have already proved about callee +functions. These properties are captured as _override specifications_, which +are also referred to by the shorthand term _overrides_. When a caller invokes a +callee with a corresponding override specification, the override's properties +are applied without needing to re-simulate the entire function. + +As it turns out, the command needed to produce an override specification is +already familiar to us—it's `mir_verify`! If you examine the type of this +command: + +``` +sawscript> :type mir_verify +MIRModule -> String -> [MIRSpec] -> Bool -> MIRSetup () -> ProofScript () -> TopLevel MIRSpec +``` + +The returned value is a `MIRSpec`, which captures the behavior of the function +that was verified as an override spec. This override can then be passed to +another call to `mir_verify` to use as part of a larger proof. + +Let's now try compositional verification in practice. To do so, we will first +prove a spec for the `g` function above. For demonstration purposes, we will +pick a simplistic implementation of `g`: + +``` rust +$include 1-3 code/overrides.rs +``` + +Note that we don't really _have_ to use compositional verification when `g` is +this simple, as SAW is capable of reasoning about `g`'s behavior directly when +proving a spec for `f`. It's still worth going along with this exercise, +however, as the same principles of compositional verification apply whether the +implementation of `g` is small or large. + +The first step of compositional verification is to prove a spec for `g`, the +callee function: + +``` +$include 5-13 code/overrides.saw +``` + +There's nothing that different about this particular proof from the proofs +we've seen before. The only notable difference is that we bind the result of +calling `mir_verify` to a `MIRSpec` value that we name `g_ov` (short for "`g` +override"). This part is important, as we will need to use `g_ov` shortly. + +The next step is to write a spec for `f`. Since `g` adds `1` to its argument, +`f` will add `3` to its argument: + +``` +$include 15-21 code/overrides.saw +``` + +Again, nothing too surprising. Now let's prove `f` against `f_spec` by using +`g_ov` as a compositional override: + +``` +$include 23-23 code/overrides.saw +``` + +Here, note that instead of passing an empty list (`[]`) as we have done before, +we now pass a list containing `g_ov`. This informs `mir_verify` that whenever +it simulates a call to `g`, it should reuse the properties captured in `g_ov`. +In general, we can pass as many overrides as we want (we will see examples of +this later in the tutorial), but for now, one override will suffice. + +Let's run the proof of `f` against `f_spec`, making sure to pay attention to +the output of SAW: + +``` +[19:06:17.392] Verifying overrides/96c5af24::f[0] ... +[19:06:17.406] Simulating overrides/96c5af24::f[0] ... +[19:06:17.407] Matching 1 overrides of overrides/96c5af24::g[0] ... +[19:06:17.407] Branching on 1 override variants of overrides/96c5af24::g[0] ... +[19:06:17.407] Applied override! overrides/96c5af24::g[0] +[19:06:17.407] Matching 1 overrides of overrides/96c5af24::g[0] ... +[19:06:17.407] Branching on 1 override variants of overrides/96c5af24::g[0] ... +[19:06:17.407] Applied override! overrides/96c5af24::g[0] +[19:06:17.407] Matching 1 overrides of overrides/96c5af24::g[0] ... +[19:06:17.407] Branching on 1 override variants of overrides/96c5af24::g[0] ... +[19:06:17.407] Applied override! overrides/96c5af24::g[0] +[19:06:17.407] Checking proof obligations overrides/96c5af24::f[0] ... +[19:06:17.422] Proof succeeded! overrides/96c5af24::f[0] +``` + +We've now proven `f` compositionally! The first two lines ("`Verifying ...`" +and "`Simulating ...`") and the last two lines ("`Checking proof obligations +...`" and "`Proof succeeded! ..."`) are the same as before, but this time, we +have some additional lines of output in between: + +* Whenever SAW prints "`Matching overrides of `", that's when you + know that SAW is about to simulate a call to ``. At that point, SAW + will check to see how many overrides (``) for `` are available. +* Whenever SAW prints "`Brancing on override variants of ", SAW is + trying to figure out which of the `` overrides to apply. In this example, + there is only a single override, so the choice is easy. In cases where there + are multiple overrides, however, SAW may have to work harder (possibly even + consulting an SMT solver) to figure out which override to use. +* If SAW successfully picks an override to apply, it will print + "`Applied override! ...`". + +In the example above, we used a single `g` override that applies for all +possible arguments. In general, however, there is no requirement that overrides +must work for all arguments. In fact, it is quite common for SAW verification +efforts to write different specifications for the same function, but with +different arguments. We can then provide multiple overrides for the same +function as part of a compositional verification, and SAW will be able to pick +the right override depending on the shape of the argument when invoking the +function being overridden. + +For example, let's suppose that we wrote different `g` specs, one where the +argument to `g` is even, and another where the argument to `g` is odd: + +``` +$include 25-44 code/overrides.saw +``` + +We can then prove `f` compositionally by passing both of the `g` overrides to +`mir_verify`: + +``` +$include 45-45 code/overrides.saw +``` + +Like before, this will successfully verify. The only different now is that SAW +will print output involving two overrides instead of just one: + +``` +[20:48:07.649] Simulating overrides/96c5af24::f[0] ... +[20:48:07.650] Matching 2 overrides of overrides/96c5af24::g[0] ... +[20:48:07.650] Branching on 2 override variants of overrides/96c5af24::g[0] ... +[20:48:07.652] Applied override! overrides/96c5af24::g[0] +... +``` + +Keep in mind that if you provide at least one override for a function as part +of a compositional verification, then SAW _must_ apply an override whenever it +invokes that function during simulation. If SAW cannot find a matching +override, then the verification will fail. For instance, consider what would +happen if you tried proving `f` like so: + +``` +$include 33-33 code/overrides-fail.saw +``` + +This time, we supply one override for `g` that only matches when the argument +is even. This is a problem, as SAW will not be able to find a matching override +when the argument is odd. Indeed, SAW will fail to verify this: + +``` +[20:53:29.588] Verifying overrides/96c5af24::f[0] ... +[20:53:29.602] Simulating overrides/96c5af24::f[0] ... +[20:53:29.602] Matching 1 overrides of overrides/96c5af24::g[0] ... +[20:53:29.602] Branching on 1 override variants of overrides/96c5af24::g[0] ... +[20:53:29.603] Applied override! overrides/96c5af24::g[0] +[20:53:29.603] Matching 1 overrides of overrides/96c5af24::g[0] ... +[20:53:29.603] Branching on 1 override variants of overrides/96c5af24::g[0] ... +[20:53:29.604] Applied override! overrides/96c5af24::g[0] +[20:53:29.604] Matching 1 overrides of overrides/96c5af24::g[0] ... +[20:53:29.604] Branching on 1 override variants of overrides/96c5af24::g[0] ... +[20:53:29.605] Applied override! overrides/96c5af24::g[0] +[20:53:29.605] Symbolic simulation completed with side conditions. +[20:53:29.606] Checking proof obligations overrides/96c5af24::f[0] ... +[20:53:29.623] Subgoal failed: overrides/96c5af24::f[0] No override specification applies for overrides/96c5af24::g[0]. +Arguments: +- c@26:bv +Run SAW with --sim-verbose=3 to see a description of each override. +[20:53:29.623] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 388} +[20:53:29.624] ----------Counterexample---------- +[20:53:29.624] x: 1 +... +Proof failed. +``` + +Here, we can see that `No override specification applies`, and SAW also +generates a counterexample of `x: 1`. Sure enough, `1` is an odd number! + +## Overrides and mutable references + +Compositional overrides provide great power, as they effectively allow you to +skip over certain functions when simulating them and replace them with simpler +implementations. With great power comes great responsibility, however. In +particular, one must be careful when using overrides for functions that modify +mutable references. If an override does not properly capture the behavior of a +mutable reference, it could potentially lead to incorrect proofs. + +This is the sort of thing that is best explained with an example, so consider +these two functions: + +``` rust +$include 1-9 code/overrides-mut.rs +``` + +The `side_effect` function does not return anything interesting; it is only +ever invoked to perform a side effect of changing the mutable reference `a` to +point to `0`. The `foo` function invokes `side_effect`, and as a result, it +will always return `0`, regardless of what the argument to `foo` is. No +surprises just yet. + +Now let's make a first attempt at verifying `foo` using compositional +verification. First, we will write a spec for `side_effect`: + +``` +$include 5-10 code/overrides-mut-fail.saw +``` + +`side_effect_spec` is somewhat odd. Although it goes through the effort of +allocating a mutable reference `a_ref` and initializing it, nothing about this +spec states that `a_ref` will point to `0` after the function has been invoked. +This omission is strange, but not outright wrong—the spec just underspecifies +what the behavior of the function is. Indeed, SAW will successfully verify this +spec using `mir_verify`: + +``` +$include 18-18 code/overrides-mut-fail.saw +``` + +Next, let's try to write a spec for `foo`: + +``` +$include 12-16 code/overrides-mut-fail.saw +``` + +At this point, alarm bells should be going off in your head. This spec +incorrectly states that `foo(x)` should return `x`, but it should actually +return `0`! This looks wrong, but consider what would happen if you tried to +verify this compositionally using our `side_effect_ov` override: + +``` +$include 19-19 code/overrides-mut-fail.saw +``` + +If SAW were to simulate `foo(x)`, it would invoke create a temporary variable +`b` and assign it to the value `x`, and then it would invoke `side_effect(&mut +b)`. At this point, the `side_effect_ov` override would apply. According to +`side_effect_spec`, the argument to `side_effect` is not modified at all after +the function returns. This means that when the `foo` function returns `b`, it +will still retain its initial value of `x`. This shows that if we were to use +`side_effect_ov`, we could prove something that's blatantly false! + +Now that we've made you sweat a little bit, it's time for some good news: SAW +won't _actually_ let you prove `foo_spec`. If you try this compositional proof +in practice, SAW will catch your mistake: + +``` +[14:50:29.170] Verifying overrides_mut/11e47708::foo[0] ... +[14:50:29.181] Simulating overrides_mut/11e47708::foo[0] ... +[14:50:29.181] Matching 1 overrides of overrides_mut/11e47708::side_effect[0] ... +[14:50:29.181] Branching on 1 override variants of overrides_mut/11e47708::side_effect[0] ... +... +State of memory allocated in precondition (at overrides-mut-fail.saw:6:12) not described in postcondition +``` + +The line of code that SAW points to in the "`State of memory ...`" error +message is: + +``` +$include 6-6 code/overrides-mut-fail.saw +``` + +SAW informs us that although we allocated the mutable reference `a_ref`, we +never indicated what it should point to after the function has returned. This +is an acceptable (if somewhat unusual) thing to do when verifying +`side_effect_spec` using `mir_verify`, but it is _not_ acceptable to do this +when using this spec as an override. To avoid unsound behavior like what is +described above, any override that allocates a mutable reference in its +preconditions _must_ declare what its value should be in the postconditions, no +exceptions. + +Thankfully, repairing this spec is relatively straightforward. Simply add a +`mir_points_to` statement in the postconditions of `side_effect_spec`: + +``` +$include 5-13 code/overrides-mut.saw +``` + +Then use the correct return value in `foo_spec`: + +``` +$include 15-21 code/overrides-mut.saw +``` + +And now the compositional proof of `foo_spec` works! + +## Unsafe overrides + +Now that we've made it this far into the tutorial, it's time to teach you a +more advanced technique: _unsafe_ overrides. Up until this point, we have +relied on SAW to check all of our work, and this is usually what you'd want +from a formal verification tool. In certain circumstances, however, it can be +useful to say "I know what I'm doing, SAW—just believe me when I say this spec +is valid!" In order to say this, you can use `mir_unsafe_assume_spec`: + +``` +sawscript> :type mir_unsafe_assume_spec +MIRModule -> String -> MIRSetup () -> TopLevel MIRSpec +``` + +`mir_unsafe_assume_spec` is `mir_verify`'s cousin who likes to live a little +more dangerously. Unlike `mir_verify`, the specification that you pass to +`mir_unsafe_assume_spec` (the `MIRSetup ()` argument) is _not_ checked for full +correctness. That is, `mir_unsafe_assume_spec` will bypass SAW's usual symbolic +execution pipeline, which is why one does not need to pass a `ProofScript` +argument (e.g., `z3`) to `mir_unsafe_assume_spec`. SAW will believe whatever +spec you supply `mir_unsafe_assume_spec` to be valid, and the `MIRSpec` that +`mir_unsafe_assume_spec` returns can then be used in later compositional +verifications. + +Why would you want to do this? The main reason is that writing proofs can be +difficult, and sometimes, there are certain functions in a SAW verification +effort that are disproportionately harder to write a spec for than others. It +is tempting to write specs for each function in sequence, but this can run the +risk of getting stuck on a particularly hard-to-verify function, blocking +progress on other parts of the proofs. + +In these situations, `mir_unsafe_assume_spec` can be a useful prototyping tool. +One can use `mir_unsafe_assume_spec` to assume a spec for the hard-to-verify +function and then proceed with the remaining parts of the proof. Of course, you +should make an effort to go back and prove the hard-to-verify function's spec +later, but it can be nice to try something else first. + +For example, here is how one can unsafely assume `g_spec` and use it in a +compositional proof of `f_spec`: + +``` +$include 21-22 code/overrides-unsafe.saw +``` + +It should be emphasized that when we say "`unsafe`", we really mean it. +`mir_unsafe_assume_spec` can be used to prove specs that are blatantly wrong, +so use it with caution. diff --git a/doc/rust-tutorial/prerequisites.md b/doc/rust-tutorial/prerequisites.md new file mode 100644 index 0000000000..4704494eee --- /dev/null +++ b/doc/rust-tutorial/prerequisites.md @@ -0,0 +1,12 @@ +# Prerequisites + +In order to run the examples in this tutorial, you will need to install the +following prerequisite tools: + +* SAW itself, which can be installed by following the instructions + [here](https://github.com/GaloisInc/saw-script#manual-installation). +* The Z3 and Yices SMT solvers. Z3 can be downloaded from + [here](https://github.com/Z3Prover/z3/releases), and Yices can be downloaded + from [here](https://yices.csl.sri.com/). +* The `mir-json` tool, which can be installed by following the instructions + [here](https://github.com/GaloisInc/mir-json#installation-instructions). diff --git a/doc/rust-tutorial/reference-types.md b/doc/rust-tutorial/reference-types.md new file mode 100644 index 0000000000..764972e6cc --- /dev/null +++ b/doc/rust-tutorial/reference-types.md @@ -0,0 +1,122 @@ +# Reference types + +All of the examples we have seen up to this point involve simple integer types +such as `u8` and `u32`. While these are useful, Rust's type system features +much more than just integers. A key part of Rust's type system are its +reference types. For example, in this `read_ref` function: + +``` rust +$include 1-3 code/ref-basics.rs +``` + +The function reads the value that `r` (of type `&u32`) points to and returns +it. Writing SAW specifications involving references is somewhat trickier than +with other types of values because we must also specify what memory the +reference points to. SAW provides a special command for doing this called +`mir_alloc`: + +``` +sawscript> :type mir_alloc +MIRType -> MIRSetup MIRValue +``` + +`mir_alloc` will allocate a reference value with enough space to hold a value +of the given `MIRType`. Unlike `mir_fresh_var`, `mir_alloc` returns a +`MIRValue` instead of a `Term`. We mentioned before that `Term`s are only a +subset of `MIRValue`s, and this is one of the reasons why. Cryptol does not +have a notion of reference values, but `MIRValue`s do. As a result, you cannot +embed the result of a call to `mir_alloc` in a Cryptol expression. + +`mir_alloc` must be used with some care. Here is a first, not-quite-correct +attempt at writing a spec for `read_ref` using `mir_alloc`: + +``` +$include 3-11 code/ref-basics-fail.saw +``` + +As the comment suggests, it's not entirely clear what this spec should return. +We can't return `r`, since `read_ref` returns something of type `u32`, not +`&u32`. On the other hand, we don't have any values of type `u32` lying around +that are obviously the right thing to use here. Nevertheless, it's not required +for a SAW spec to include a `mir_return` statement, so let's see what happens +if we verify this as-is: + +``` +$ saw ref-basics-fail.saw + + + +[20:13:27.224] Loading file "ref-basics-fail.saw" +[20:13:27.227] Verifying ref_basics/54ae7b63::read_ref[0] ... +[20:13:27.235] Simulating ref_basics/54ae7b63::read_ref[0] ... +[20:13:27.235] Stack trace: +"mir_verify" (ref-basics-fail.saw:11:1-11:11) +Symbolic execution failed. +Abort due to assertion failure: + ref-basics.rs:2:5: 2:7: error: in ref_basics/54ae7b63::read_ref[0] + attempted to read empty mux tree +``` + +Clearly, SAW didn't like what we gave it. The reason this happens is although +we allocated memory for the reference `r`, we never told SAW what value should +live in that memory. When SAW simulated the `read_ref` function, it attempted +to dereference `r`, which pointed to uninitialized memory. This is constitutes +an error in SAW, which is what this "`attempted to read empty mux tree`" +business is about. + +SAW provides a `mir_points_to` command to declare what value a reference should +point to: + +``` +sawscript> :type mir_points_to +MIRValue -> MIRValue -> MIRSetup () +``` + +Here, the first `MIRValue` argument represents a reference value, and the +second `MIRValue` argument represents the value that the reference should point +to. In our spec for `read_ref`, we can declare that the reference should point +to a symbolic `u32` value like so: + +``` +$include 3-9 code/ref-basics.saw +``` + +We have renamed `r` to `r_ref` in this revised spec to more easily distinguish +it from `r_val`, which is the value that `r_ref` is declared to point to using +`mir_points_to`. In this version of the spec, it is clear that we should return +`r_val` using `mir_return`, as `r_val` is exactly the value that will be +computed by dereferencing `r_ref`. + +This pattern, where a call to `mir_alloc`/`mir_alloc_mut` to followed by a call +to `mir_points_to`, is common with function specs that involve references. +Later in the tutorial, we will see other examples of `mir_points_to` where the +reference argument does not come from `mir_alloc`/`mir_alloc_mut`. + +The argument to `read_ref` is an immutable reference, so the implementation of +the function is not allowed to modify the memory that the argument points to. +Rust also features mutable references that do permit modifying the underlying +memory, as seen in this `swap` function: + +``` rust +$include 5-11 code/ref-basics.rs +``` + +A corresponding spec for `swap` is: + +``` +$include 15-28 code/ref-basics.saw +``` + +There are two interesting things worth calling out in this spec: + +1. Instead of allocating the reference values with `mir_alloc`, we instead use + `mir_alloc_mut`. This is a consequence of the fact that `&mut u32` is a + different type from `&mut` in Rust (and in MIR), and and such, we need a + separate `mir_alloc_mut` to get the types right. +2. This spec features calls to `mir_points_to` before _and_ after + `mir_execute_func`. This is because the values that `a_ref` and `b_ref` point + to before calling the function are different than the values that they point + to after calling the function. The two uses to `mir_points_to` after the + function has been called swap the order of `a_val` and `b_val`, reflecting + the fact that the `swap` function itself swaps the values that the references + point to. diff --git a/doc/rust-tutorial/rust-tutorial-after.tex b/doc/rust-tutorial/rust-tutorial-after.tex deleted file mode 100644 index aae03f4149..0000000000 --- a/doc/rust-tutorial/rust-tutorial-after.tex +++ /dev/null @@ -1,4 +0,0 @@ -\newpage -\bibliography{sawScriptRustTutorial} -\addcontentsline{toc}{section}{References} -\bibliographystyle{abbrv} diff --git a/doc/rust-tutorial/rust-tutorial-before.html b/doc/rust-tutorial/rust-tutorial-before.html deleted file mode 100644 index 2ce0a49c74..0000000000 --- a/doc/rust-tutorial/rust-tutorial-before.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/doc/rust-tutorial/rust-tutorial-before.tex b/doc/rust-tutorial/rust-tutorial-before.tex deleted file mode 100644 index 2a8b21e849..0000000000 --- a/doc/rust-tutorial/rust-tutorial-before.tex +++ /dev/null @@ -1 +0,0 @@ -\maketitle diff --git a/doc/rust-tutorial/rust-tutorial-head.tex b/doc/rust-tutorial/rust-tutorial-head.tex deleted file mode 100644 index a38a1e6da2..0000000000 --- a/doc/rust-tutorial/rust-tutorial-head.tex +++ /dev/null @@ -1,60 +0,0 @@ -\usepackage{listings} -\usepackage{float} -\usepackage{xspace} -\usepackage{color} -\usepackage{tikz} -\usepackage{url} -\usepackage{amsmath} -\usepackage{amscd} -\usepackage{verbatim} -\usepackage{fancyvrb} - -\let\verbatiminput=\verbatimtabinput -\VerbatimFootnotes -\DefineVerbatimEnvironment{code}{Verbatim}{} -\DefineVerbatimEnvironment{pseudoCode}{Verbatim}{} -\hyphenation{SAW-Script} -\newcommand{\sawScript}{{\sc SAWScript}\xspace} -\renewcommand{\textfraction}{0.05} -\renewcommand{\topfraction}{0.95} -\renewcommand{\bottomfraction}{0.95} -\renewcommand{\floatpagefraction}{0.35} -\setcounter{totalnumber}{5} -\definecolor{MyGray}{rgb}{0.9,0.9,0.9} -\makeatletter\newenvironment{graybox}{% - \begin{lrbox}{\@tempboxa}\begin{minipage}{\columnwidth}}{\end{minipage}\end{lrbox}% - \colorbox{MyGray}{\usebox{\@tempboxa}} -}\makeatother - -\setlength{\parskip}{0.6em} -\setlength{\abovecaptionskip}{0.5em} - -\lstset{ - basicstyle=\footnotesize\ttfamily, % Standardschrift - %numbers=left, % Ort der Zeilennummern - numberstyle=\tiny, % Stil der Zeilennummern - %stepnumber=2, % Abstand zwischen den Zeilennummern - numbersep=5pt, % Abstand der Nummern zum Text - tabsize=2, % Groesse von Tabs - extendedchars=true, % - breaklines=true, % Zeilen werden Umgebrochen - keywordstyle=\color{red}, - frame=lrtb, % left, right, top, bottom frames. - % keywordstyle=[1]\textbf, % Stil der Keywords - % keywordstyle=[2]\textbf, % - % keywordstyle=[3]\textbf, % - % keywordstyle=[4]\textbf, \sqrt{\sqrt{}} % - stringstyle=\color{white}\ttfamily, % Farbe der String - showspaces=false, % Leerzeichen anzeigen ? - showtabs=false, % Tabs anzeigen ? - xleftmargin=10pt, % was 17 - xrightmargin=5pt, - framexleftmargin=5pt, % was 17 - framexrightmargin=-1pt, % was 5pt - framexbottommargin=4pt, - %backgroundcolor=\color{lightgray}, - showstringspaces=false % Leerzeichen in Strings anzeigen ? -} - -\author{The Galois SAW Team\\\texttt{saw@galois.com}} -\title{SAWScript Rust Tutorial} diff --git a/doc/rust-tutorial/rust-tutorial.md b/doc/rust-tutorial/rust-tutorial.md deleted file mode 100644 index 4bea30c63d..0000000000 --- a/doc/rust-tutorial/rust-tutorial.md +++ /dev/null @@ -1,3171 +0,0 @@ -# Introduction - -SAW is a special-purpose programming environment developed by Galois to help -orchestrate and track the results of the large collection of proof tools -necessary for analysis and verification of complex software artifacts. - -SAW adopts the functional paradigm, and largely follows the structure of many -other typed functional languages, with some special features specifically -targeted at the coordination of verification and analysis tasks. - -This tutorial introduces the details of the language by walking through several -examples, and showing how simple verification tasks can be described. The -complete examples are available [on -GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code). -Most of the examples make use of inline specifications written in Cryptol, a -language originally designed for high-level descriptions of cryptographic -algorithms. For readers unfamiliar with Cryptol, various documents describing -its use are available [here](http://cryptol.net/documentation.html). - -This tutorial also include a [case study](#case-study-salsa20) on how to use -SAW to verify a real-world implementation of the Salsa20 stream cipher based on -the [`stream-ciphers`](https://github.com/RustCrypto/stream-ciphers) Rust -project. The code for this case study is also available [on -GitHub](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20). - -# Prerequisites - -In order to run the examples in this tutorial, you will need to install the -following prerequisite tools: - -* SAW itself, which can be installed by following the instructions - [here](https://github.com/GaloisInc/saw-script#manual-installation). -* The Z3 and Yices SMT solvers. Z3 can be downloaded from - [here](https://github.com/Z3Prover/z3/releases), and Yices can be downloaded - from [here](https://yices.csl.sri.com/). -* The `mir-json` tool, which can be installed by following the instructions - [here](https://github.com/GaloisInc/mir-json#installation-instructions). - -# About `mir-json` - -We are interested in verifying code written in Rust, but Rust is an extremely -rich programming language that has many distinct language features. To make the -process of verifying Rust simpler, SAW targets an intermediate language used in -the Rust compiler called [MIR](https://blog.rust-lang.org/2016/04/19/MIR.html) -(short for "Mid-level IR"). MIR takes the variety of different features and -syntactic extensions in Rust and boils them down to a minimal subset that is -easier for a computer program to analyze. - -The process of extracting MIR code that is suitable for SAW's needs is somewhat -tricky, so we wrote a suite of tools called `mir-json` to automate this -process. `mir-json` provides a plugin for tools like `rustc` and `cargo` that -lets you compile Rust code as you normally would and produce an additional -`.json` file as output. This `.json` file contains the MIR code that was -produced internally by the Rust compiler, with some additional minor tweaks to -make it suitable for SAW's needs. - -`mir-json` is not a single tool but rather a suite of related tools that -leverage the same underlying plugin. For SAW purposes, the two `mir-json` tools -that are most relevant are: - -* `saw-rustc`: A thin wrapper around `rustc` (the Rust compiler), which is - suitable for individual `.rs` files. -* `cargo-saw-build`: A thin wrapper around the `cargo build` command, which is - suitable for `cargo`-based Rust projects. - -Most of the examples in this tutorial involve self-contained examples, which -will use `saw-rustc`. Later in the tutorial, we will examine a Salsa20 case -study that involves a `cargo`-based project, which will use `cargo-saw-build`. - -## A first example with `saw-rustc` - -Let's try out `saw-rustc` on a small example file, which we'll name -`first-example.rs`: - -``` rust -$include all code/first-example.rs -``` - -This is the identity function, but specialized to the type `u8`. We can compile -this with `saw-rustc` like so: - -``` -$ saw-rustc first-example.rs - -note: Emitting MIR for first_example/abef32c5::id_u8 - -linking 1 mir files into first-example.linked-mir.json - -``` - -`saw-rustc` prints out some additional information that `rustc` alone does not -print, and we have displayed the parts of this information that are most -interesting. In particular: - -* `saw-rustc` notes that is is `Emitting MIR for first_example/abef32c5::id_u8`, - where `first_example/abef32c5::id_u8` is the full _identifier_ used to uniquely - refer to the `id_u8` function. It's entirely possible that the `abef32c5` - bit will look different on your machine; we'll talk more about identifiers in - the "Identifiers" section. -* Once `saw-rustc` produced a MIR JSON file named - `first-example.linked-mir.json`. This is an important bit of information, as - SAW will ingest this JSON file. - -If you'd like, you can inspect the `first-example.linked-mir.json` file with -JSON tools (e.g., [`jq`](https://jqlang.github.io/jq/)), but it is not -important to understand everything that is going on there. This is -machine-generated JSON, and as such, it is not meant to be particularly -readable by human eyes. - -## The `SAW_RUST_LIBRARY_PATH` environment variable - -Rust has a large set of standard libraries that ship with the compiler, and -parts of the standard library are quite low-level and tricky. SAW's primary -objective is to provide a tool that can analyze code in a tractable way. For -this reason, SAW sometimes needs to invoke simplified versions of Rust standard -library functions that are more reasonable for an SMT-based tool like SAW to -handle. These simplified functions are equivalent in behavior, but avoid using -problematic code patterns (e.g., gnarly pointer arithmetic or the -[`transmute`](https://doc.rust-lang.org/std/intrinsics/fn.transmute.html) -function). - -If you are only ever compiling self-contained pieces of code with `saw-rustc`, -there is a good chance that you can get away without needing to use SAW's -custom version of the Rust standard libraries. However, if you ever need to -build something more complicated than that (e.g., the Salsa20 case study later -in this tutorial), then you _will_ need the custom libraries. For this reason, -it is worthwhile to teach SAW the location of the custom libraries now. - -At present, the best way to obtain the custom version of the Rust standard -libraries is to perform the following steps: - -1. Clone the [`crucible`](https://github.com/GaloisInc/crucible) repo like so: - - ``` - $ git clone https://github.com/GaloisInc/crucible - ``` - -2. Navigate to the - [`crux-mir`](https://github.com/GaloisInc/crucible/tree/master/crux-mir) - subdirectory of the `crucible` checkout: - - ``` - $ cd crucible/crux-mir/ - ``` - -3. Run the `translate_libs.sh` script: - - ``` - $ ./translate_libs.sh - ``` - - This will compile the custom versions of the Rust standard libraries using - `mir-json`, placing the results under the `rlibs` subdirectory. - -4. Finally, define a `SAW_RUST_LIBRARY_PATH` environment variable that points - to the newly created `rlibs` subdirectory: - - ``` - $ export SAW_RUST_LIBRARY_PATH=<...>/crucible/crux-mir/rlibs - ``` - -An upcoming release of SAW will include these custom libraries pre-built, which -will greatly simplify the steps above. Either way, you will need to set the -`SAW_RUST_LIBRARY_PATH` environment variable to point to the location of the -custom libraries. - -## A note about generics - -The `id_u8` function above is likely not how most Rust programmers would define -the identity function. Instead, it would seem more natural to define it -generically, that is, by parameterizing the function by a type parameter: - -``` rust -$include all code/generics-take-1.rs -``` - -If you compile this with `saw-rustc`, however, the resulting JSON file will -lack a definition for `id`! We can see this by using `jq`: - -``` -$ saw-rustc generics-take-1.rs - -$ jq . generics-take-1.linked-mir.json -{ - "fns": [], - "adts": [], - "statics": [], - "vtables": [], - "traits": [], - "intrinsics": [], - "tys": [], - "roots": [] -} -``` - -What is going on here? This is the result of an important design choice that -SAW makes: _SAW only supports verifying monomorphic functions_. To be more -precise, SAW's approach to symbolic simulation requires all of the code being -simulated to have fixed types without any type parameters. - -In order to verify a function using generics in your Rust code, you must -provide a separate, monomorphic function that calls into the generic function. -For example, you can rewrite the example above like so: - -``` rust -$include all code/generics-take-2.rs -``` - -If you compile this version with `saw-rustc`, you'll see: - -``` -$ saw-rustc generics-take-2.rs - -note: Emitting MIR for generics_take_2/8b1bf337::id_u8 - -note: Emitting MIR for generics_take_2/8b1bf337::id::_instaddce72e1232152c[0] - -linking 1 mir files into generics-take-2.linked-mir.json - -``` - -This time, the resulting JSON file contains a definition for `id_u8`. The -reason that this works is because when `id_u8` calls `id`, the Rust compile -will generate a specialized version of `id` where `A` is instantiated with the -type `u8`. This specialized version of `id` is named -`id::_instaddce72e1232152c[0]` in the output above. (You don't have to remember -this name, thankfully!) - -Although the resulting JSON file contains a definition for `id_u8`, it does -_not_ contain a definition for the generic `id` function. As a result, SAW will -only be able to verify the `id_u8` function from this file. If you are ever in -doubt about which functions are accessible for verification with SAW, you can -check this with `jq` like so: - -``` -$ jq '.intrinsics | map(.name)' generics-take-2.linked-mir.json -[ - "generics_take_2/8b1bf337::id_u8", - "generics_take_2/8b1bf337::id::_instaddce72e1232152c[0]" -] -``` - -Here, "intrinsics" are monomorphic functions that are visible to SAW. Note that -`saw-rustc` will optimize away all definitions that are not accessible from one -of these intrinsic functions. This explains why the original program that only -defined a generic `id` function resulted in a definition-less JSON file, as -that program did not contain monomorphic functions (and therefore no -intrinsics). - -Generally speaking, we prefer to verify functions that are defined directly in -the Rust source code, such as `id_u8`, as these functions' names are more -stable than the specialized versions of functions that the compiler generates, -such as `id::_instaddce72e1232152c[0]`. Do note that SAW is capable of -verifying both types of functions, however. (We will see an example of -verifying an autogenerated function in the Salsa20 case study later in this -tutorial.) - -## Identifiers - -When you compile a function named `id_u8`, `saw-rustc` will expand it to a much -longer name such as `first_example/abef32c5::id_u8`. This longer name is called -an _identifier_, and it provides a globally unique name for that function. In -the small examples we've seen up to this point, there hasn't been any risk of -name collisions, but you could imagine compiling this code alongside another -file (or crate) that also defines an `id_u8` function. If that happens, then it -is essential that we can tell apart all of the different `id_u8` functions, and -identifiers provide us the mechanism for doing so. - -Let's take a closer look at what goes into an identifier. In general, an identifier -will look like the following: - -* `/::` - -`` is the name of the crate in which the function is defined. All -of the examples we've seen up to this point have been defined in standalone -files, and as a result, the crate name has been the same as the file name, but -without the `.rs` extension and with all hyphens replaced with underscores -(e.g., `first-example.rs` is given the crate name `first_example`). In -`cargo`-based projects, the crate name will likely differ from the file name. - -`` is a hash of the crate and its dependencies. In extreme -cases, it is possible for two different crates to have identical crate names, -in which case the disambiguator must be used to distinguish between the two -crates. In the common case, however, most crate names will correspond to -exactly one disambiguator. (More on this in a bit.) - -`` is the path to the function within the crate. Sometimes, this -is as simple as the function name itself. In other cases, a function path may -involve multiple _segments_, depending on the module hierarchy for the program -being verified. For instance, a `read` function located in -`core/src/ptr/mod.rs` will have the identifier: - -``` -core/::ptr::read -``` - -Where `core` is the crate name and `ptr::read` is the function path, which -has two segments `ptr` and `read`. There are also some special forms of -segments that appear for functions defined in certain language constructs. -For instance, if a function is defined in an `impl` block, then it will have -`{impl}` as one of its segments, e.g., - -``` -core/::ptr::const_ptr::{impl}::offset -``` - -The most cumbersome part of writing an identifier is the disambiguator, as it -is extremely sensitive to changes in the code (not to mention hard to remember -and type). Luckily, the vast majority of crate names correspond to exactly one -disambiguator, and we can exploit this fact to abbreviate identifiers that live -in such crates. For instance, we can abbreviate this identifier: - -``` -core/::ptr::read -``` - -To simply: - -``` -core::ptr::read -``` - -We will adopt the latter, shorter notation throughout the rest of the tutorial. -SAW also understands this shorthand, so we will also use this notation when -passing identifiers to SAW commands. - -# SAW basics - -## A first SAW example - -We now have the knowledge necessary to compile Rust code in a way that is -suitable for SAW. Let's put our skills to the test and verify something! We will -build on the example from above, which we will put into a file named -`saw-basics.rs`: - -``` rust -$include all code/saw-basics.rs -``` - -Our goal is to verify the correctness of the `id_u8` function. However, it is -meaningless to talk about whether a function is correct without having a -_specification_ for how the function should behave. This is where SAW enters -the picture. SAW provides a scripting language named _SAWScript_ that allows -you to write a precise specification for describing a function's behavior. For -example, here is a specification that captures the intended behavior of -`id_u8`: - -``` -$include 3-7 code/saw-basics.saw -``` - -At a high level, this specification says that `id_u8` is a function that accepts -a single argument of type `u8`, and it returns its argument unchanged. Nothing -too surprising there, but this example illustrates many of the concepts that one -must use when working with SAW. Let's unpack what this is doing, line by line: - -* In SAWScript, specifications are ordinary values that are defined with `let`. - In this example, we are defining a specification named `id_u8_spec`. -* Specifications are defined using "`do`-notation". That is, they are assembled - by writing `do { ; ; ...; ; }`, where each `` is a - statement that declares some property about the function being verified. A - statement can optionally bind a variable that can be passed to later - statements, which is accomplished by writing ` <- `. -* The `x <- mir_fresh_var "x" mir_u8;` line declares that `x` is a fresh - variable of type `u8` (represented by `mir_u8` in SAWScript) that has some - unspecified value. In SAW parlance, we refer to these unspecified values as - _symbolic_ values. SAW uses an SMT solver under the hood to reason about - symbolic values. - - The `"x"` string indicates what name the variable `x` should have when sent - to the underlying SMT solver. This is primarily meant as a debugging aid, and - it is not required that the string match the name of the SAWScript variable. - (For instance, you could just as well have passed `"x_smt"` or something - else.) -* The `mir_execute_func [mir_term x];` line declares that the function should - be invoked with `x` as the argument. For technical reasons, we pass - `mir_term x` to `mir_execute_func` rather than just `x`; we will go over what - `mir_term` does later in the tutorial. -* Finally, the `mir_return (mir_term x);` line declares that the function should - return `x` once it has finished. - -Now that we have a specification in hand, it's time to prove that `id_u8` -actually adheres to the spec. To do so, we need to load the MIR JSON version of -`id_u8` into SAW, which is done with the `mir_load_module` command: - -``` -$include 9-9 code/saw-basics.saw -``` - -This `m` variable contains the definition of `id_u8`, as well as the other code -defined in the program. We can then pass `m` to the `mir_verify` command, which -actually verifies that `id_u8` behaves according to `id_u8_spec`: - -``` -$include 11-11 code/saw-basics.saw -``` - -Here is what is going on in this command: - -* The `m` and `"saw_basics::id_u8"` arguments instruct SAW to verify the - `id_u8` function located in the `saw_basics` crate defined in `m`. Note that - we are using the shorthand identifier notation here, so we are allowed to omit - the disambiguator for the `saw_basics` crate. -* The `[]` argument indicates that we will not provide any function overrides to - use when SAW simulates the `id_u8` function. (We will go over how overrides - work later in the tutorial.) -* The `false` argument indicates that SAW should not use path satisfiability - checking when analyzing the function. Path satisfiability checking is an - advanced SAW feature that we will not be making use of in this tutorial, so we - will always use `false` here. -* The `id_u8_spec` argument indicates that `id_u8` should be checked against the - specification defined by `id_u8_spec`. -* The `z3` argument indicates that SAW should use the Z3 SMT solver to solve - any proof goals that are generated during verification. SAW also supports - other SMT solvers, although we will mostly use Z3 in this tutorial. - -Putting this all together, our complete `saw-basics.saw` file is: - -``` -$include all code/saw-basics.saw -``` - -One minor detail that we left out until just now is that the SAW's interface to -MIR is still experimental, so you must explicitly opt into it with the -`enable_experimental` command. - -Now that everything is in place, we can check this proof like so: - -``` -$ saw saw-basics.saw - - - -[16:14:07.006] Loading file "saw-basics.saw" -[16:14:07.009] Verifying saw_basics/f77ebf43::id_u8[0] ... -[16:14:07.017] Simulating saw_basics/f77ebf43::id_u8[0] ... -[16:14:07.017] Checking proof obligations saw_basics/f77ebf43::id_u8[0] ... -[16:14:07.017] Proof succeeded! saw_basics/f77ebf43::id_u8[0] -``` - -Tada! SAW was successfully able to prove that `id_u8` adheres to its spec. - -## Cryptol - -The spec in the previous section is nice and simple. It's also not very -interesting, as it's fairly obvious at a glance that `id_u8`'s implementation -is correct. Most of the time, we want to verify more complicated functions -where the correspondence between the specification and the implementation is -not always so clear. - -For example, consider this function, which multiplies a number by two: - -``` rust -$include 1-3 code/times-two.rs -``` - -The straightforward way to implement this function would be to return `2 * x`, -but the author of this function _really_ cared about performance. As such, the -author applied a micro-optimization that computes the multiplication with a -single left-shift (`<<`). This is the sort of scenario where we are pretty sure -that the optimized version of the code is equivalent to the original version, -but it would be nice for SAW to check this. - -Let's write a specification for the `times_two` function: - -``` -$include 3-7 code/times-two.saw -``` - -This spec introduces code delimited by double curly braces `{{ ... }}`, which -is a piece of syntax that we haven't seen before. The code in between the curly -braces is written in [Cryptol](http://cryptol.net/documentation.html), a -language designed for writing high-level specifications of various algorithms. -Cryptol supports most arithmetic operations, so `2 * x` works exactly as you -would expect. Also note that the `x` variable was originally bound in the -SAWScript language, but it is possible to embed `x` into the Cryptol language -by referencing `x` within the curly braces. (We'll say more about how this -embedding works later.) - -`{{ 2 * x }}` takes the Cryptol expression `2 * x` and lifts it to a SAW -expression. As such, this SAW spec declares that the function takes a single -`u32`-typed argument `x` and returns `2 * x`. We could have also wrote the -specification to declare that the function returns `x << 1`, but that would -have defeated the point of this exercise: we specifically want to check that -the function against a spec that is as simple and readable as possible. - -Our full SAW file is: - -``` -$include 1-11 code/times-two.saw -``` - -Which we can verify is correct like so: - -``` -$ saw times-two.saw - - - -[17:51:35.469] Loading file "times-two.saw" -[17:51:35.497] Verifying times_two/6f4e41af::times_two[0] ... -[17:51:35.512] Simulating times_two/6f4e41af::times_two[0] ... -[17:51:35.513] Checking proof obligations times_two/6f4e41af::times_two[0] ... -[17:51:35.527] Proof succeeded! times_two/6f4e41af::times_two[0] -``` - -Nice! Even though the `times_two` function does not literally return `2 * x`, -SAW is able to confirm that the function behaves as if it were implemented that -way. - -## `Term`s and other types - -Now that we know how Cryptol can be used within SAW, we can go back and explain -what the `mir_term` function does. It is helpful to examine the type of -`mir_term` by using SAW's interactive mode. To do so, run the `saw` binary -without any other arguments: - -``` -$ saw -``` - -Then run `enable_experimental` (to enable MIR-related commands) and run `:type -mir_term`: - -``` -sawscript> enable_experimental -sawscript> :type mir_term -Term -> MIRValue -``` - -Here, we see that `mir_term` accepts a `Term` as an argument and returns a -`MIRValue`. In this context, the `Term` type represents a Cryptol value, and -the `MIRValue` type represents SAW-related MIR values. `Term`s can be thought -of as a subset of `MIRValue`s, and the `mir_term` function is used to promote a -`Term` to a `MIRValue`. - -Most other MIR-related commands work over `MIRValue`s, as can be seen with -SAW's `:type` command: - -``` -sawscript> :type mir_execute_func -[MIRValue] -> MIRSetup () -sawscript> :type mir_return -MIRValue -> MIRSetup () -``` - -Note that `MIRSetup` is the type of statements in a MIR specification, and two -`MIRSetup`-typed commands can be chained together by using `do`-notation. -Writing `MIRSetup ()` means that the statement does not return anything -interesting, and the use of `()` here is very much analogous to how `()` is -used in Rust. There are other `MIRSetup`-typed commands that _do_ return -something interesting, as is the case with `mir_fresh_var`: - -``` -sawscript> :type mir_fresh_var -String -> MIRType -> MIRSetup Term -``` - -This command returns a `MIRSetup Term`, which means that when you write `x <- -mir_fresh_var ... ...` in a MIR specification, then `x` will be bound at type -`Term`. - -Values of type `Term` have the property that they can be embedded into Cryptol -expression that are enclosed in double curly braces `{{ ... }}`. This is why -our earlier `{{ 2 * x }}` example works, as `x` is of type `Term`. - -## Preconditions and postconditions - -As a sanity check, let's write a naïve version of `times_two` that explicitly -returns `2 * x`: - -``` rust -$include 5-7 code/times-two.rs -``` - -It seems like we should be able to verify this `times_two_ref` function using -the same spec that we used for `times_two`: - -``` -$include 11-11 code/times-two-ref-fail.saw -``` - -Somewhat surprisingly, SAW fails to verify this function: - -``` -$ saw times-two-ref-fail.saw - - - -[18:58:22.578] Loading file "times-two-ref-fail.saw" -[18:58:22.608] Verifying times_two/56182919::times_two_ref[0] ... -[18:58:22.621] Simulating times_two/56182919::times_two_ref[0] ... -[18:58:22.622] Checking proof obligations times_two/56182919::times_two_ref[0] ... -[18:58:22.640] Subgoal failed: times_two/56182919::times_two_ref[0] attempt to compute `const 2_u32 * move _2`, which would overflow -[18:58:22.640] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 375} -[18:58:22.640] ----------Counterexample---------- -[18:58:22.640] x: 2147483648 -[18:58:22.640] Stack trace: -"mir_verify" (times-two-ref-fail.saw:11:1-11:11) -Proof failed. -``` - -The "`which would overflow`" portion of the error message suggests what went -wrong. When a Rust program is compiled with debug settings (which is the -default for `rustc` and `saw-rustc`), arithmetic operations such as -multiplication will check if the result of the operation can fit in the -requested number of bits. If not, the program will raise an error. - -In this case, we must make the result of multiplication fit in a `u32`, which -can represent values in the range `0` to `2^^32 - 1` (where `^^` is Cryptol's -exponentiation operator). But it is possible to take a number in this range, -multiply it by two, and have the result fall outside of the range. In fact, SAW -gives us a counterexample with exactly this number: `2147483648`, which can -also be written as `2^^31`. Multiplying this by two yields `2^^32`, which is -just outside of the range of values expressible with `u32`. SAW's duties -include checking that a function cannot fail at runtime, so this function falls -afoul of that check. - -Note that we didn't have this problem with the original definition of -`times_two` because the semantics of `<<` are such that if the result is too -large to fit in the requested type, then the result will _overflow_, i.e., wrap -back around to zero and count up. This means that `(2^^31) << 1` evaluates to -`0` rather than raising an error. Cryptol's multiplication operation also -performs integer overflow (unlike Rust in debug settings), which is why we -didn't notice any overflow-related issues when verifying `times_two`. - -There are two possible ways that we can repair this. One way is to rewrite -`times_two_ref` to use Rust's -[`wrapping_mul`](https://doc.rust-lang.org/std/primitive.u32.html#method.wrapping_mul) -function, a variant of multiplication that always uses integer overflow. This -work around the issue, but it is a bit more verbose. - -The other way is to make our spec more precise such that we only verify -`times_two_ref` for particular inputs. Although `times_two_ref` will run into -overflow-related issues when the argument is `2^^31` or greater, it is -perfectly fine for inputs smaller than `2^^31`. We can encode such an -assumption in SAW by adding a _precondition_. To do so, we write a slightly -modified version of `times_two_spec`: - -``` -$include 13-18 code/times-two.saw -``` - -The most notable change is the `mir_precond {{ x < 2^^31 }};` line. -`mir_precond` (where "`precond`" is short for "precondition") is a command that -takes a `Term` argument that contains a boolean predicate, such as `{{ x < -2^^31 }}`. Declaring a precondition requires that this predicate must hold -during verification, and any values of `x` that do not satisfy this predicate -are not considered. - -By doing this, we have limited the range of the function from `0` to `2^^31 - -1`, which is exactly the range of values for which `times_two_ref` is well -defined. SAW will confirm this if we run it: - -``` -$include 20-20 code/times-two.saw -``` -``` -[19:23:53.480] Verifying times_two/56182919::times_two_ref[0] ... -[19:23:53.496] Simulating times_two/56182919::times_two_ref[0] ... -[19:23:53.497] Checking proof obligations times_two/56182919::times_two_ref[0] ... -[19:23:53.531] Proof succeeded! times_two/56182919::times_two_ref[0] -``` - -We can add as many preconditions to a spec as we see fit. For instance, if we -only want to verify `times_two_ref` for positive integers, we could add an -additional assumption: - -``` -$include 22-28 code/times-two.saw -``` - -In addition to preconditions, SAW also supports postconditions. Whereas -preconditions represent conditions that must hold _before_ invoking a function, -postconditions represent conditions that must hold _after_ invoking a function. -We have already seen one type of postcondition in the form of the `mir_return` -command, which imposes a postcondition on what the return value must be equal -to. - -We can introduce additional postconditions with the `mir_postcond` command. -For example, if we call `times_two_ref` with a positive argument, then it -should be the case that the return value should be strictly greater than the -argument value. We can check for this using `mir_postcond` like so: - -``` -$include 32-39 code/times-two.saw -``` - -An additional convenience that SAW offers is the `mir_assert` command. -`mir_assert` has the same type as `mir_precond` and `mir_postcond`, but -`mir_assert` can be used to declare both preconditions _and_ postconditions. -The difference is where `mir_assert` appears in a specification. If -`mir_assert` is used before the call to `mir_execute_func`, then it declares a -precondition. If `mir_assert` is used after the call to `mir_execute_func`, -then it declares a postcondition. - -For example, we can rewrite `times_two_ref_positive_postcond_spec` to use -`mir_assert`s like so: - -``` -$include 43-50 code/times-two.saw -``` - -The choice of whether to use `mir_precond`/`mir_postcond` versus `mir_assert` is -mostly a matter personal taste. - -# Reference types - -All of the examples we have seen up to this point involve simple integer types -such as `u8` and `u32`. While these are useful, Rust's type system features -much more than just integers. A key part of Rust's type system are its -reference types. For example, in this `read_ref` function: - -``` rust -$include 1-3 code/ref-basics.rs -``` - -The function reads the value that `r` (of type `&u32`) points to and returns -it. Writing SAW specifications involving references is somewhat trickier than -with other types of values because we must also specify what memory the -reference points to. SAW provides a special command for doing this called -`mir_alloc`: - -``` -sawscript> :type mir_alloc -MIRType -> MIRSetup MIRValue -``` - -`mir_alloc` will allocate a reference value with enough space to hold a value -of the given `MIRType`. Unlike `mir_fresh_var`, `mir_alloc` returns a -`MIRValue` instead of a `Term`. We mentioned before that `Term`s are only a -subset of `MIRValue`s, and this is one of the reasons why. Cryptol does not -have a notion of reference values, but `MIRValue`s do. As a result, you cannot -embed the result of a call to `mir_alloc` in a Cryptol expression. - -`mir_alloc` must be used with some care. Here is a first, not-quite-correct -attempt at writing a spec for `read_ref` using `mir_alloc`: - -``` -$include 3-11 code/ref-basics-fail.saw -``` - -As the comment suggests, it's not entirely clear what this spec should return. -We can't return `r`, since `read_ref` returns something of type `u32`, not -`&u32`. On the other hand, we don't have any values of type `u32` lying around -that are obviously the right thing to use here. Nevertheless, it's not required -for a SAW spec to include a `mir_return` statement, so let's see what happens -if we verify this as-is: - -``` -$ saw ref-basics-fail.saw - - - -[20:13:27.224] Loading file "ref-basics-fail.saw" -[20:13:27.227] Verifying ref_basics/54ae7b63::read_ref[0] ... -[20:13:27.235] Simulating ref_basics/54ae7b63::read_ref[0] ... -[20:13:27.235] Stack trace: -"mir_verify" (ref-basics-fail.saw:11:1-11:11) -Symbolic execution failed. -Abort due to assertion failure: - ref-basics.rs:2:5: 2:7: error: in ref_basics/54ae7b63::read_ref[0] - attempted to read empty mux tree -``` - -Clearly, SAW didn't like what we gave it. The reason this happens is although -we allocated memory for the reference `r`, we never told SAW what value should -live in that memory. When SAW simulated the `read_ref` function, it attempted -to dereference `r`, which pointed to uninitialized memory. This is constitutes -an error in SAW, which is what this "`attempted to read empty mux tree`" -business is about. - -SAW provides a `mir_points_to` command to declare what value a reference should -point to: - -``` -sawscript> :type mir_points_to -MIRValue -> MIRValue -> MIRSetup () -``` - -Here, the first `MIRValue` argument represents a reference value, and the -second `MIRValue` argument represents the value that the reference should point -to. In our spec for `read_ref`, we can declare that the reference should point -to a symbolic `u32` value like so: - -``` -$include 3-9 code/ref-basics.saw -``` - -We have renamed `r` to `r_ref` in this revised spec to more easily distinguish -it from `r_val`, which is the value that `r_ref` is declared to point to using -`mir_points_to`. In this version of the spec, it is clear that we should return -`r_val` using `mir_return`, as `r_val` is exactly the value that will be -computed by dereferencing `r_ref`. - -This pattern, where a call to `mir_alloc`/`mir_alloc_mut` to followed by a call -to `mir_points_to`, is common with function specs that involve references. -Later in the tutorial, we will see other examples of `mir_points_to` where the -reference argument does not come from `mir_alloc`/`mir_alloc_mut`. - -The argument to `read_ref` is an immutable reference, so the implementation of -the function is not allowed to modify the memory that the argument points to. -Rust also features mutable references that do permit modifying the underlying -memory, as seen in this `swap` function: - -``` rust -$include 5-11 code/ref-basics.rs -``` - -A corresponding spec for `swap` is: - -``` -$include 15-28 code/ref-basics.saw -``` - -There are two interesting things worth calling out in this spec: - -1. Instead of allocating the reference values with `mir_alloc`, we instead use - `mir_alloc_mut`. This is a consequence of the fact that `&mut u32` is a - different type from `&mut` in Rust (and in MIR), and and such, we need a - separate `mir_alloc_mut` to get the types right. -2. This spec features calls to `mir_points_to` before _and_ after - `mir_execute_func`. This is because the values that `a_ref` and `b_ref` point - to before calling the function are different than the values that they point - to after calling the function. The two uses to `mir_points_to` after the - function has been called swap the order of `a_val` and `b_val`, reflecting - the fact that the `swap` function itself swaps the values that the references - point to. - -# Compound data types - -Besides integer types and reference types, Rust also features a variety of other -interesting data types. This part of the tutorial will briefly go over some of -these data types and how to interface with them in SAW. - -## Array types - -Rust includes array types where the length of the array is known ahead of time. -For instance, this `index` function takes an `arr` argument that must contain -exactly three `u32` values: - -``` rust -$include 1-3 code/arrays.rs -``` - -While Rust is good at catching many classes of programmer errors at compile -time, one thing that it cannot catch in general is out-of-bounds array -accesses. In this `index` example, calling the function with a value of `idx` -ranging from `0` to `2` is fine, but any other choice of `idx` will cause the -program to crash, since the `idx` will be out of the bounds of `arr`. - -SAW is suited to checking for these sorts of out-of-bound accesses. Let's write -an incorrect spec for `index` to illustrate this: - -``` -$include 3-14 code/arrays-fail.saw -``` - -Before we run this with SAW, let's highlight some of the new concepts that this -spec uses: - -1. The type of the `arr` variable is specified using `mir_array 3 mir_u32`. - Here, the `mir_array` function takes the length of the array and the element - type as arguments, just as in Rust. -2. The spec declares the return value to be `{{ arr @ idx }}`, where `@` is - Cryptol's indexing operator. Also note that it is completely valid to embed - a MIR array type into a Cryptol expression, as Cryptol has a sequence type - that acts much like arrays do in MIR. - -As we hinted above, this spec is wrong, as it says that this should work for -_any_ possible values of `idx`. SAW will catch this mistake: - -``` -$ saw arrays-fail.saw - - - -[21:03:05.374] Loading file "arrays-fail.saw" -[21:03:05.411] Verifying arrays/47a26581::index[0] ... -[21:03:05.425] Simulating arrays/47a26581::index[0] ... -[21:03:05.426] Checking proof obligations arrays/47a26581::index[0] ... -[21:03:05.445] Subgoal failed: arrays/47a26581::index[0] index out of bounds: the length is move _4 but the index is _3 -[21:03:05.445] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 53} -[21:03:05.445] ----------Counterexample---------- -[21:03:05.445] idx: 2147483648 -[21:03:05.445] Stack trace: -"mir_verify" (arrays-fail.saw:14:1-14:11) -Proof failed. -``` - -We can repair this spec by adding some preconditions: - -``` -$include 3-12 code/arrays.saw -``` - -An alternative way of writing this spec is by using SAW's `mir_array_value` -command: - -``` -sawscript> :type mir_array_value -MIRType -> [MIRValue] -> MIRValue -``` - -Here, the `MIRType` argument represents the element type, and the list of -`MIRValue` arguments are the element values of the array. We can rewrite -`index_spec` using `mir_array_value` like so: - -``` -$include 18-30 code/arrays.saw -``` - -Here, `[arr0, arr1, arr2]` is Cryptol notation for constructing a length-3 -sequence consisting of `arr0`, `arr1`, and `arr2` as the elements. -`index_alt_spec` is equivalent to `index_spec`, albeit more verbose. For this -reason, it is usually preferable to use `mir_fresh_var` to create an entire -symbolic array rather than creating separate symbolic values for each element -and combining them with `mir_array_value`. - -There are some situations where `mir_array_value` is the only viable choice, -however. Consider this variant of the `index` function: - -``` rust -$include 5-7 code/arrays.rs -``` - -When writing a SAW spec for `index_ref_arr`, we can't just create a symbolic -variable for `arr` using `mir_alloc (mir_array 3 ...)`, as the reference values -in the array wouldn't point to valid memory. Instead, we must individually -allocate the elements of `arr` using separate calls to `mir_alloc` and then -build up the array using `mir_array_value`. (As an exercise, try writing and -verifying a spec for `index_ref_arr`). - -## Tuple types - -Rust includes tuple types where the elements of the tuple can be of different -types. For example: - -``` rust -$include 1-3 code/tuples.rs -``` - -SAW includes a `mir_tuple` function for specifying the type of a tuple value. -In addition, one can embed MIR tuples into Cryptol, as Cryptol also includes -tuple types whose fields can be indexed with `.0`, `.1`, etc. Here is a spec -for `flip` that makes use of all these features: - -``` -$include 3-9 code/tuples.saw -``` - -SAW also includes a `mir_tuple_value` function for constructing a tuple value -from other `MIRValue`s: - -``` -sawscript> :type mir_tuple_value -[MIRValue] -> MIRValue -``` - -`mir_tuple_value` plays a similar role for tuples as `mir_array_value` does for -arrays. - -## Struct types - -Rust supports the ability for users to define custom struct types. Structs are -uniquely identified by their names, so if you have two structs like these: - -``` rust -$include 1-2 code/structs.rs -``` - -Then even though the fields of the `S` and `T` structs are the same, they are -_not_ the same struct. This is a type system feature that Cryptol does not -have, and for this reason, it is not possible to embed MIR struct values into -Cryptol. It is also not possible to use `mir_fresh_var` to create a symbolic -struct value. Instead, one can use the `mir_struct_value` command: - -``` -sawscript> :type mir_struct_value -MIRAdt -> [MIRValue] -> MIRValue -``` - -Like with `mir_array_value` and `mir_tuple_value`, the `mir_struct_value` -function takes a list of `MIRValue`s as arguments. What makes -`mir_struct_value` unique is its `MIRAdt` argument, which we have not seen up -to this point. In this context, "`Adt`" is shorthand for "[algebraic data -type](https://en.wikipedia.org/wiki/Algebraic_data_type)", and Rust's structs -are an example of ADTs. (Rust also supports enums, another type of ADT that we -will see later in this tutorial.) - -ADTs in Rust are named entities, and as such, they have unique identifiers in -the MIR JSON file in which they are defined. Looking up these identifiers can -be somewhat error-prone, so SAW offers a `mir_find_adt` command that computes -an ADT's identifier and returns the `MIRAdt` associated with it: - -``` -sawscript> :type mir_find_adt -MIRModule -> String -> [MIRType] -> MIRAdt -``` - -Here, `MIRModule` correspond to the MIR JSON file containing the ADT -definition, and the `String` is the name of the ADT whose identifier we want to -look up. The list of `MIRType`s represent types to instantiate any type -parameters to the struct (more on this in a bit). - -As an example, we can look up the `S` and `T` structs from above like so: - -``` -$include 3-6 code/structs.saw -``` - -We pass an empty list of `MIRType`s to each use of `mir_find_adt`, as neither -`S` nor `T` have any type parameters. An example of a struct that does include -type parameters can be seen here: - -``` rust -$include 12-12 code/structs.rs -``` - -As mentioned before, SAW doesn't support generic definitions out of the box, so -the only way that we can make use of the `Foo` struct is by looking up a -particular instantiation of `Foo`'s type parameters. If we define a function -like this, for example: - -``` rust -$include 14-16 code/structs.rs -``` - -Then this function instantiates `Foo`'s `A` type parameter with `u32` and the -`B` type parameter with `u64`. We can use `mir_find_adt` to look up this -particular instantiation of `Foo` like so: - -``` -$include 7-7 code/structs.saw -``` - -In general, a MIR JSON file can have many separate instantiations of a single -struct's type parameters, and each instantiation must be looked up separately -using `mir_find_adt`. - -Having looked up `Foo` using `mir_find_adt`, let's use the resulting -`MIRAdt` in a spec: - -``` -$include 9-18 code/structs.saw -``` - -Note that we are directly writing out the values `27` and `42` in Cryptol. -Cryptol's numeric literals can take on many different types, so in order to -disambiguate which type they should be, we give each numeric literal an -explicit type annotation. For instance, the expression `27 : [32]` means that -`27` should be a 32-bit integer. - -### Symbolic structs - -Let's now verify a function that takes a struct value as an argument: - -``` rust -$include 18-22 code/structs.rs -``` - -Moreover, let's verify this function for all possible `Bar` values. One way to -do this is to write a SAW spec that constructs a struct value whose fields are -themselves symbolic: - -``` -$include 20-38 code/structs.saw -``` - -This is a rather tedious process, however, as we had to repeatedly use -`mir_fresh_var` to create a fresh, symbolic value for each field. Moreover, -because `mit_fresh_var` does not work for structs, we had to recursively apply -this process in order to create a fresh `Foo` value. It works, but it takes a -lot of typing to accomplish. - -To make this process less tedious, SAW offers a `mir_fresh_expanded_value` -command that allows one to create symbolic values of many more types. While -`mir_fresh_var` is limited to those MIR types that can be directly converted to -Cryptol, `mir_fresh_expanded_value` can create symbolic structs by automating -the process of creating fresh values for each field. This process also applies -recursively for struct fields, such as the `Foo` field in `Bar`. - -As an example, a much shorter way to write the spec above using -`mir_fresh_expanded_value` is: - -``` -$include 42-48 code/structs.saw -``` - -That's it! Note that the string `"b"` is used as a prefix for all fresh names -that `mir_fresh_expanded_value` generates, so if SAW produces a counterexample -involving this symbolic struct value, one can expect to see names such as -`b_0`, `b_1`, etc. for the fields of the struct. - -`mir_fresh_expanded_value` makes it easier to construct large, compound values -that consist of many smaller, inner values. The drawback is that you can't -refer to these inner values in the postconditions of a spec. As a result, there -are some functions for which `mir_fresh_expanded_value` isn't suitable, so keep -this in mind before reaching for it. - -## Enum types - -Besides structs, another form of ADT that Rust supports are enums. Each enum -has a number of different _variants_ that describe the different ways that an -enum value can look like. A famous example of a Rust enum is the `Option` type, -which is defined by the standard library like so: - -``` rust -enum Option { - None, - Some(T), -} -``` - -`Option` is commonly used in Rust code to represent a value that may be present -(`Some`) or absent (`None`). For this reason, we will use `Option` as our -motivating example of an enum in this section. - -First, let's start by defining some functions that make use of `Option`'s -variants: - -``` rust -$include 1-7 code/enums.rs -``` - -Both functions return an `Option` value, but each function returns a -different variant. In order to tell these variants apart, we need a SAW -function which can construct an enum value that allows the user to pick which -variant they want to construct. The `mir_enum_value function does exactly that: - -``` -sawscript> :type mir_enum_value -MIRAdt -> String -> [MIRValue] -> MIRValue -``` - -Like `mir_struct_value`, `mir_enum_value` also requires a `MIRAdt` argument in -order to discern which particular enum you want. Unlike `mir_struct_value`, -however, it also requires a `String` which variant of the enum you want. In the -case of `Option`, this `String` will either be `"None"` or `"Some"`. Finally, -the `[MIRValue]` arguments represent the fields of the enum variant. - -Let's now verify some enum-related code with SAW. First, we must look up the -`Option` ADT, which works just as if you had a struct type: - -``` -$include 5-5 code/enums.saw -``` - -Next, we can use this ADT to construct enum values. We shall use -`mir_enum_value` to create a `Some` value in the spec for `i_found_something`: - -``` -$include 7-16 code/enums.saw -``` - -Note that while we used the full identifier `core::option::Option` to look up -the `Option` ADT, we do not need to use the `core::option` prefix when -specifying the `"Some"` variant. This is because SAW already knows what the -prefix should be from the `option_u32` ADT, so the `"Some"` shorthand suffices. - -Similarly, we can also write a spec for `i_got_nothing`, which uses the `None` -variant: - -``` -$include 18-25 code/enums.saw -``` - -### Symbolic enums - -In order to create a symbolic struct, one could create symbolic fields and pack -them into a larger struct value using `mir_struct_value`. The same process is -not possible with `mir_enum_value`, however, as a symbolic enum value would -need to range over _all_ possible variants in an enum. - -Just as `mir_fresh_expanded_value` supports creating symbolic structs, -`mir_fresh_expanded_value` also supports creating symbolic enum values. For -example, given this function that accepts an `Option` value as an -argument: - -``` rust -$include 9-11 code/enums.rs -``` - -We can write a spec for this function that considers all possible `Option` -values like so: - -``` -$include 27-33 code/enums.saw -``` - -Here, `o` can be a `None` value, or it can be a `Some` value with a symbolic -field. - -## Slices - -Slices are a particular type of reference that allow referencing contiguous -sequences of elements in a collection, such as an array. Unlike ordinary -references (e.g., `&u32`), SAW does not permit allocating a slice directly. -Instead, one must take a slice of an existing reference. To better illustrate -this distinction, consider this function: - -``` rust -$include 1-3 code/slices.rs -``` - -`sum_of_prefix` takes a slice to a sequence of `u32`s as an argument, indexes -into the first two elements in the sequence, and adds them together. There are -many possible ways we can write a spec for this function, as the slice argument -may be backed by many different sequences. For example, the slice might be -backed by an array whose length is exactly two: - -``` rust -$include 6-8 code/slices.rs -``` - -We could also make a slice whose length is longer than two: - -``` rust -$include 10-12 code/slices.rs -``` - -Alternatively, the slice might be a subset of an array whose length is longer -than two: - -``` rust -$include 14-16 code/slices.rs -``` - -All of these are valid ways of building the slice argument to `sum_of_prefix`. -Let's try to write SAW specifications that construct these different forms of -slices. To do so, we will need SAW functions that take a reference to a -collection (e.g., an array) and converts them into a slice reference. The -`mir_slice_value` function is one such function: - -``` -sawscript> :type mir_slice_value -MIRValue -> MIRValue -``` - -`mir_slice_value arr_ref` is the SAW equivalent of writing `arr_ref[..]`. That -is, if `arr_ref` is of type `&[T; N]`, then `mir_slice_value arr_ref` is of -type `&[T]`. Note that `arr_ref` must be a _reference_ to an array, not an -array itself. - -Let's use `mir_slice_value` to write a spec for `sum_of_prefix` when the slice -argument is backed by an array of length two: - -``` -$include 5-15 code/slices.saw -``` - -The first part of this spec allocates an array reference `a_ref` and declares -that it points to a fresh array value `a_val`. The next part declares a slice -`s` that is backed by the entirety of `a_ref`, which is then passed as an -argument to the function itself. Finally, the return value is declared to be -the sum of the first and second elements of `a_val`, which are the same values -that back the slice `s` itself. - -As noted above, the `sum_of_prefix` function can work with slices of many -different lengths. Here is a slight modification to this spec that declares it -to take a slice of length 5 rather than a slice of length 2: - -``` -$include 19-29 code/slices.saw -``` - -Both of these examples declare a slice whose length matches the length of the -underlying array. In general, there is no reason that these have to be the -same, and it is perfectly fine for a slice's length to be less than the the -length of the underlying array. In Rust, for example, we can write a slice of a -subset of an array by writing `&arr_ref[0..2]`. The SAW equivalent of this can -be achieved with the `mir_slice_range_value` function: - -``` -sawscript> :type mir_slice_range_value -MIRValue -> Int -> Int -> MIRValue -``` - -`mir_slice_range_value` takes takes two additional `Int` arguments that -represent (1) the index to start the slice from, and (2) the index at which the -slice ends. For example, `mir_slice_range_value arr_ref 0 2` creates a slice -that is backed by the first element (index `0`) and the second element (index -`1`) of `arr_ref`. Note that the range `[0..2]` is half-open, so this range -does _not_ include the third element (index `2`). - -For example, here is how to write a spec for `sum_of_prefix` where the slice is -a length-2 subset of the original array: - -``` -$include 33-43 code/slices.saw -``` - -Note that both `Int` arguments to `mir_slice_range_value` must be concrete -(i.e., not symbolic). (See the section below if you want an explanation for why -they are not allowed to be symbolic.) - -### Aside: slices of arbitrary length - -After reading the section about slices above, one might reasonably wonder: is -there a way to write a more general spec for `sum_of_prefix`: that covers all -possible slice lengths `n`, where `n` is greater than or equal to 2? In this -case, the answer is "no". - -This is a fundamental limitation of the way SAW's symbolic execution works. The -full reason for why this is the case is somewhat technical (keep reading if you -want to learn more), but the short answer is that if SAW attempts to -simulate code whose length is bounded by a symbolic integer, then SAW will go -into an infinite loop. To avoid this pitfall, the `mir_slice_range_value` -function very deliberately requires the start and end values to be concrete -integers, as allowing these values to be symbolic would allow users to -inadvertently introduce infinite loops in their specifications. - -A longer answer as to why SAW loops forever on computations that are bounded by -symbolic lengths: due to the way SAW's symblolic execution works, it creates a -complete model of the behavior of a function for all possible inputs. The way -that SAW achieves this is by exploring all possible execution paths through a -program. If a program involves a loop, for example, then SAW will unroll all -iterations of the loop to construct a model of the loop's behavior. Similarly, -if a sequence (e.g., a slice or array) has an unspecified length, then SAW must -consider all possible lengths of the array. - -SAW's ability to completely characterize the behavior of all paths through a -function is one of its strengths, as this allows it to prove theorems that -other program verification techniques would not. This strength is also a -weakness, however. If a loop has a symbolic number of iterations, for example, -then SAW will spin forever trying to unroll the loop. Similarly, if a slice -were to have a symbolic length, then SAW would spin forever trying to simulate -the program for all possible slice lengths. - -In general, SAW cannot prevent users from writing programs whose length is -bounded by a symbolic value. For now, however, SAW removes one potential -footgun by requiring that slice values always have a concrete length. - -# Overrides and compositional verification - -Up until this point, all uses of `mir_verify` in this tutorial have provided an -empty list (`[]`) of overrides. This means that any time SAW has simulated a -function which calls another function, it will step into the definition of the -callee function and verify its behavior alongside the behavior of the callee -function. This is a fine thing to do, but it can be inefficient. For example, -consider a function like this: - -``` rust -$include 5-9 code/overrides.rs -``` - -Here, the caller function `f` invokes the callee function `g` three separate -times. If we verify `f` with `mir_verify` as we have done up until this point, -then SAW must analyze the behavior of `g` three separate times. This is -wasteful, and especially so if `g` is a large and complicated function. - -This is where _compositional verification_ enters the picture. The idea behind -compositional verification is that when we prove properties of a caller -function, we can reuse properties that we have already proved about callee -functions. These properties are captured as _override specifications_, which -are also referred to by the shorthand term _overrides_. When a caller invokes a -callee with a corresponding override specification, the override's properties -are applied without needing to re-simulate the entire function. - -As it turns out, the command needed to produce an override specification is -already familiar to us—it's `mir_verify`! If you examine the type of this -command: - -``` -sawscript> :type mir_verify -MIRModule -> String -> [MIRSpec] -> Bool -> MIRSetup () -> ProofScript () -> TopLevel MIRSpec -``` - -The returned value is a `MIRSpec`, which captures the behavior of the function -that was verified as an override spec. This override can then be passed to -another call to `mir_verify` to use as part of a larger proof. - -Let's now try compositional verification in practice. To do so, we will first -prove a spec for the `g` function above. For demonstration purposes, we will -pick a simplistic implementation of `g`: - -``` rust -$include 1-3 code/overrides.rs -``` - -Note that we don't really _have_ to use compositional verification when `g` is -this simple, as SAW is capable of reasoning about `g`'s behavior directly when -proving a spec for `f`. It's still worth going along with this exercise, -however, as the same principles of compositional verification apply whether the -implementation of `g` is small or large. - -The first step of compositional verification is to prove a spec for `g`, the -callee function: - -``` -$include 5-13 code/overrides.saw -``` - -There's nothing that different about this particular proof from the proofs -we've seen before. The only notable difference is that we bind the result of -calling `mir_verify` to a `MIRSpec` value that we name `g_ov` (short for "`g` -override"). This part is important, as we will need to use `g_ov` shortly. - -The next step is to write a spec for `f`. Since `g` adds `1` to its argument, -`f` will add `3` to its argument: - -``` -$include 15-21 code/overrides.saw -``` - -Again, nothing too surprising. Now let's prove `f` against `f_spec` by using -`g_ov` as a compositional override: - -``` -$include 23-23 code/overrides.saw -``` - -Here, note that instead of passing an empty list (`[]`) as we have done before, -we now pass a list containing `g_ov`. This informs `mir_verify` that whenever -it simulates a call to `g`, it should reuse the properties captured in `g_ov`. -In general, we can pass as many overrides as we want (we will see examples of -this later in the tutorial), but for now, one override will suffice. - -Let's run the proof of `f` against `f_spec`, making sure to pay attention to -the output of SAW: - -``` -[19:06:17.392] Verifying overrides/96c5af24::f[0] ... -[19:06:17.406] Simulating overrides/96c5af24::f[0] ... -[19:06:17.407] Matching 1 overrides of overrides/96c5af24::g[0] ... -[19:06:17.407] Branching on 1 override variants of overrides/96c5af24::g[0] ... -[19:06:17.407] Applied override! overrides/96c5af24::g[0] -[19:06:17.407] Matching 1 overrides of overrides/96c5af24::g[0] ... -[19:06:17.407] Branching on 1 override variants of overrides/96c5af24::g[0] ... -[19:06:17.407] Applied override! overrides/96c5af24::g[0] -[19:06:17.407] Matching 1 overrides of overrides/96c5af24::g[0] ... -[19:06:17.407] Branching on 1 override variants of overrides/96c5af24::g[0] ... -[19:06:17.407] Applied override! overrides/96c5af24::g[0] -[19:06:17.407] Checking proof obligations overrides/96c5af24::f[0] ... -[19:06:17.422] Proof succeeded! overrides/96c5af24::f[0] -``` - -We've now proven `f` compositionally! The first two lines ("`Verifying ...`" -and "`Simulating ...`") and the last two lines ("`Checking proof obligations -...`" and "`Proof succeeded! ..."`) are the same as before, but this time, we -have some additional lines of output in between: - -* Whenever SAW prints "`Matching overrides of `", that's when you - know that SAW is about to simulate a call to ``. At that point, SAW - will check to see how many overrides (``) for `` are available. -* Whenever SAW prints "`Brancing on override variants of ", SAW is - trying to figure out which of the `` overrides to apply. In this example, - there is only a single override, so the choice is easy. In cases where there - are multiple overrides, however, SAW may have to work harder (possibly even - consulting an SMT solver) to figure out which override to use. -* If SAW successfully picks an override to apply, it will print - "`Applied override! ...`". - -In the example above, we used a single `g` override that applies for all -possible arguments. In general, however, there is no requirement that overrides -must work for all arguments. In fact, it is quite common for SAW verification -efforts to write different specifications for the same function, but with -different arguments. We can then provide multiple overrides for the same -function as part of a compositional verification, and SAW will be able to pick -the right override depending on the shape of the argument when invoking the -function being overridden. - -For example, let's suppose that we wrote different `g` specs, one where the -argument to `g` is even, and another where the argument to `g` is odd: - -``` -$include 25-44 code/overrides.saw -``` - -We can then prove `f` compositionally by passing both of the `g` overrides to -`mir_verify`: - -``` -$include 45-45 code/overrides.saw -``` - -Like before, this will successfully verify. The only different now is that SAW -will print output involving two overrides instead of just one: - -``` -[20:48:07.649] Simulating overrides/96c5af24::f[0] ... -[20:48:07.650] Matching 2 overrides of overrides/96c5af24::g[0] ... -[20:48:07.650] Branching on 2 override variants of overrides/96c5af24::g[0] ... -[20:48:07.652] Applied override! overrides/96c5af24::g[0] -... -``` - -Keep in mind that if you provide at least one override for a function as part -of a compositional verification, then SAW _must_ apply an override whenever it -invokes that function during simulation. If SAW cannot find a matching -override, then the verification will fail. For instance, consider what would -happen if you tried proving `f` like so: - -``` -$include 33-33 code/overrides-fail.saw -``` - -This time, we supply one override for `g` that only matches when the argument -is even. This is a problem, as SAW will not be able to find a matching override -when the argument is odd. Indeed, SAW will fail to verify this: - -``` -[20:53:29.588] Verifying overrides/96c5af24::f[0] ... -[20:53:29.602] Simulating overrides/96c5af24::f[0] ... -[20:53:29.602] Matching 1 overrides of overrides/96c5af24::g[0] ... -[20:53:29.602] Branching on 1 override variants of overrides/96c5af24::g[0] ... -[20:53:29.603] Applied override! overrides/96c5af24::g[0] -[20:53:29.603] Matching 1 overrides of overrides/96c5af24::g[0] ... -[20:53:29.603] Branching on 1 override variants of overrides/96c5af24::g[0] ... -[20:53:29.604] Applied override! overrides/96c5af24::g[0] -[20:53:29.604] Matching 1 overrides of overrides/96c5af24::g[0] ... -[20:53:29.604] Branching on 1 override variants of overrides/96c5af24::g[0] ... -[20:53:29.605] Applied override! overrides/96c5af24::g[0] -[20:53:29.605] Symbolic simulation completed with side conditions. -[20:53:29.606] Checking proof obligations overrides/96c5af24::f[0] ... -[20:53:29.623] Subgoal failed: overrides/96c5af24::f[0] No override specification applies for overrides/96c5af24::g[0]. -Arguments: -- c@26:bv -Run SAW with --sim-verbose=3 to see a description of each override. -[20:53:29.623] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 388} -[20:53:29.624] ----------Counterexample---------- -[20:53:29.624] x: 1 -... -Proof failed. -``` - -Here, we can see that `No override specification applies`, and SAW also -generates a counterexample of `x: 1`. Sure enough, `1` is an odd number! - -## Overrides and mutable references - -Compositional overrides provide great power, as they effectively allow you to -skip over certain functions when simulating them and replace them with simpler -implementations. With great power comes great responsibility, however. In -particular, one must be careful when using overrides for functions that modify -mutable references. If an override does not properly capture the behavior of a -mutable reference, it could potentially lead to incorrect proofs. - -This is the sort of thing that is best explained with an example, so consider -these two functions: - -``` rust -$include 1-9 code/overrides-mut.rs -``` - -The `side_effect` function does not return anything interesting; it is only -ever invoked to perform a side effect of changing the mutable reference `a` to -point to `0`. The `foo` function invokes `side_effect`, and as a result, it -will always return `0`, regardless of what the argument to `foo` is. No -surprises just yet. - -Now let's make a first attempt at verifying `foo` using compositional -verification. First, we will write a spec for `side_effect`: - -``` -$include 5-10 code/overrides-mut-fail.saw -``` - -`side_effect_spec` is somewhat odd. Although it goes through the effort of -allocating a mutable reference `a_ref` and initializing it, nothing about this -spec states that `a_ref` will point to `0` after the function has been invoked. -This omission is strange, but not outright wrong—the spec just underspecifies -what the behavior of the function is. Indeed, SAW will successfully verify this -spec using `mir_verify`: - -``` -$include 18-18 code/overrides-mut-fail.saw -``` - -Next, let's try to write a spec for `foo`: - -``` -$include 12-16 code/overrides-mut-fail.saw -``` - -At this point, alarm bells should be going off in your head. This spec -incorrectly states that `foo(x)` should return `x`, but it should actually -return `0`! This looks wrong, but consider what would happen if you tried to -verify this compositionally using our `side_effect_ov` override: - -``` -$include 19-19 code/overrides-mut-fail.saw -``` - -If SAW were to simulate `foo(x)`, it would invoke create a temporary variable -`b` and assign it to the value `x`, and then it would invoke `side_effect(&mut -b)`. At this point, the `side_effect_ov` override would apply. According to -`side_effect_spec`, the argument to `side_effect` is not modified at all after -the function returns. This means that when the `foo` function returns `b`, it -will still retain its initial value of `x`. This shows that if we were to use -`side_effect_ov`, we could prove something that's blatantly false! - -Now that we've made you sweat a little bit, it's time for some good news: SAW -won't _actually_ let you prove `foo_spec`. If you try this compositional proof -in practice, SAW will catch your mistake: - -``` -[14:50:29.170] Verifying overrides_mut/11e47708::foo[0] ... -[14:50:29.181] Simulating overrides_mut/11e47708::foo[0] ... -[14:50:29.181] Matching 1 overrides of overrides_mut/11e47708::side_effect[0] ... -[14:50:29.181] Branching on 1 override variants of overrides_mut/11e47708::side_effect[0] ... -... -State of memory allocated in precondition (at overrides-mut-fail.saw:6:12) not described in postcondition -``` - -The line of code that SAW points to in the "`State of memory ...`" error -message is: - -``` -$include 6-6 code/overrides-mut-fail.saw -``` - -SAW informs us that although we allocated the mutable reference `a_ref`, we -never indicated what it should point to after the function has returned. This -is an acceptable (if somewhat unusual) thing to do when verifying -`side_effect_spec` using `mir_verify`, but it is _not_ acceptable to do this -when using this spec as an override. To avoid unsound behavior like what is -described above, any override that allocates a mutable reference in its -preconditions _must_ declare what its value should be in the postconditions, no -exceptions. - -Thankfully, repairing this spec is relatively straightforward. Simply add a -`mir_points_to` statement in the postconditions of `side_effect_spec`: - -``` -$include 5-13 code/overrides-mut.saw -``` - -Then use the correct return value in `foo_spec`: - -``` -$include 15-21 code/overrides-mut.saw -``` - -And now the compositional proof of `foo_spec` works! - -## Unsafe overrides - -Now that we've made it this far into the tutorial, it's time to teach you a -more advanced technique: _unsafe_ overrides. Up until this point, we have -relied on SAW to check all of our work, and this is usually what you'd want -from a formal verification tool. In certain circumstances, however, it can be -useful to say "I know what I'm doing, SAW—just believe me when I say this spec -is valid!" In order to say this, you can use `mir_unsafe_assume_spec`: - -``` -sawscript> :type mir_unsafe_assume_spec -MIRModule -> String -> MIRSetup () -> TopLevel MIRSpec -``` - -`mir_unsafe_assume_spec` is `mir_verify`'s cousin who likes to live a little -more dangerously. Unlike `mir_verify`, the specification that you pass to -`mir_unsafe_assume_spec` (the `MIRSetup ()` argument) is _not_ checked for full -correctness. That is, `mir_unsafe_assume_spec` will bypass SAW's usual symbolic -execution pipeline, which is why one does not need to pass a `ProofScript` -argument (e.g., `z3`) to `mir_unsafe_assume_spec`. SAW will believe whatever -spec you supply `mir_unsafe_assume_spec` to be valid, and the `MIRSpec` that -`mir_unsafe_assume_spec` returns can then be used in later compositional -verifications. - -Why would you want to do this? The main reason is that writing proofs can be -difficult, and sometimes, there are certain functions in a SAW verification -effort that are disproportionately harder to write a spec for than others. It -is tempting to write specs for each function in sequence, but this can run the -risk of getting stuck on a particularly hard-to-verify function, blocking -progress on other parts of the proofs. - -In these situations, `mir_unsafe_assume_spec` can be a useful prototyping tool. -One can use `mir_unsafe_assume_spec` to assume a spec for the hard-to-verify -function and then proceed with the remaining parts of the proof. Of course, you -should make an effort to go back and prove the hard-to-verify function's spec -later, but it can be nice to try something else first. - -For example, here is how one can unsafely assume `g_spec` and use it in a -compositional proof of `f_spec`: - -``` -$include 21-22 code/overrides-unsafe.saw -``` - -It should be emphasized that when we say "`unsafe`", we really mean it. -`mir_unsafe_assume_spec` can be used to prove specs that are blatantly wrong, -so use it with caution. - -# Static items - -Sometimes, Rust code makes use of [_static -items_](https://doc.rust-lang.org/reference/items/static-items.html), which are -definitions that are defined in a precise memory location for the entire -duration of the program. As such, static items can be thought of as a form of -global variables. - -## Immutable static items - -There are two kinds of static items in Rust: mutable static items (which have a -`mut` keyword) and immutable static items (which lack `mut`). Immutable static -items are much easier to deal with, so let's start by looking at an example of -a program that uses immutable static data: - -``` rust -$include 1-5 code/statics.rs -``` - -This function will return `ANSWER`, i.e., `42`. We can write a spec that says -as much: - -``` -$include 5-9 code/statics.saw -``` - -This works, but it is somewhat unsatisfying, as it requires hard-coding the -value of `ANSWER` into the spec. Ideally, we'd not have to think about the -precise implementation of static items like `ANSWER`. Fortunately, SAW makes -this possible by providing a `mir_static_initializer` function which computes -the initial value of a static item at the start of the program: - -``` -sawscript> :type mir_static_initializer -String -> MIRValue -``` - -In this case, `mir_static_initializer "statics::ANSWER"` is equivalent to -writing `mir_term {{ 42 : [32] }}`, so this spec is also valid: - -``` -$include 14-18 code/statics.saw -``` - -Like `mir_verify`, the `mir_static_initializer` function expects a full -identifier as an argument, so we must write `"statics::ANSWER"` instead of -just `"ANSWER". - -At the MIR level, there is a unique reference to every static item. You can -obtain this reference by using the `mir_static` function: - -``` -sawscript> :type mir_static -String -> MIRValue -``` - -Here is one situation in which you would need to use a _reference_ to a static -item (which `mir_static` computes) rather than the _value_ of a static item -(which `mir_static_initializer` computes): - -``` rust -$include 7-9 code/statics.rs -``` - -A spec for this function would look like this: - -``` -$include 23-27 code/statics.saw -``` - -That's about all there is to say regarding immutable static items. - -## Mutable static items - -Mutable static items are a particularly tricky aspect of Rust. Including a -mutable static item in your program is tantamount to having mutable global -state that any function can access and modify. They are so tricky, in fact, -that Rust does not even allow you to use them unless you surround them in an -`unsafe` block: - -``` rust -$include 11-15 code/statics.rs -``` - -The `mir_static_initializer` and `mut_static` functions work both immutable and -mutable static items, so we can write specs for mutable items using mostly the -same techniques as for writing specs for immutable items. We must be careful, -however, as SAW is pickier when it comes to specifying the initial values of -mutable static items. For example, here is naïve attempt at porting the spec -for `answer_to_the_ultimate_question` over to its mutable static counterpart, -`mut_answer_to_the_ultimate_question`: - -``` -$include 5-9 code/statics-fail.saw -``` - -This looks plausible, but SAW will fail to verify it: - -``` -[21:52:32.738] Verifying statics/28a97e47::mut_answer_to_the_ultimate_question[0] ... -[21:52:32.745] Simulating statics/28a97e47::mut_answer_to_the_ultimate_question[0] ... -... -Symbolic execution failed. -Abort due to assertion failure: - statics.rs:14:14: 14:24: error: in statics/28a97e47::mut_answer_to_the_ultimate_question[0] - attempted to read empty mux tree -``` - -Oh no! Recall that we have seen this "`attempted to read empty mux tree`" error -message once before when discussing reference types. This error arose when we -attempted to read from uninitialized memory from a reference value. The same -situation applies here. A static item is backed by a reference, and SAW -deliberately does _not_ initialize the memory that a mutable static reference -points to upon program startup. Since we did not initialize `MUT_ANSWER`'s -reference value in the preconditions of the spec, SAW crashes at simulation -time when it attempts to read from the uninitialized memory. - -The solution to this problem is to perform this initialization explicitly using -`mir_points_to` in the preconditions of the spec. For example, this is a valid -spec: - -``` -$include 32-40 code/statics-fail.saw -``` - -We don't necessarily have to use `mir_static_initializer` as the starting value -for `MUT_ANSWER`, however. This spec, which uses `27` as the starting value, is -equally valid: - -``` -$include 45-52 code/statics-fail.saw -``` - -At this point, you are likely wondering: why do we need to explicitly -initialize mutable static references but not immutable static references? After -all, when we wrote a spec for `answer_to_the_ultimate_question` earlier, we -managed to get away with not initializing the reference for `ANSWER` (which is -an immutable static item). The difference is that the value of a mutable static -item can change over the course of a program, and SAW requires that you be very -careful in specifying what a mutable static value is at the start of a -function. For example, consider a slightly extended version of the earlier Rust -code we saw: - -``` rust -$include 11-22 code/statics.rs -``` - -Suppose someone were to ask you "what value does -`mut_answer_to_the_ultimate_question` return?" This is not a straightforward -question to answer, as the value that it returns depends on the surrounding -context. If you were to call `mut_answer_to_the_ultimate_question` right as the -program started, it would return `42`. If you were to call -`mut_answer_to_the_ultimate_question` as part of the implementation of -`alternate_universe`, however, then it would return `27`! This is an inherent -danger of using mutable static items, as they can be modified at any time by -any function. For this reason, SAW requires you to be explicit about what the -initial values of mutable static items should be. - -### Mutable static items and compositional overrides - -In the "Overrides and mutable references" section, we discussed the potential -pitfalls of using mutable references in compositional overrides. Mutable static -items are also mutable values that are backed by references, and as such, they -are also subject to the same pitfalls. Let's see an example of this: - -``` rust -$include 1-12 code/statics-compositional.rs -``` - -The setup is almost the same, except that instead of passing a mutable -reference as an argument to `side_effect`, we instead declare a mutable static -item `A` that is shared between `side_effect` and `foo`. We could potentially -write SAW specs for `side_effect` and `foo` like these: - -``` -$include 5-20 code/statics-compositional-fail.saw -``` - -Note that we have once again underspecified the behavior of `side_effect`, as -we do not say what `A`'s value should be in the postconditions of -`side_effect_spec`. Similarly, `foo_spec` is wrong, as it should return `0` -rather than the initial value of `A`. By similar reasoning as before, we run -the risk that using `side_effect_ov` could lead use to prove something -incorrect. Thankfully, SAW can also catch this sort of mistake: - -``` -[15:46:38.525] Verifying statics_compositional/16fea9c0::side_effect[0] ... -[15:46:38.533] Simulating statics_compositional/16fea9c0::side_effect[0] ... -[15:46:38.533] Checking proof obligations statics_compositional/16fea9c0::side_effect[0] ... -[15:46:38.533] Proof succeeded! statics_compositional/16fea9c0::side_effect[0] -[15:46:38.533] Verifying statics_compositional/16fea9c0::foo[0] ... -[15:46:38.542] Simulating statics_compositional/16fea9c0::foo[0] ... -[15:46:38.542] Matching 1 overrides of statics_compositional/16fea9c0::side_effect[0] ... -[15:46:38.542] Branching on 1 override variants of statics_compositional/16fea9c0::side_effect[0] ... -... -State of mutable static variable "statics_compositional/16fea9c0::A[0]" not described in postcondition -``` - -To repair this proof, add a `mir_points_to` statement in the postconditions of -`side_effect_spec`: - -``` -$include 7-13 code/statics-compositional.saw -``` - -And then correct the behavior of `foo_spec`: - -``` -$include 15-22 code/statics-compositional.saw -``` - -Be warned that if your program declares any mutable static items, then any -compositional override _must_ state what the value of each mutable static item -is in its postconditions. This applies _even if the override does not directly -use the mutable static items_. For example, if we had declared a second mutable -static item alongside `A`: - -``` rust -static mut A: u32 = 42; -static mut B: u32 = 27; -``` - -Then `side_effect_spec` would need an additional `mir_points_to` statement -involving `B` to satisfy this requirement. This requirement is somewhat -heavy-handed, but it is necessary in general to avoid unsoundness. Think -carefully before you use mutable static items! - -# Case study: Salsa20 - -If you've made it this far into the tutorial, congrats! You've now been exposed -to all of the SAW fundamentals that you need to verify Rust code found in the -wild. Of course, talking about verifying real-world code is one thing, but -actually _doing_ the verification is another thing entirely. Making the jump -from the small examples to "industrial-strength" code can be intimidating. - -To make this jump somewhat less frightening, the last part of this tutorial -will consist of a case study in using SAW to verify a non-trivial piece of Rust -code. In particular, we will be looking at a Rust implementation of the -[Salsa20](https://en.wikipedia.org/wiki/Salsa20) stream cipher. We do not -assume any prior expertise in cryptography or stream ciphers in this tutorial, -so don't worry if you are not familiar with Salsa20. - -More than anything, this case study is meant to emphasize that verification is -an iterative process. It's not uncommon to try something with SAW and encounter -an error message. That's OK! We will explain what can go wrong when verifying -Salsa20 and how to recover from these mistakes. Later, if you encounter similar -issues when verifying your own code with SAW, the experience you have developed -when developing these proofs can inform you of possible ways to fix the issues. - -## The `salsa20` crate - -The code for this Salsa20 implementation we will be verifying can be found -under the -[`code/salsa20`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20) -subdirectory. This code is adapted from version 0.3.0 of the `salsa20` crate, -which is a part of the -[`stream-ciphers`](https://github.com/RustCrypto/stream-ciphers) project. The -code implements Salsa20 as well as variants such as HSalsa20 and XSalsa20, but -we will only be focusing on the original Salsa20 cipher in this tutorial. - -The parts of the crate that are relevant for our needs are mostly contained in -the -[`src/core.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/core.rs) -file, as well as some auxiliary definitions in the -[`src/rounds.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/rounds.rs) -and -[`src/lib.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/lib.rs) -files. You can take a look at these files if you'd like, but you don't need to -understand everything in them just yet. We will introduce the relevant parts of -the code in the tutorial as they come up. - -## Salsa20 preliminaries - -Salsa20 is a stream cipher, which is a cryptographic technique for encrypting -and decrypting messages. A stream cipher encrypts a message by combining it -with a _keystream_ to produce a ciphertext (the encrypted message). Moreover, -the same keystream can then be combined with the ciphertext to decrypt it back -into the original message. - -The original author of Salsa20 has published a specification for Salsa20 -[here](https://cr.yp.to/snuffle/spec.pdf). This is a great starting point for a -formal verification project, as this gives us a high-level description of -Salsa20's behavior that will guide us in proving the functional correctness of -the `salsa20` crate. When we say that `salsa20` is functionally correct, we -really mean "proven correct with respect to the Salsa20 specification". - -The first step in our project would be to port the Salsa20 spec to Cryptol -code, as we will need to use this code when writing SAW proofs. The process of -transcribing an English-language specification to executable Cryptol code is -interesting in its own right, but it is not the primary focus of this tutorial. -As such, we will save you some time by providing a pre-baked Cryptol -implementation of the Salsa20 spec -[here](https://github.com/GaloisInc/saw-script/blob/master/doc/rust-tutorial/code/salsa20/Salsa20.cry). -(This implementation is -[adapted](https://github.com/GaloisInc/cryptol-specs/blob/1366ccf71db9dca58b16ff04ca7d960a4fe20e34/Primitive/Symmetric/Cipher/Stream/Salsa20.cry) -from the [`cryptol-specs`](https://github.com/GaloisInc/cryptol-specs) repo.) - -Writing the Cryptol version of the spec is only half the battle, however. We -still have to prove that the Rust implementation in the `salsa20` crate adheres -to the behavior prescribed by the spec, which is where SAW enters the picture. -As we will see shortly, the code in `salsa20` is not a direct port of the -pseudocode shown in the Salsa20 spec, as it is somewhat more low-level. SAW's -role is to provide us assurance that the behavior of the low-level Rust code -and the high-level Cryptol code coincide. - -## A note about cryptographic security - -As noted in the previous section, our goal is to prove that the behavior of -`salsa20` functions is functionally correct. This property should _not_ be -confused with cryptographic security. While functional correctness is an -important aspect of cryptographic security, a full cryptographic security audit -would encompass additional properties such as whether the code runs in constant -time on modern CPUs. As such, the SAW proofs we will write would not constitute -a full security audit (and indeed, the [`salsa20` -`README`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/README.md) -states that the crate has never received such an audit). - -## An overview of the `salsa20` code - -Before diving into proofs, it will be helpful to have a basic understanding of -the functions and data types used in the `salsa20` crate. Most of the -interesting code lives in -[`src/core.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/core.rs). -At the top of this file, we have the `Core` struct: - -``` rust -$include 8-14 code/salsa20/src/core.rs -``` - -Let's walk through this: - -* The `state` field is an array that is `STATE_WORDS` elements long, where - `STATE_WORDS` is a commonly used alias for `16`: - - ``` rust - $include 88-89 code/salsa20/src/lib.rs - ``` - -* The `rounds` field is of type `PhantomData`. If you haven't seen it - before, - [`PhantomData`](https://doc.rust-lang.org/std/marker/struct.PhantomData.html) - is a special type that tells the Rust compiler to pretend as though the - struct is storing something of type `R`, even though a `PhantomData` value - will not take up any space at runtime. - -The reason that `Core` needs a `PhantomData` field is because `R` -implements the `Rounds` trait: - -``` rust -$include 1-5 code/salsa20/src/rounds.rs -``` - -A core operation in Salsa20 is hashing its input through a series of -_rounds_. The `COUNT` constant indicates how many rounds should be performed. -The Salsa20 spec assumes 20 rounds: - -``` rust -$include 23-29 code/salsa20/src/rounds.rs -``` - -However, there are also reduced-round variants that perform 8 and 12 rounds, -respectively: - -``` rust -$include 7-21 code/salsa20/src/rounds.rs -``` - -Each number of rounds has a corresponding struct whose names begins with the -letter `R`. For instance, a `Core` value represents a 20-round Salsa20 -cipher. Here is the typical use case for a `Core` value: - -* A `Core` value is created using the `new` function: - - ``` rust - $include 18-18 code/salsa20/src/core.rs - ``` - - We'll omit the implementation for now. This function takes a secret `Key` - value and a unique `Nonce` value and uses them to produce the initial `state` - in the `Core` value. - -* After creating a `Core` value, the `counter_setup` and `rounds` functions are - used to produce the Salsa20 keystream: - - ``` rust - $include 83-83 code/salsa20/src/core.rs - ``` - ``` rust - $include 90-90 code/salsa20/src/core.rs - ``` - - We'll have more to say about these functions later. - -* The _pièce de résistance_ is the `apply_keystream` function. This takes a - newly created `Core` value, produces its keystream, and applies it to a - message to produce the `output`: - - ``` rust - $include 68-68 code/salsa20/src/core.rs - ``` - -Our ultimate goal is to verify the `apply_keystream` function, which is the -Rust equivalent of the Salsa20 encryption function described in the spec. - -## Building `salsa20` - -The next step is to build the `salsa20` crate. Unlike the examples we have seen -up to this point, which have been self-contained Rust files, `salsa20` is a -`cargo`-based project. As such, we will need to build it using `cargo -saw-build`, an extension to the `cargo` package manager that integrates with -`mir-json`. Before you proceed, make sure that you have defined the -`SAW_RUST_LIBRARY_PATH` environment variable as described in [this -section](#the-saw_rust_library_path-environment-variable). - -To build the `salsa20` crate, perform the following steps: - -``` -$ cd code/salsa20/ -$ cargo saw-build -``` - -Near the end of the build output, you will see a line that looks like this: - -``` -linking 9 mir files into <...>/saw-script/doc/rust-tutorial/code/salsa20/target/x86_64-unknown-linux-gnu/debug/deps/salsa20-dd0d90f28492b9cb.linked-mir.json -``` - -This is the location of the MIR JSON file that we will need to provide to SAW. -(When we tried it, the hash in the file name was `dd0d90f28492b9cb`, but it -could very well be different on your machine.) Due to how `cargo` works, the -location of this file is in a rather verbose, hard-to-remember location. For -this reason, we recommend copying this file to a different path, e.g., - -``` -$ cp <...>/saw-script/doc/rust-tutorial/code/salsa20/target/x86_64-unknown-linux-gnu/debug/deps/salsa20-dd0d90f28492b9cb.linked-mir.json code/salsa20/salsa20.linked-mir.json -``` - -As a safeguard, we have also checked in a compressed version of this MIR JSON -file as -[`code/salsa20/salsa/salsa20.linked-mir.json.tar.gz`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/salsa20.linked-mir.json.tar.gz). -In a pinch, you can extract this archive to obtain a copy of the MIR JSON file, -which is approximately 4.6 megabytes when uncompressed. - -## Getting started with SAW - -Now that we've built the `salsa20` crate, it's time to start writing some -proofs! Let's start a new `code/salsa20/salsa20.saw` file as fill it in with -the usual preamble: - -``` -$include 1-3 code/salsa20/salsa20-reference.saw -``` - -We are also going to need to make use of the Cryptol implementation of the -Salsa20 spec, which is defined in -[`code/salsa20/Salsa20.cry`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/Salsa20.cry). -SAW allows you to import standalone Cryptol `.cry` files by using the `import` -command: - -``` -$include 4-4 code/salsa20/salsa20-reference.saw -``` - -As an aside, note that we have also checked in a -[`code/salsa20/salsa20-reference.saw`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/salsa20-reference.saw), -which contains a complete SAW file. We encourage you _not_ to look at this file -for now, since following along with the tutorial is meant to illustrate the -"a-ha moments" that one would have in the process of writing the proofs. In you -become stuck while following along and absolutely need a hint, however, then -this file can help you become unstuck. - -## Verifying our first `salsa20` function - -Now it's time to start verifying some `salsa20` code. But where do we start? -It's tempting to start with `apply_keystream`, which is our end goal. This is -likely going to be counter-productive, however, as `apply_keystream` is a -large function with several moving parts. Throwing SAW at it immediately is -likely to cause it to spin forever without making any discernible progress. - -For this reason, we will instead take the approach of working from the -bottom-up. That is, we will first verify the functions that `apply_keystream` -transitively invokes, and then leverage compositional verification to verify a -proof of `apply_keystream` using overrides. This approach naturally breaks up -the problem into smaller pieces that are easier to understand in isolation. - -If we look at the implementation of `apply_keystream`, we see that it invokes -the `round` function, which in turn invokes the `quarter_round` function: - -``` rust -$include 122-142 code/salsa20/src/core.rs -``` - -`quarter_round` is built on top of the standard library functions -[`wrapping_add`](https://doc.rust-lang.org/std/primitive.usize.html#method.wrapping_add) -and -[`rotate_left`](https://doc.rust-lang.org/std/primitive.usize.html#method.rotate_left), -so we have finally reached the bottom of the call stack. This makes -`quarter_round` a good choice for the first function to verify. - -The implementation of the Rust `quarter_round` function is quite similar to the -Cryptol `quarterround` function in `Salsa20.cry`: - -``` -$include 10-16 code/salsa20/Salsa20.cry -``` - -The Cryptol `quarterround` function doesn't have anything like the `state` -argument in the Rust `quarter_round` function, but let's not fret about that -too much yet. Our SAW spec is going to involve `quarterround` _somehow_—we just -have to figure out how to make it fit. - -Let's start filling out the SAW spec for `quarter_round`: - -``` -$include 6-6 code/salsa20/salsa20-quarter_round-fail1.saw -``` - -We are going to need some fresh variables for the `a`, `b`, `c`, and `d` -arguments: - -``` -$include 7-10 code/salsa20/salsa20-quarter_round-fail1.saw -``` - -We will also need to allocate a reference for the `state` argument. The -reference's underlying type is `STATE_WORDS` (`16`) elements long: - -``` -$include 11-13 code/salsa20/salsa20-quarter_round-fail1.saw -``` - -Finally, we will need to pass these arguments to the function: - -``` -$include 15-21 code/salsa20/salsa20-quarter_round-fail1.saw -``` - -With that, we have a spec for `quarter_round`! It's not very interesting just -yet, as we don't specify what `state_ref` should point to after the function -has returned. But that's fine for now. When developing a SAW proof, it can be -helpful to first write out the "skeleton" of a function spec that only contains -the call to `mir_execute_func`, without any additional preconditions or -postconditions. We can add those later after ensuring that the skeleton works -as expected. - -Let's check our progress thus far by running this through SAW: - -``` -$ saw salsa20.saw -... -[23:16:05.080] Type errors: - salsa20.saw:12:39-12:68: Unbound variable: "STATE_WORDS" (salsa20.saw:12:49-12:60) -Note that some built-in commands are available only after running -either `enable_deprecated` or `enable_experimental`. - - salsa20/salsa20.saw:11:31-11:60: Unbound variable: "STATE_WORDS" (salsa20.saw:11:41-11:52) -Note that some built-in commands are available only after running -either `enable_deprecated` or `enable_experimental`. -``` - -We've already run into some type errors. Not too surprising, considering this -was our first attempt. The error message contains that `STATE_WORDS` is -unbound. This makes sense if you think about it, as `STATE_WORDS` is defined in -the Rust code, but not in the SAW file itself. Let's fix that by adding this -line to `salsa20.saw`: - -``` -$include 6-6 code/salsa20/salsa20-quarter_round-fail2.saw -``` - -That change fixes the type errors in `quarter_round_spec`. Hooray! Let's press -on. - -Next, we need to add a call to `mir_verify`. In order to do this, we need to -know what the full identifier for the `quarter_round` function is. Because it -is defined in the `salsa20` crate and in the `core.rs` file, so we would expect -the identifier to be named `salsa20::core::quarter_round`: - -``` -$include 25-26 code/salsa20/salsa20-quarter_round-fail2.saw -``` - -However, SAW disagrees: - -``` -[00:22:56.970] Stack trace: -"mir_verify" (salsa20.saw:26:3-26:13) -Couldn't find MIR function named: salsa20::core::quarter_round -``` - -Ugh. This is a consequence of how `mir-json` disambiguates identifiers. Because -there is a separate `core` crate in the Rust standard libraries, `mir-json` -uses "`core#1`", a distinct name, to refer to the `core.rs` file. You can see -this for yourself by digging around in the MIR JSON file, if you'd like. (In a -future version of SAW, one will be able to [look this name -up](https://github.com/GaloisInc/saw-script/issues/1980) more easily.) - -Once we change the identifier: - -``` -$include 25-26 code/salsa20/salsa20-quarter_round-fail3.saw -``` - -We can run SAW once more. This time, SAW complains about a different thing: - -``` -[01:00:19.697] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[01:00:19.714] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[01:00:19.717] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[01:00:19.739] Subgoal failed: salsa20/10e438b3::core#1[0]::quarter_round[0] index out of bounds: the length is move _10 but the index is _9 -[01:00:19.739] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 53} -[01:00:19.739] ----------Counterexample---------- -[01:00:19.739] a: 2147483648 -``` - -Here, SAW complains that we have an `index out of bounds`. Recall that we are -indexing into the `state` array, which is of length 16, using the -`a`/`b`/`c`/`d` arguments. Each of these arguments are of type `usize`, and -because we are declaring these to be symbolic, it is quite possible for each -argument to be 16 or greater, which would cause the index into `state` to be -out of bounds. - -In practice, however, the only values of `a`/`b`/`c`/`d` that we will use are -less than 16. We can express this fact as a precondition: - -``` -$include 13-16 code/salsa20/salsa20-quarter_round-fail4.saw -``` - -That is enough to finally get SAW to verify this very stripped-down version of -`quarter_round_spec`. Some good progress! But we aren't done yet, as we don't -yet say what happens to the value that `state` points to after the function -returns. This will be a requirement if we want to use `quarter_round_spec` in -compositional verification (and we do want this), so we should address this -shortly. - -Recall that unlike the Rust `quarter_round` function, the Cryptol -`quarterround` function doesn't have a `state` argument. This is because the -Rust function does slightly more than what the Cryptol function does. The Rust -function will look up elements of the `state` array, use them to perform the -computations that the Cryptol function does, and then insert the new values -back into the `state` array. To put it another way: the Rust function can be -thought of as a wrapper around the Cryptol function that also performs an -in-place bulk update of the `state` array. - -In Cryptol, one can look up elements of an array using the `(@@)` function, -and one can perform in-place array updates using the `updates` function. -This translates into a postcondition that looks like this: - -``` -$include 28-30 code/salsa20/salsa20-quarter_round-fail4.saw -``` - -What does SAW think of this? Someone surprisingly, SAW finds a counterexample: - -``` -[01:43:30.065] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[01:43:30.078] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[01:43:30.084] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[01:43:30.801] Subgoal failed: salsa20/10e438b3::core#1[0]::quarter_round[0] Literal equality postcondition - -[01:43:30.801] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 1999} -[01:43:30.802] ----------Counterexample---------- -[01:43:30.802] a: 13 -[01:43:30.802] b: 3 -[01:43:30.802] c: 0 -[01:43:30.802] d: 0 -[01:43:30.802] state: [3788509705, 0, 0, 3223325776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1074561051, 0, 0] -``` - -Note that in this counterexample, the values of `c` and `d` are the same. In -the Rust version of the function, each element in `state` is updated -sequentially, so if two of the array indices are the same, then the value that -was updated with the first index will later be overwritten by the value at the -later index. In the Cryptol version of the function, however, all of the -positions in the array are updated simultaneously. This implicitly assumes that -all of the array indices are disjoint from each other, an assumption that we -are not encoding into `quarter_round_spec`'s preconditions. - -At this point, it can be helpful to observe _how_ the `quarter_round` function -is used in practice. The call sites are found in the `rounds` function: - -``` rust -$include 92-102 code/salsa20/src/core.rs -``` - -Here, we can see that the values of `a`/`b`/`c`/`d` will only ever be chosen -from a set of eight possible options. We can take advantage of this fact to -constrain the possible set of values for `a`/`b`/`c`/`d`. The latest iteration -of the `quarter_round_spec` is now: - -``` -$include 10-38 code/salsa20/salsa20-reference.saw -``` - -Note that: - -* The `indices` value is constrained (via a precondition) to be one of the set - of values that is chosen in the `rounds` function. (Note that `\/` is the - logical-or function in Cryptol.) Each of these are concrete values that are - less than `STATE_WORDS` (`16`), so we no longer need a precondition stating - `a < `STATE_WORDS /\ ...`. - -* Because we now reference `indices` in the preconditions, we have moved its - definition up. (Previously, it was defined in the postconditions section.) - -With this in place, will SAW verify `quarter_round_spec` now? - -``` -[02:14:02.037] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[02:14:02.051] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[02:14:02.057] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... -[02:14:18.616] Proof succeeded! salsa20/10e438b3::core#1[0]::quarter_round[0] -``` - -At long last, it succeeds. Hooray! SAW does have to think for a while, however, -as this proof takes about 17 seconds to complete. It would be unfortunate to -have to wait 17 seconds on every subsequent invocation of SAW, and since we -still have other functions to verify, this is a very real possibility. For this -reason, it can be helpful to temporarily turn this use of `mir_verify` into a -`mir_unsafe_assume_spec`: - -``` -$include 40-44 code/salsa20/salsa20-reference.saw -``` - -Once we are done with the entire proof, we can come back and remove this use of -`mir_unsafe_assume_spec`, as we're only using it as a time-saving measure. - -## Verifying the `rounds` function - -Now that we've warmed up, let's try verifying the `rounds` function, which is -where `quarter_round` is invoked. Here is the full definition of `rounds`: - -``` rust -$include 90-108 code/salsa20/src/core.rs -``` - -First, `rounds` performs `COUNT` rounds on the `state` argument. After this, it -takes each element of `self.state` and adds it to the corresponding element in -`state`. - -Linking back at the Salsa20 spec, we can see that the `rounds` function is -_almost_ an implementation of the Salsa20(x) hash function. The only notable -difference is that while the Salsa20(x) hash function converts the results to -little-endian form, the `rounds` function does not. `Salsa20.cry` implements -this part of the spec here: - -``` -$include 139-147 code/salsa20/Salsa20.cry -``` - -Where `Salsa20` is the hash function, and `Salsa20_rounds` is the part of the -hash function that excludes the little-endian conversions. In other words, -`Salsa20_rounds` precisely captures the behavior of the Rust `rounds` function. - -One aspect of the `rounds` function that will make verifying it slightly -different from verifying `quarter_rounds` is that `rounds` is defined in an -`impl` block for the `Core` struct. This means that the `&mut self` argument in -`rounds` has the type `&mut Core`. As such, we will have to look up the -`Core` ADT in SAW using `mir_find_adt`. - -This raises another question, however: when looking up `Core`, what type -should we use to instantiate `R`? As noted above, our choices are `R8`, `R12`, -and `R20`, depending on how many rounds you want. For now, we'll simply -hard-code it so that `R` is instantiated to be `R8`, but we will generalize -this a bit later. - -Alright, enough chatter—time to start writing a proof. First, let's look up the -`R8` ADT. This is defined in the `salsa20` crate in the `rounds.rs` file, so -its identifier becomes `salsa20::rounds::R8`: - -``` -$include 46-46 code/salsa20/salsa20-rounds-take-1.saw -``` - -Next, we need to look up the `PhantomData` ADT, which is used in the -`rounds` field of the `Core` struct. This is defined in `core::marker`: - -``` -$include 47-47 code/salsa20/salsa20-rounds-take-1.saw -``` - -Finally, we must look up `Core` itself. Like `quarter_round`, the `Core` -struct` is defined in `salsa20::core#1`: - -``` -$include 48-48 code/salsa20/salsa20-rounds-take-1.saw -``` - -Now that we have the necessary prerequisites, let's write a spec for the -`rounds` function. First, we need to allocate a reference for the `self` -argument: - -``` -$include 50-51 code/salsa20/salsa20-rounds-take-1.saw -``` - -Next, we need to create symbolic values for the fields of the `Core` struct, -which `self_ref` will point to. The `self.state` field will be a fresh array, -and the `self.rounds` field will be a simple, empty struct value: - -``` -$include 52-53 code/salsa20/salsa20-rounds-take-1.saw -``` - -Finally, putting all of the `self` values together: - -``` -$include 54-55 code/salsa20/salsa20-rounds-take-1.saw -``` - -Next, we need a `state` argument (not to be confused with the `self.state` -field in `Core`). This is handled much the same as it was in -`quarter_round_spec`: - -``` -$include 57-59 code/salsa20/salsa20-rounds-take-1.saw -``` - -Lastly, we cap it off with a call to `mir_execute_func`: - -``` -$include 61-62 code/salsa20/salsa20-rounds-take-1.saw -``` - -(Again, we're missing some postconditions describing what `self_ref` and -`state_ref` point to after the function returns, but we'll return to that in a -bit.) - -If we run SAW at this point, we see that everything in `rounds_spec` -typechecks, so we're off to a good start. Let's keep going and add a -`mir_verify` call. - -Here, we are faced with an interesting question: what is the identifier for -`rounds::`? The `rounds` function is defined using generics, so we can't -verify it directly—we must instead verify a particular instantiation of -`rounds`. At present, there isn't a good way to look up what the identifiers -for instantiations of generic functions are (there [will be in the -future](https://github.com/GaloisInc/saw-script/issues/1980)), but it turns out -that the identifier for `rounds::` is this: - -``` -$include 64-65 code/salsa20/salsa20-rounds-take-1.saw -``` - -Note that we are using `quarter_round_ov` as a compositional override. Once -again, SAW is happy with our work thus far: - -``` -[03:12:35.990] Proof succeeded! salsa20/10e438b3::core#1[0]::{impl#0}[0]::rounds[0]::_inst6e4a2d7250998ef7[0] -``` - -Nice. Now let's go back and fill in the missing postconditions in -`rounds_spec`. In particular, we must declare what happens to both `self_ref` -and `state_ref`. A closer examination of the code in the Rust `rounds` function -reveals that the `self` argument is never modified at all, so that part is -easy: - -``` -$include 63-63 code/salsa20/salsa20-rounds-take-2.saw -``` - -The `state` argument, on the other hand, is modified in-place. This time, our -job is made easier by the fact that `Salsa20_rounds` implements _exactly_ what -we need. Because we are instantiating `rounds` at type `R8`, we must explicitly -state that we are using 8 rounds: - -``` -$include 64-64 code/salsa20/salsa20-rounds-take-2.saw -``` - -Once again, SAW is happy with our work. We're on a roll! - -Now let's address the fact that we are hard-coding everything to `R8`, which is -somewhat uncomfortable. We can make things better by allowing the user to -specify the number of rounds. The first thing that we will need to change is -the `r_adt` definition, which is response for looking up `R8`. We want to turn -this into a function that, depending on the user input, will look up `R8`, -`R12`, or `R20`: - -``` -$include 46-46 code/salsa20/salsa20-rounds-take-3.saw -``` - -Where `str_concat` is a SAW function for concatenating strings together: - -``` -sawscript> :type str_concat -String -> String -> String -``` - -We also want to parameterize `phantom_data_adt` and `core_adt`: - -``` -$include 47-48 code/salsa20/salsa20-rounds-take-3.saw -``` - -Next, we need to parameterize `rounds_spec` by the number of rounds. This will -require changes in both the preconditions and postconditions. On the -preconditions side, we must pass the number of rounds to the relevant -functions: - -``` -$include 50-56 code/salsa20/salsa20-rounds-take-3.saw -``` - -And on the postconditions side, we must pass the number of rounds to the -Cryptol `Salsa20_rounds` function: - -``` -$include 66-67 code/salsa20/salsa20-rounds-take-3.saw -``` - -Finally, we must adjust the call to `rounds_spec` in the context of -`mir_verify` so that we pick `8` as the number of rounds: - -``` -$include 69-70 code/salsa20/salsa20-rounds-take-3.saw -``` - -SAW is happy with this generalization. To demonstrate that we have generalized -things correctly, we can also verify the same function at `R20` instead of -`R8`: - -``` -$include 71-72 code/salsa20/salsa20-rounds-take-3.saw -``` - -The only things that we had to change were the identifier and the argument to -`rounds_spec`. Not bad! - -## Verifying the `counter_setup` function - -We're very nearly at the point of being able to verify `apply_keystream`. -Before we do, however, there is one more function that `apply_keystream` calls, -which we ought to verify first: `counter_setup`. Thankfully, the implementation -of `counter_setup` is short and sweet: - -``` rust -$include 83-86 code/salsa20/src/core.rs -``` - -This updates the elements of the `state` array at indices `8` and `9` with the -lower 32 bits and the upper 32 bits of the `counter` argument, respecitvely. -At a first glance, there doesn't appear to be any function in `Salsa20.cry` -that directly corresponds to what `counter_setup` does. This is a bit of a -head-scratcher, but the answer to this mystery will become more apparent as we -get further along in the proof. - -For now, we should take matters into our own hands and write our own Cryptol -spec for `counter_setup`. To do this, we will create a new Cryptol file named -`Salsa20Extras.cry`, which imports from `Salsa20.cry`: - -``` -$include 1-3 code/salsa20/Salsa20Extras.cry -``` - -The Cryptol implementation of `counter_setup` will need arrays of length -`STATE_WORDS`, so we shall define `STATE_WORDS` first: - -``` -$include 5-5 code/salsa20/Salsa20Extras.cry -``` - -Note that we preceded this definition with the `type` keyword. In Cryptol, -sequence lengths are encoded at the type level, so if we want to use -`STATE_WORDS` at the type level, we must declare it as a `type`. - -Finally, we can write a Cryptol version of `counter_setup` using our old friend -`updates` to perform a bulk sequence update: - -``` -$include 8-10 code/salsa20/Salsa20Extras.cry -``` - -Note that `counter` is a 64-bit word, but the elements of the `state` sequence -are 32-bit words. As a result, we have to explicitly truncate `counter` and -`counter >> 32` to 32-bit words by using the `drop` function, which drops the -first 32 bits from each word. - -Returning to `salsa20.saw`, we must now make use of our new Cryptol file by -`import`ing it at the top: - -``` -$include 5-5 code/salsa20/salsa20-reference.saw -``` - -With the `counter_setup` Cryptol implementation in scope, we can now write -a spec for the Rust `counter_setup` function. There's not too much to remark -on here, as the spec proves relatively straightforward to write: - -``` -$include 74-90 code/salsa20/salsa20-reference.saw -``` - -We can now verify `counter_setup` against `counter_setup_spec` at lengths `8` -and `20`: - -``` -$include 92-95 code/salsa20/salsa20-reference.saw -``` - -That wasn't so bad. It's a bit unsatisfying that we had to resort to writing a -Cryptol function not found in `Salsa20.cry`, but go along with this for now—it -will become apparent later why this needed to be done. - -## Verifying the `apply_keystream` function (first attempt) - -It's time. Now that we've verified `rounds` and `counter_setup`, it's time to -tackle the topmost function in the call stack: `apply_keystream`: - -``` rust -$include 68-80 code/salsa20/src/core.rs -``` - -There aren't _that_ many lines of code in this function, but there is still -quite a bit going on. Let's walk through `apply_keystream` in more detail: - -1. The `output` argument represents the message to encrypt (or decrypt). - `output` is a slice of bytes, so in principle, `output` can have an arbitrary - length. That being said, the first line of `apply_keystream`'s implementation - checks that `output`'s length is equal to `BLOCK_SIZE`: - - ``` rust - $include 69-69 code/salsa20/src/core.rs - ``` - - Where `BLOCK_SIZE` is defined here: - - ``` rust - $include 82-83 code/salsa20/src/lib.rs - ``` - - So in practice, `output` must have exactly 64 elements. - -2. Next, `apply_keystream` invokes the `counter_setup` and `rounds` functions - to set up the keystream (the local `state` variable). - -3. Finally, `apply_keystream` combines the keystream with `output`. It does - so by chunking `output` into a sequence of 4 bytes, and then it XOR's the - value of each byte in-place with the corresponding byte from the keystream. - This performs little-endian conversions as necessary. - -The fact that we are XOR'ing bytes strongly suggests that this is an -implementation of the Salsa20 encryption function from the spec. There is an -important difference between how the Salsa20 spec defines the encryption -function versus how `apply_keystream` defines it, however. In the Salsa20 spec, -encryption is a function of a key, nonce, and a message. `apply_keystream`, on -the other hand, is a function of `self`'s internal state, a counter, and a -message. The two aren't _quite_ the same, which is makes it somewhat tricky to -describe one in terms of the other. - -`Salsa20.cry` defines a straightforward Cryptol port of the Salsa20 encryption -function from the spec, named `Salsa20_encrypt`. Because it takes a key and a -nonce as an argument, it's not immediately clear how we'd tie this back to -`apply_keystream`. But no matter: we can do what we did before and define our -own Cryptol version of `apply_keystream` in `Salsa20Extras.cry`: - -``` -$include 12-17 code/salsa20/Salsa20Extras.cry -``` - -This implementation builds on top of the Cryptol `counter_setup` and -`Salsa20_rounds` functions, which we used as the reference implementations for -the Rust `counter_setup` and `rounds` functions, respectively. We also make -sure to define a `BLOCK_SIZE` type alias at the top of the file: - -``` -$include 6-6 code/salsa20/Salsa20Extras.cry -``` - -Now let's write a SAW spec for `apply_keystream`. Once again, we will need to -reference `BLOCK_SIZE` when talking about the `output`-related parts of the -spec, so make sure to define `BLOCK_SIZE` at the top of the `.saw` file: - -``` -$include 8-8 code/salsa20/salsa20-reference.saw -``` - -First, we need to declare all of our arguments, which proceeds as you would -expect: - -``` -$include 120-136 code/salsa20/salsa20-reference.saw -``` - -What about the postconditions? We have two mutable references to contend with: -`self_ref` and `output_ref`. The postcondition for `self_ref` is fairly -straightforward: the only time it is ever modified is when `counter_setup` is -called. This means that after the `apply_keystream` function has returned, -`self_ref` will point to the results of calling the `counter_setup` Cryptol -function: - -``` -$include 138-140 code/salsa20/salsa20-reference.saw -``` - -`output_ref` is where the interesting work happenings. After the Rust -`apply_keystream` function has returned, it will point to the results of -calling the Cryptol `apply_keystream` function that we just defined: - -``` -$include 141-142 code/salsa20/salsa20-reference.saw -``` - -Finally, we can put this all together and verify `apply_keystream` against -`apply_keystream_spec` at lengths `8` and `20`: - -``` -$include 144-148 code/salsa20/salsa20-reference.saw -``` - -SAW will successfully verify these. We've achieved victory... or have we? -Recall that we had to tailor the Cryptol `apply_keystream` function to -specifically match the behavior of the corresponding Rust code. This makes the -proof somewhat underwhelming, since the low-level implementation is nearly -identical to the high-level spec. - -A more impressive proof would require linking `apply_keystream` to a Cryptol -function in the `Salsa20.cry` file, which was developed independently of the -Rust code. As we mentioned before, however, doing so will force us to reconcile -the differences in the sorts of arguments that each function takes, as -`apply_keystream` doesn't take a key or nonce argument. Time to think for a -bit. - -## Verifying the `new_raw` function - -At this point, we should ask ourselves: _why_ doesn't `apply_keystream` take a -key or nonce argument? The reason lies in the fact that the `salsa20` crate -implements Salsa20 in a stateful way. Specifically, the `Core` struct stores -internal state that is used to compute the keystream to apply when hashing. In -order to use this internal state, however, we must first initialize it. The -`new` function that is responsible for this initialization: - -``` rust -$include 17-20 code/salsa20/src/core.rs -``` - -Sure enough, this function takes a key and a nonce as an argument! This is a -critical point that we overlooked. When using the `salsa20` crate, you wouldn't -use the `apply_keystream` function in isolation. Instead, you would create an -initial `Core` value using `new`, and _then_ you would invoke -`apply_keystream`. The Salsa20 spec effectively combines both of these -operations in is encryption function, whereas the `salsa20` splits these two -operations into separate functions altogether. - -Strictly speaking, we don't need to verify `new` in order to verify -`apply_keystream`, as the latter never invokes the former. Still, it will be a -useful exercise to verify `new`, as the insights we gain when doing so will -help us write a better version of `apply_keystream_spec`. - -All that being said, we probably to verify `new_raw` (a lower-level helper -function) rather than `new` itself. This is because the definitions of `Key` -and `Nonce` are somewhat involved. For instance, `Key` is defined as: - -``` rust -$include 27-27 code/salsa20/src/salsa.rs -``` - -[`GenericArray`](https://docs.rs/generic-array/latest/generic_array/struct.GenericArray.html) -is a somewhat complicated abstraction. Luckily, we don't really _need_ to deal -with it, since `new_raw` deals with simple array references rather than -`GenericArray`s: - -``` rust -$include 22-23 code/salsa20/src/core.rs -``` - -The full implementation of `new_raw` is rather long, so we won't inline the -whole thing here. At a high level, it initializes the `state` array of a `Core` -value by populating each element of the array with various things. Some -elements of the array are populated with `key`, some parts are populated with -`iv` (i.e., the nonce), and other parts are populated with an array named -`CONSTANTS`: - -``` rust -$include 91-92 code/salsa20/src/lib.rs -``` - -The comment about `"expand 32-byte k"` is a strong hint that `new_raw` is -implementing a portion of the Salsa20 expansion function from the spec. (No -really, the spec literally says to use the exact string `"expand 32-byte -k"`—look it up!) The `Salsa20.cry` Cryptol file has an implementation of this -portion of the expansion function, which is named `Salsa20_init`: - -``` -$include 182-189 code/salsa20/Salsa20.cry -``` - -Note that we were careful to say a _portion_ of the Salsa20 expansion function. -There is also a Cryptol implementation of the full expansion function, named -`Salsa20_expansion`: - -``` -$include 179-180 code/salsa20/Salsa20.cry -``` - -This calls `Salsa20_init` followed by `Salsa20`, the latter of which performs -hashing. Importantly, `new_raw` does _not_ do any hashing on its own, just -initialization. For this reason, we want to use `Salsa20_init` as the reference -implementation of `new_raw`, not `Salsa20_expansion`. - -Alright, time to write a SAW spec. The first part of the spec is straightforward: - -``` -$include 97-106 code/salsa20/salsa20-new_raw-fail1.saw -``` - -As is usually the case, the postconditions are the tricky part. We know that -the behavior of `new_raw` will roughly coincide with the `Salsa20_init` -function, so let's try that first: - -``` -$include 108-112 code/salsa20/salsa20-new_raw-fail1.saw -``` - -If we attempt to verify this using `mir_verify`: - -``` -$include 115-118 code/salsa20/salsa20-new_raw-fail1.saw -``` - -SAW complains thusly: - -``` -Cryptol error: -[error] at salsa20.saw:109:45--109:54: - Type mismatch: - Expected type: 16 - Inferred type: 8 - Context: [ERROR] _ - When checking type of 2nd tuple field -``` - -Here, the 2nd tuple field is the `nonce_arr` in `Salsa20_init(key_arr, -nonce_arr)`. And sure enough, `Salsa20_init` expects the 2nd tuple field to be -a sequence of 16 elements, but `nonce_arr` only has 8 elements. Where do we get -the remaining 8 elements from? - -The answer to this question can be found by looking at the implementation of -`new_raw` more closely. Let's start at this code: - -``` rust -$include 35-36 code/salsa20/src/core.rs -``` - -This will chunk up `iv` (the nonce) into two 4-byte chunks and copies them over -to the elements of `state` array at indices `6` and `7`. This is immediately -followed by two updates at indices `8` and `9`, which are updated to be `0`: - -``` rust -$include 39-40 code/salsa20/src/core.rs -``` - -If you take the two 4-bytes chunks of `iv` and put two 4-byte `0` values after -them, then you would have a total of 16 bytes. This suggests that the nonce -value that `Salsa20_init` expects is actually this: - -``` -nonce_arr # zero : [16][8] -``` - -Where `zero : [8][8]` is a Cryptol expression that returns all zeroes, and -`(#)` is the Cryptol operator for concatenating two sequences together. Let's -update `new_raw_spec` to reflect this: - -``` -$include 109-109 code/salsa20/salsa20-new_raw-fail2.saw -``` - -This is closer to what we want, but not quite. SAW still complains: - -``` -could not match specified value with actual value: - ... - type of actual value: [u32; 16] - type of specified value: [u8; 64] -``` - -This is because `Salsa20_init` returns something of type `[64][8]`, which -corresponds to the Rust type `[u8; 64]`. `self.state`, on the other hand, is of -type `[u32; 16]`. These types are very close, as they both contain the same -number of bytes, but they are chunked up differently. Recall the code that -copies the nonce value over to `self.state`: - -``` rust -$include 35-36 code/salsa20/src/core.rs -``` - -In order to resolve the type differences between `iv` and `state`, this code -needed to explicitly convert `iv` to little-endian form using the -[`u32::from_le_bytes`](https://doc.rust-lang.org/std/primitive.u32.html#method.from_le_bytes) -function. There is a similar Cryptol function in `Salsa20.cry` named -`littleendian_state`: - -``` -$include 131-132 code/salsa20/Salsa20.cry -``` - -Note that `[64][8]` is the Cryptol equivalent of `[u8; 64]`, and `[16][32]` is -the Cryptol equivalent of `[u32; 16]`. As such, this is exactly the function -that we need to resolve the differences in types: - -``` -$include 109-109 code/salsa20/salsa20-reference.saw -``` - -With that change, SAW is finally happy with `new_raw_spec` and successfully -verifies it. - -There is an interesting connection between the `new_raw` and `counter_setup` -functions. Both functions perform in-place updates on `state` at indices `8` -and `9`. Whereas `new_raw` always sets these elements of `state` to `0`, -`counter_setup` will set them to the bits of the `counter` argument (after -converting `counter` to little-endian form). This means that if you invoke -`counter_setup` right after `new_raw`, then `counter_setup` would overwrite the -`0` values with the `counter` argument. In order words, it would be tantamount -to initializing `state` like so: - -``` -littleendian_state (Salsa20_init(key, nonce # littleendian_inverse counter)) -``` - -Where `littleendian_inverse` (a sibling of `littleendian_state`) converts a -`[64]` value to a `[8][8]` one. This pattern is a curious one... - -## Verifying the `apply_keystream` function (second attempt) - -Let's now return to the problem of linking `apply_keystream` up to -`Salsa20_encrypt`. In particular, let's take a closer look at the definition of -`Salsa20_encrypt` itself: - -``` -$include 198-201 code/salsa20/Salsa20.cry -``` - -Does anything about this definition strike you as interesting? Take a look at -the `v#(littleendian_inverse i)` part—we _just_ saw a use of -`littleendian_inverse` earlier in our discussion about initializing the -`state`! Moreover, `v` is the nonce argument, so it is becoming clearer that -`Sals20_encrypt` is creating an initial state is much the same way that -`new_raw` is. - -A related question: what is the `i` value? The answer is somewhat technical: -the Salsa20 encryption function is designed to work with messages with -differing numbers of bytes (up to `2^^70` bytes, to be exact). Each 8-byte -chunk in the message will be encrypted with a slightly difference nonce. For -instance, the first 8-byte chunk's nonce will have its lower 32 bits set to -`0`, the second 8-byte chunk's nonce will have its lower 32 bits set to `1`, -and so on. In general, the `i`th 8-byte chunk's nonce will have its lower 32 -bits set to `i`, and this corresponds exactly to the `i` in the expression -`littleendian_inverse i`. - -Note, however, that `apply_keystream` only ever uses a message that consists of -exactly eight 8-byte chunks. This means that `Salsa20_encrypt` will only ever -invoke `Salsa20_expansion` once with a nonce value where the lower 32 bits are -set to `0`. That is, it will perform encryption with an initial state derived -from: - -``` -Salsa20_init(k, v#(littleendian_inverse zero)) -``` - -Which can be further simplified to `Salsa20_init(k, v # zero)`. This is very -nearly what we want, as this gives us the behavior of the Rust `new_raw` -function. There's just one problem though: it doesn't take the behavior of -`counter_setup` into account. How do we go from `zero` to `littleendian_inverse -counter`? - -While `Salsa20_encrypt` doesn't take counters into account at all, it is not -too difficult to generalize `Salsa20_encrypt` in this way. There is a variant -of `Salsa20_encrypt` in the same file named `Salsa20_encrypt_with_offset`, -where the offset argument `o` serves the same role that `counter` does in -`counter_setup`: - -``` -$include 191-196 code/salsa20/Salsa20.cry -``` - -(Observe that `Salsa20_encrypt(count, k, v, m)` is equivalent to -`Salsa20_encrypt_with_offset(count, k, v, 0, m)`.) - -At long last, we have discovered the connection between `apply_keystream` and -the Salsa20 spec. If you assume that you invoke `new_raw` beforehand, then the -behavior of `apply_keystream` corresponds exactly to that of -`Salsa20_encrypt_with_offset`. This insight will inform us how to write an -alternative SAW spec for `apply_keystream`: - -``` -$include 149-160 code/salsa20/salsa20-apply_keystream_alt-fail1.saw -``` - -Observe the following differences between `apply_keystream_alt_spec` and our -earlier `apply_keystream_spec`: - -1. In `apply_keystream_alt_spec`, we declare fresh `key` and `nonce` values, - which weren't present at all in `apply_keystream_spec`. - -2. In `apply_keystream_alt_spec`, we no longer make `self_state` a fresh, - unconstrained value. Instead, we declare that it must be the result of - calling `Salsa20_init` on the `key`, `nonce`, and `counter` values. This - is the part that encodes the assumption that `new_raw` was invoked - beforehand. - -The parts of the spec relating to `output` remain unchanged: - -``` -$include 162-167 code/salsa20/salsa20-apply_keystream_alt-fail1.saw -``` - -The postconditions are slightly different in `apply_keystream_alt_spec`. While -the parts relating to `self_ref` remain unchanged, we now have `output_ref` -point to the results of calling `Salsa20_encrypt_with_offset`: - -``` -$include 169-172 code/salsa20/salsa20-apply_keystream_alt-fail1.saw -``` - -Tying this all together, we call `mir_verify`, making sure to use compositional -overrides involving `counter_setup` and `rounds`: - -``` -$include 175-178 code/salsa20/salsa20-apply_keystream_alt-fail1.saw -``` - -At long last, it is time to run SAW on this. When we do, we see this: - -``` -[15:11:44.576] Checking proof obligations salsa20/10e438b3::core#1[0]::{impl#0}[0]::apply_keystream[0]::_inst6e4a2d7250998ef7[0] ... -``` - -After this, SAW loops forever. Oh no! While somewhat disheartening, this is a -reality of SMT-based verification that we must content with. SMT solvers are -extremely powerful, but their performance can sometimes be unpredictable. The -task of verifying `apply_keystream_alt_spec` is _just_ complicated enough that -Z3 cannot immediately figure out that the proof is valid, so it resorts to much -slower algorithms to solve proof goals. - -We could try waiting for Z3 to complete, but we'd be waiting for a long time. -It's not unheard of for SMT solvers to take many hours on especially hard -problems, but we don't have that many hours to spare. We should try a slightly -different approach instead. - -When confronted with an infinite loop in SAW, there isn't a one-size-fits-all -solution that will cure the problem. Sometimes, it is worth stating your SAW -spec in a slightly different way such that the SMT solver can spot patterns -that it couldn't before. Other times, it can be useful to try and break the -problem up into smaller functions and use compositional verification to handle -the more complicated subfunctions. As we mentioned before, the performance of -SMT solvers in unpredictable, and it's not always obvious what the best -solution is. - -In this example, however, the problem lies with Z3 itself. As it turns out, -Yices (a different SMT solver) _can_ spot the patterns needed to prove -`apply_keystream_alt_spec` immediately. Fortunately, SAW includes support for -both Z3 and Yices. In order to switch from Z3 to Yices, swap out the `z3` proof -script with `yices`: - -``` -$include 175-178 code/salsa20/salsa20-reference.saw -``` - -After doing this, SAW is leverage Yices to solve the proof goals almost -immediately: - -``` -[15:22:00.745] Proof succeeded! salsa20/10e438b3::core#1[0]::{impl#0}[0]::apply_keystream[0]::_instfa33e77d840484a0[0] -``` - -And with that, we're finally done! You've successfully completed a non-trivial -SAW exercise in writing some interesting proofs. Give yourself a well-deserved -pat on the back. - -The process of developing these proofs was bumpy at times, but that is to be -expected. You very rarely get a proof correct on the very first try, and when -SAW doesn't accept your proof, it is important to be able to figure out what -went wrong and how to fix it. This is a skill that takes some time to grow, but -with enough time and experience, you will be able to recognize common pitfalls. -This case study showed off some of these pitfalls, but there are likely others. - -# A final word - -Like everything else in the `saw-script` repo, this tutorial is being -maintained and developed. If you see something in the tutorial that is wrong, -misleading, or confusing, please file an issue about it -[here](https://github.com/GaloisInc/saw-script/issues). diff --git a/doc/rust-tutorial/saw-basics.md b/doc/rust-tutorial/saw-basics.md new file mode 100644 index 0000000000..941aba3912 --- /dev/null +++ b/doc/rust-tutorial/saw-basics.md @@ -0,0 +1,379 @@ +# SAW basics + +## A first SAW example + +We now have the knowledge necessary to compile Rust code in a way that is +suitable for SAW. Let's put our skills to the test and verify something! We will +build on the example from above, which we will put into a file named +`saw-basics.rs`: + +``` rust +$include all code/saw-basics.rs +``` + +Our goal is to verify the correctness of the `id_u8` function. However, it is +meaningless to talk about whether a function is correct without having a +_specification_ for how the function should behave. This is where SAW enters +the picture. SAW provides a scripting language named _SAWScript_ that allows +you to write a precise specification for describing a function's behavior. For +example, here is a specification that captures the intended behavior of +`id_u8`: + +``` +$include 3-7 code/saw-basics.saw +``` + +At a high level, this specification says that `id_u8` is a function that accepts +a single argument of type `u8`, and it returns its argument unchanged. Nothing +too surprising there, but this example illustrates many of the concepts that one +must use when working with SAW. Let's unpack what this is doing, line by line: + +* In SAWScript, specifications are ordinary values that are defined with `let`. + In this example, we are defining a specification named `id_u8_spec`. +* Specifications are defined using "`do`-notation". That is, they are assembled + by writing `do { ; ; ...; ; }`, where each `` is a + statement that declares some property about the function being verified. A + statement can optionally bind a variable that can be passed to later + statements, which is accomplished by writing ` <- `. +* The `x <- mir_fresh_var "x" mir_u8;` line declares that `x` is a fresh + variable of type `u8` (represented by `mir_u8` in SAWScript) that has some + unspecified value. In SAW parlance, we refer to these unspecified values as + _symbolic_ values. SAW uses an SMT solver under the hood to reason about + symbolic values. + + The `"x"` string indicates what name the variable `x` should have when sent + to the underlying SMT solver. This is primarily meant as a debugging aid, and + it is not required that the string match the name of the SAWScript variable. + (For instance, you could just as well have passed `"x_smt"` or something + else.) +* The `mir_execute_func [mir_term x];` line declares that the function should + be invoked with `x` as the argument. For technical reasons, we pass + `mir_term x` to `mir_execute_func` rather than just `x`; we will go over what + `mir_term` does later in the tutorial. +* Finally, the `mir_return (mir_term x);` line declares that the function should + return `x` once it has finished. + +Now that we have a specification in hand, it's time to prove that `id_u8` +actually adheres to the spec. To do so, we need to load the MIR JSON version of +`id_u8` into SAW, which is done with the `mir_load_module` command: + +``` +$include 9-9 code/saw-basics.saw +``` + +This `m` variable contains the definition of `id_u8`, as well as the other code +defined in the program. We can then pass `m` to the `mir_verify` command, which +actually verifies that `id_u8` behaves according to `id_u8_spec`: + +``` +$include 11-11 code/saw-basics.saw +``` + +Here is what is going on in this command: + +* The `m` and `"saw_basics::id_u8"` arguments instruct SAW to verify the + `id_u8` function located in the `saw_basics` crate defined in `m`. Note that + we are using the shorthand identifier notation here, so we are allowed to omit + the disambiguator for the `saw_basics` crate. +* The `[]` argument indicates that we will not provide any function overrides to + use when SAW simulates the `id_u8` function. (We will go over how overrides + work later in the tutorial.) +* The `false` argument indicates that SAW should not use path satisfiability + checking when analyzing the function. Path satisfiability checking is an + advanced SAW feature that we will not be making use of in this tutorial, so we + will always use `false` here. +* The `id_u8_spec` argument indicates that `id_u8` should be checked against the + specification defined by `id_u8_spec`. +* The `z3` argument indicates that SAW should use the Z3 SMT solver to solve + any proof goals that are generated during verification. SAW also supports + other SMT solvers, although we will mostly use Z3 in this tutorial. + +Putting this all together, our complete `saw-basics.saw` file is: + +``` +$include all code/saw-basics.saw +``` + +One minor detail that we left out until just now is that the SAW's interface to +MIR is still experimental, so you must explicitly opt into it with the +`enable_experimental` command. + +Now that everything is in place, we can check this proof like so: + +``` +$ saw saw-basics.saw + + + +[16:14:07.006] Loading file "saw-basics.saw" +[16:14:07.009] Verifying saw_basics/f77ebf43::id_u8[0] ... +[16:14:07.017] Simulating saw_basics/f77ebf43::id_u8[0] ... +[16:14:07.017] Checking proof obligations saw_basics/f77ebf43::id_u8[0] ... +[16:14:07.017] Proof succeeded! saw_basics/f77ebf43::id_u8[0] +``` + +Tada! SAW was successfully able to prove that `id_u8` adheres to its spec. + +## Cryptol + +The spec in the previous section is nice and simple. It's also not very +interesting, as it's fairly obvious at a glance that `id_u8`'s implementation +is correct. Most of the time, we want to verify more complicated functions +where the correspondence between the specification and the implementation is +not always so clear. + +For example, consider this function, which multiplies a number by two: + +``` rust +$include 1-3 code/times-two.rs +``` + +The straightforward way to implement this function would be to return `2 * x`, +but the author of this function _really_ cared about performance. As such, the +author applied a micro-optimization that computes the multiplication with a +single left-shift (`<<`). This is the sort of scenario where we are pretty sure +that the optimized version of the code is equivalent to the original version, +but it would be nice for SAW to check this. + +Let's write a specification for the `times_two` function: + +``` +$include 3-7 code/times-two.saw +``` + +This spec introduces code delimited by double curly braces `{{ ... }}`, which +is a piece of syntax that we haven't seen before. The code in between the curly +braces is written in [Cryptol](http://cryptol.net/documentation.html), a +language designed for writing high-level specifications of various algorithms. +Cryptol supports most arithmetic operations, so `2 * x` works exactly as you +would expect. Also note that the `x` variable was originally bound in the +SAWScript language, but it is possible to embed `x` into the Cryptol language +by referencing `x` within the curly braces. (We'll say more about how this +embedding works later.) + +`{{ 2 * x }}` takes the Cryptol expression `2 * x` and lifts it to a SAW +expression. As such, this SAW spec declares that the function takes a single +`u32`-typed argument `x` and returns `2 * x`. We could have also wrote the +specification to declare that the function returns `x << 1`, but that would +have defeated the point of this exercise: we specifically want to check that +the function against a spec that is as simple and readable as possible. + +Our full SAW file is: + +``` +$include 1-11 code/times-two.saw +``` + +Which we can verify is correct like so: + +``` +$ saw times-two.saw + + + +[17:51:35.469] Loading file "times-two.saw" +[17:51:35.497] Verifying times_two/6f4e41af::times_two[0] ... +[17:51:35.512] Simulating times_two/6f4e41af::times_two[0] ... +[17:51:35.513] Checking proof obligations times_two/6f4e41af::times_two[0] ... +[17:51:35.527] Proof succeeded! times_two/6f4e41af::times_two[0] +``` + +Nice! Even though the `times_two` function does not literally return `2 * x`, +SAW is able to confirm that the function behaves as if it were implemented that +way. + +## `Term`s and other types + +Now that we know how Cryptol can be used within SAW, we can go back and explain +what the `mir_term` function does. It is helpful to examine the type of +`mir_term` by using SAW's interactive mode. To do so, run the `saw` binary +without any other arguments: + +``` +$ saw +``` + +Then run `enable_experimental` (to enable MIR-related commands) and run `:type +mir_term`: + +``` +sawscript> enable_experimental +sawscript> :type mir_term +Term -> MIRValue +``` + +Here, we see that `mir_term` accepts a `Term` as an argument and returns a +`MIRValue`. In this context, the `Term` type represents a Cryptol value, and +the `MIRValue` type represents SAW-related MIR values. `Term`s can be thought +of as a subset of `MIRValue`s, and the `mir_term` function is used to promote a +`Term` to a `MIRValue`. + +Most other MIR-related commands work over `MIRValue`s, as can be seen with +SAW's `:type` command: + +``` +sawscript> :type mir_execute_func +[MIRValue] -> MIRSetup () +sawscript> :type mir_return +MIRValue -> MIRSetup () +``` + +Note that `MIRSetup` is the type of statements in a MIR specification, and two +`MIRSetup`-typed commands can be chained together by using `do`-notation. +Writing `MIRSetup ()` means that the statement does not return anything +interesting, and the use of `()` here is very much analogous to how `()` is +used in Rust. There are other `MIRSetup`-typed commands that _do_ return +something interesting, as is the case with `mir_fresh_var`: + +``` +sawscript> :type mir_fresh_var +String -> MIRType -> MIRSetup Term +``` + +This command returns a `MIRSetup Term`, which means that when you write `x <- +mir_fresh_var ... ...` in a MIR specification, then `x` will be bound at type +`Term`. + +Values of type `Term` have the property that they can be embedded into Cryptol +expression that are enclosed in double curly braces `{{ ... }}`. This is why +our earlier `{{ 2 * x }}` example works, as `x` is of type `Term`. + +## Preconditions and postconditions + +As a sanity check, let's write a naïve version of `times_two` that explicitly +returns `2 * x`: + +``` rust +$include 5-7 code/times-two.rs +``` + +It seems like we should be able to verify this `times_two_ref` function using +the same spec that we used for `times_two`: + +``` +$include 11-11 code/times-two-ref-fail.saw +``` + +Somewhat surprisingly, SAW fails to verify this function: + +``` +$ saw times-two-ref-fail.saw + + + +[18:58:22.578] Loading file "times-two-ref-fail.saw" +[18:58:22.608] Verifying times_two/56182919::times_two_ref[0] ... +[18:58:22.621] Simulating times_two/56182919::times_two_ref[0] ... +[18:58:22.622] Checking proof obligations times_two/56182919::times_two_ref[0] ... +[18:58:22.640] Subgoal failed: times_two/56182919::times_two_ref[0] attempt to compute `const 2_u32 * move _2`, which would overflow +[18:58:22.640] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 375} +[18:58:22.640] ----------Counterexample---------- +[18:58:22.640] x: 2147483648 +[18:58:22.640] Stack trace: +"mir_verify" (times-two-ref-fail.saw:11:1-11:11) +Proof failed. +``` + +The "`which would overflow`" portion of the error message suggests what went +wrong. When a Rust program is compiled with debug settings (which is the +default for `rustc` and `saw-rustc`), arithmetic operations such as +multiplication will check if the result of the operation can fit in the +requested number of bits. If not, the program will raise an error. + +In this case, we must make the result of multiplication fit in a `u32`, which +can represent values in the range `0` to `2^^32 - 1` (where `^^` is Cryptol's +exponentiation operator). But it is possible to take a number in this range, +multiply it by two, and have the result fall outside of the range. In fact, SAW +gives us a counterexample with exactly this number: `2147483648`, which can +also be written as `2^^31`. Multiplying this by two yields `2^^32`, which is +just outside of the range of values expressible with `u32`. SAW's duties +include checking that a function cannot fail at runtime, so this function falls +afoul of that check. + +Note that we didn't have this problem with the original definition of +`times_two` because the semantics of `<<` are such that if the result is too +large to fit in the requested type, then the result will _overflow_, i.e., wrap +back around to zero and count up. This means that `(2^^31) << 1` evaluates to +`0` rather than raising an error. Cryptol's multiplication operation also +performs integer overflow (unlike Rust in debug settings), which is why we +didn't notice any overflow-related issues when verifying `times_two`. + +There are two possible ways that we can repair this. One way is to rewrite +`times_two_ref` to use Rust's +[`wrapping_mul`](https://doc.rust-lang.org/std/primitive.u32.html#method.wrapping_mul) +function, a variant of multiplication that always uses integer overflow. This +work around the issue, but it is a bit more verbose. + +The other way is to make our spec more precise such that we only verify +`times_two_ref` for particular inputs. Although `times_two_ref` will run into +overflow-related issues when the argument is `2^^31` or greater, it is +perfectly fine for inputs smaller than `2^^31`. We can encode such an +assumption in SAW by adding a _precondition_. To do so, we write a slightly +modified version of `times_two_spec`: + +``` +$include 13-18 code/times-two.saw +``` + +The most notable change is the `mir_precond {{ x < 2^^31 }};` line. +`mir_precond` (where "`precond`" is short for "precondition") is a command that +takes a `Term` argument that contains a boolean predicate, such as `{{ x < +2^^31 }}`. Declaring a precondition requires that this predicate must hold +during verification, and any values of `x` that do not satisfy this predicate +are not considered. + +By doing this, we have limited the range of the function from `0` to `2^^31 - +1`, which is exactly the range of values for which `times_two_ref` is well +defined. SAW will confirm this if we run it: + +``` +$include 20-20 code/times-two.saw +``` +``` +[19:23:53.480] Verifying times_two/56182919::times_two_ref[0] ... +[19:23:53.496] Simulating times_two/56182919::times_two_ref[0] ... +[19:23:53.497] Checking proof obligations times_two/56182919::times_two_ref[0] ... +[19:23:53.531] Proof succeeded! times_two/56182919::times_two_ref[0] +``` + +We can add as many preconditions to a spec as we see fit. For instance, if we +only want to verify `times_two_ref` for positive integers, we could add an +additional assumption: + +``` +$include 22-28 code/times-two.saw +``` + +In addition to preconditions, SAW also supports postconditions. Whereas +preconditions represent conditions that must hold _before_ invoking a function, +postconditions represent conditions that must hold _after_ invoking a function. +We have already seen one type of postcondition in the form of the `mir_return` +command, which imposes a postcondition on what the return value must be equal +to. + +We can introduce additional postconditions with the `mir_postcond` command. +For example, if we call `times_two_ref` with a positive argument, then it +should be the case that the return value should be strictly greater than the +argument value. We can check for this using `mir_postcond` like so: + +``` +$include 32-39 code/times-two.saw +``` + +An additional convenience that SAW offers is the `mir_assert` command. +`mir_assert` has the same type as `mir_precond` and `mir_postcond`, but +`mir_assert` can be used to declare both preconditions _and_ postconditions. +The difference is where `mir_assert` appears in a specification. If +`mir_assert` is used before the call to `mir_execute_func`, then it declares a +precondition. If `mir_assert` is used after the call to `mir_execute_func`, +then it declares a postcondition. + +For example, we can rewrite `times_two_ref_positive_postcond_spec` to use +`mir_assert`s like so: + +``` +$include 43-50 code/times-two.saw +``` + +The choice of whether to use `mir_precond`/`mir_postcond` versus `mir_assert` is +mostly a matter personal taste. diff --git a/doc/rust-tutorial/static-items.md b/doc/rust-tutorial/static-items.md new file mode 100644 index 0000000000..e12d54f560 --- /dev/null +++ b/doc/rust-tutorial/static-items.md @@ -0,0 +1,226 @@ +# Static items + +Sometimes, Rust code makes use of [_static +items_](https://doc.rust-lang.org/reference/items/static-items.html), which are +definitions that are defined in a precise memory location for the entire +duration of the program. As such, static items can be thought of as a form of +global variables. + +## Immutable static items + +There are two kinds of static items in Rust: mutable static items (which have a +`mut` keyword) and immutable static items (which lack `mut`). Immutable static +items are much easier to deal with, so let's start by looking at an example of +a program that uses immutable static data: + +``` rust +$include 1-5 code/statics.rs +``` + +This function will return `ANSWER`, i.e., `42`. We can write a spec that says +as much: + +``` +$include 5-9 code/statics.saw +``` + +This works, but it is somewhat unsatisfying, as it requires hard-coding the +value of `ANSWER` into the spec. Ideally, we'd not have to think about the +precise implementation of static items like `ANSWER`. Fortunately, SAW makes +this possible by providing a `mir_static_initializer` function which computes +the initial value of a static item at the start of the program: + +``` +sawscript> :type mir_static_initializer +String -> MIRValue +``` + +In this case, `mir_static_initializer "statics::ANSWER"` is equivalent to +writing `mir_term {{ 42 : [32] }}`, so this spec is also valid: + +``` +$include 14-18 code/statics.saw +``` + +Like `mir_verify`, the `mir_static_initializer` function expects a full +identifier as an argument, so we must write `"statics::ANSWER"` instead of +just `"ANSWER". + +At the MIR level, there is a unique reference to every static item. You can +obtain this reference by using the `mir_static` function: + +``` +sawscript> :type mir_static +String -> MIRValue +``` + +Here is one situation in which you would need to use a _reference_ to a static +item (which `mir_static` computes) rather than the _value_ of a static item +(which `mir_static_initializer` computes): + +``` rust +$include 7-9 code/statics.rs +``` + +A spec for this function would look like this: + +``` +$include 23-27 code/statics.saw +``` + +That's about all there is to say regarding immutable static items. + +## Mutable static items + +Mutable static items are a particularly tricky aspect of Rust. Including a +mutable static item in your program is tantamount to having mutable global +state that any function can access and modify. They are so tricky, in fact, +that Rust does not even allow you to use them unless you surround them in an +`unsafe` block: + +``` rust +$include 11-15 code/statics.rs +``` + +The `mir_static_initializer` and `mut_static` functions work both immutable and +mutable static items, so we can write specs for mutable items using mostly the +same techniques as for writing specs for immutable items. We must be careful, +however, as SAW is pickier when it comes to specifying the initial values of +mutable static items. For example, here is naïve attempt at porting the spec +for `answer_to_the_ultimate_question` over to its mutable static counterpart, +`mut_answer_to_the_ultimate_question`: + +``` +$include 5-9 code/statics-fail.saw +``` + +This looks plausible, but SAW will fail to verify it: + +``` +[21:52:32.738] Verifying statics/28a97e47::mut_answer_to_the_ultimate_question[0] ... +[21:52:32.745] Simulating statics/28a97e47::mut_answer_to_the_ultimate_question[0] ... +... +Symbolic execution failed. +Abort due to assertion failure: + statics.rs:14:14: 14:24: error: in statics/28a97e47::mut_answer_to_the_ultimate_question[0] + attempted to read empty mux tree +``` + +Oh no! Recall that we have seen this "`attempted to read empty mux tree`" error +message once before when discussing reference types. This error arose when we +attempted to read from uninitialized memory from a reference value. The same +situation applies here. A static item is backed by a reference, and SAW +deliberately does _not_ initialize the memory that a mutable static reference +points to upon program startup. Since we did not initialize `MUT_ANSWER`'s +reference value in the preconditions of the spec, SAW crashes at simulation +time when it attempts to read from the uninitialized memory. + +The solution to this problem is to perform this initialization explicitly using +`mir_points_to` in the preconditions of the spec. For example, this is a valid +spec: + +``` +$include 32-40 code/statics-fail.saw +``` + +We don't necessarily have to use `mir_static_initializer` as the starting value +for `MUT_ANSWER`, however. This spec, which uses `27` as the starting value, is +equally valid: + +``` +$include 45-52 code/statics-fail.saw +``` + +At this point, you are likely wondering: why do we need to explicitly +initialize mutable static references but not immutable static references? After +all, when we wrote a spec for `answer_to_the_ultimate_question` earlier, we +managed to get away with not initializing the reference for `ANSWER` (which is +an immutable static item). The difference is that the value of a mutable static +item can change over the course of a program, and SAW requires that you be very +careful in specifying what a mutable static value is at the start of a +function. For example, consider a slightly extended version of the earlier Rust +code we saw: + +``` rust +$include 11-22 code/statics.rs +``` + +Suppose someone were to ask you "what value does +`mut_answer_to_the_ultimate_question` return?" This is not a straightforward +question to answer, as the value that it returns depends on the surrounding +context. If you were to call `mut_answer_to_the_ultimate_question` right as the +program started, it would return `42`. If you were to call +`mut_answer_to_the_ultimate_question` as part of the implementation of +`alternate_universe`, however, then it would return `27`! This is an inherent +danger of using mutable static items, as they can be modified at any time by +any function. For this reason, SAW requires you to be explicit about what the +initial values of mutable static items should be. + +### Mutable static items and compositional overrides + +In the "Overrides and mutable references" section, we discussed the potential +pitfalls of using mutable references in compositional overrides. Mutable static +items are also mutable values that are backed by references, and as such, they +are also subject to the same pitfalls. Let's see an example of this: + +``` rust +$include 1-12 code/statics-compositional.rs +``` + +The setup is almost the same, except that instead of passing a mutable +reference as an argument to `side_effect`, we instead declare a mutable static +item `A` that is shared between `side_effect` and `foo`. We could potentially +write SAW specs for `side_effect` and `foo` like these: + +``` +$include 5-20 code/statics-compositional-fail.saw +``` + +Note that we have once again underspecified the behavior of `side_effect`, as +we do not say what `A`'s value should be in the postconditions of +`side_effect_spec`. Similarly, `foo_spec` is wrong, as it should return `0` +rather than the initial value of `A`. By similar reasoning as before, we run +the risk that using `side_effect_ov` could lead use to prove something +incorrect. Thankfully, SAW can also catch this sort of mistake: + +``` +[15:46:38.525] Verifying statics_compositional/16fea9c0::side_effect[0] ... +[15:46:38.533] Simulating statics_compositional/16fea9c0::side_effect[0] ... +[15:46:38.533] Checking proof obligations statics_compositional/16fea9c0::side_effect[0] ... +[15:46:38.533] Proof succeeded! statics_compositional/16fea9c0::side_effect[0] +[15:46:38.533] Verifying statics_compositional/16fea9c0::foo[0] ... +[15:46:38.542] Simulating statics_compositional/16fea9c0::foo[0] ... +[15:46:38.542] Matching 1 overrides of statics_compositional/16fea9c0::side_effect[0] ... +[15:46:38.542] Branching on 1 override variants of statics_compositional/16fea9c0::side_effect[0] ... +... +State of mutable static variable "statics_compositional/16fea9c0::A[0]" not described in postcondition +``` + +To repair this proof, add a `mir_points_to` statement in the postconditions of +`side_effect_spec`: + +``` +$include 7-13 code/statics-compositional.saw +``` + +And then correct the behavior of `foo_spec`: + +``` +$include 15-22 code/statics-compositional.saw +``` + +Be warned that if your program declares any mutable static items, then any +compositional override _must_ state what the value of each mutable static item +is in its postconditions. This applies _even if the override does not directly +use the mutable static items_. For example, if we had declared a second mutable +static item alongside `A`: + +``` rust +static mut A: u32 = 42; +static mut B: u32 = 27; +``` + +Then `side_effect_spec` would need an additional `mir_points_to` statement +involving `B` to satisfy this requirement. This requirement is somewhat +heavy-handed, but it is necessary in general to avoid unsoundness. Think +carefully before you use mutable static items! From 6fd1d87cda0758926842eaefe5b20cd797f45a67 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 05:48:32 -0800 Subject: [PATCH 16/67] rust-tutorial: Correct minor errors in Markdown. - Mismatched inline code elements - Code blocks without whitespace in between - Incorrect link (introduced by splitting up rust-tutorial.md) --- doc/rust-tutorial/case-study-salsa20.md | 3 ++- doc/rust-tutorial/introduction.md | 2 +- doc/rust-tutorial/overrides-and-compositional-verification.md | 4 ++-- doc/rust-tutorial/saw-basics.md | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/rust-tutorial/case-study-salsa20.md b/doc/rust-tutorial/case-study-salsa20.md index 4da4b94ce8..bf65dd2bdb 100644 --- a/doc/rust-tutorial/case-study-salsa20.md +++ b/doc/rust-tutorial/case-study-salsa20.md @@ -158,6 +158,7 @@ cipher. Here is the typical use case for a `Core` value: ``` rust $include 83-83 code/salsa20/src/core.rs ``` + ``` rust $include 90-90 code/salsa20/src/core.rs ``` @@ -472,7 +473,7 @@ Note that: of values that is chosen in the `rounds` function. (Note that `\/` is the logical-or function in Cryptol.) Each of these are concrete values that are less than `STATE_WORDS` (`16`), so we no longer need a precondition stating - `a < `STATE_WORDS /\ ...`. + `a < STATE_WORDS /\ ...`. * Because we now reference `indices` in the preconditions, we have moved its definition up. (Previously, it was defined in the postconditions section.) diff --git a/doc/rust-tutorial/introduction.md b/doc/rust-tutorial/introduction.md index 8110d9a812..8b2976afd9 100644 --- a/doc/rust-tutorial/introduction.md +++ b/doc/rust-tutorial/introduction.md @@ -17,7 +17,7 @@ language originally designed for high-level descriptions of cryptographic algorithms. For readers unfamiliar with Cryptol, various documents describing its use are available [here](http://cryptol.net/documentation.html). -This tutorial also include a [case study](#case-study-salsa20) on how to use +This tutorial also include a [case study](./case-study-salsa20.md) on how to use SAW to verify a real-world implementation of the Salsa20 stream cipher based on the [`stream-ciphers`](https://github.com/RustCrypto/stream-ciphers) Rust project. The code for this case study is also available [on diff --git a/doc/rust-tutorial/overrides-and-compositional-verification.md b/doc/rust-tutorial/overrides-and-compositional-verification.md index 900824f08b..9fff3bd848 100644 --- a/doc/rust-tutorial/overrides-and-compositional-verification.md +++ b/doc/rust-tutorial/overrides-and-compositional-verification.md @@ -104,13 +104,13 @@ the output of SAW: We've now proven `f` compositionally! The first two lines ("`Verifying ...`" and "`Simulating ...`") and the last two lines ("`Checking proof obligations -...`" and "`Proof succeeded! ..."`) are the same as before, but this time, we +...`" and "`Proof succeeded! ...`") are the same as before, but this time, we have some additional lines of output in between: * Whenever SAW prints "`Matching overrides of `", that's when you know that SAW is about to simulate a call to ``. At that point, SAW will check to see how many overrides (``) for `` are available. -* Whenever SAW prints "`Brancing on override variants of ", SAW is +* Whenever SAW prints "`Brancing on override variants of `", SAW is trying to figure out which of the `` overrides to apply. In this example, there is only a single override, so the choice is easy. In cases where there are multiple overrides, however, SAW may have to work harder (possibly even diff --git a/doc/rust-tutorial/saw-basics.md b/doc/rust-tutorial/saw-basics.md index 941aba3912..b75d049576 100644 --- a/doc/rust-tutorial/saw-basics.md +++ b/doc/rust-tutorial/saw-basics.md @@ -329,6 +329,7 @@ defined. SAW will confirm this if we run it: ``` $include 20-20 code/times-two.saw ``` + ``` [19:23:53.480] Verifying times_two/56182919::times_two_ref[0] ... [19:23:53.496] Simulating times_two/56182919::times_two_ref[0] ... From ba8c180d46aa5452576e6b7428604e6c5446ec9c Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 17:42:12 -0800 Subject: [PATCH 17/67] rust-tutorial: Normalize code blocks. - ::: fences - {literalinclude} with :lines: for code/ sources (docode.hs defunct) - {code-block} for everything else --- doc/rust-tutorial/about-mir-json.md | 70 +- doc/rust-tutorial/case-study-salsa20.md | 651 ++++++++++-------- doc/rust-tutorial/compound-data-types.md | 239 ++++--- doc/rust-tutorial/docode.hs | 30 - ...verrides-and-compositional-verification.md | 143 ++-- doc/rust-tutorial/reference-types.md | 47 +- doc/rust-tutorial/saw-basics.md | 135 ++-- doc/rust-tutorial/static-items.md | 118 ++-- 8 files changed, 783 insertions(+), 650 deletions(-) delete mode 100644 doc/rust-tutorial/docode.hs diff --git a/doc/rust-tutorial/about-mir-json.md b/doc/rust-tutorial/about-mir-json.md index ab3825f905..a826294da4 100644 --- a/doc/rust-tutorial/about-mir-json.md +++ b/doc/rust-tutorial/about-mir-json.md @@ -34,21 +34,21 @@ study that involves a `cargo`-based project, which will use `cargo-saw-build`. Let's try out `saw-rustc` on a small example file, which we'll name `first-example.rs`: -``` rust -$include all code/first-example.rs -``` +:::{literalinclude} code/first-example.rs +:language: rust +::: This is the identity function, but specialized to the type `u8`. We can compile this with `saw-rustc` like so: -``` +:::{code-block} console $ saw-rustc first-example.rs note: Emitting MIR for first_example/abef32c5::id_u8 linking 1 mir files into first-example.linked-mir.json -``` +::: `saw-rustc` prints out some additional information that `rustc` alone does not print, and we have displayed the parts of this information that are most @@ -93,23 +93,23 @@ libraries is to perform the following steps: 1. Clone the [`crucible`](https://github.com/GaloisInc/crucible) repo like so: - ``` + :::{code-block} console $ git clone https://github.com/GaloisInc/crucible - ``` + ::: 2. Navigate to the [`crux-mir`](https://github.com/GaloisInc/crucible/tree/master/crux-mir) subdirectory of the `crucible` checkout: - ``` + :::{code-block} console $ cd crucible/crux-mir/ - ``` + ::: 3. Run the `translate_libs.sh` script: - ``` + :::{code-block} console $ ./translate_libs.sh - ``` + ::: This will compile the custom versions of the Rust standard libraries using `mir-json`, placing the results under the `rlibs` subdirectory. @@ -117,9 +117,9 @@ libraries is to perform the following steps: 4. Finally, define a `SAW_RUST_LIBRARY_PATH` environment variable that points to the newly created `rlibs` subdirectory: - ``` + :::{code-block} console $ export SAW_RUST_LIBRARY_PATH=<...>/crucible/crux-mir/rlibs - ``` + ::: An upcoming release of SAW will include these custom libraries pre-built, which will greatly simplify the steps above. Either way, you will need to set the @@ -132,14 +132,14 @@ The `id_u8` function above is likely not how most Rust programmers would define the identity function. Instead, it would seem more natural to define it generically, that is, by parameterizing the function by a type parameter: -``` rust -$include all code/generics-take-1.rs -``` +:::{literalinclude} code/generics-take-1.rs +:language: rust +::: If you compile this with `saw-rustc`, however, the resulting JSON file will lack a definition for `id`! We can see this by using `jq`: -``` +:::{code-block} console $ saw-rustc generics-take-1.rs $ jq . generics-take-1.linked-mir.json @@ -153,7 +153,7 @@ $ jq . generics-take-1.linked-mir.json "tys": [], "roots": [] } -``` +::: What is going on here? This is the result of an important design choice that SAW makes: _SAW only supports verifying monomorphic functions_. To be more @@ -164,13 +164,13 @@ In order to verify a function using generics in your Rust code, you must provide a separate, monomorphic function that calls into the generic function. For example, you can rewrite the example above like so: -``` rust -$include all code/generics-take-2.rs -``` +:::{literalinclude} code/generics-take-2.rs +:language: rust +::: If you compile this version with `saw-rustc`, you'll see: -``` +:::{code-block} console $ saw-rustc generics-take-2.rs note: Emitting MIR for generics_take_2/8b1bf337::id_u8 @@ -179,7 +179,7 @@ note: Emitting MIR for generics_take_2/8b1bf337::id::_instaddce72e1232152c[0] linking 1 mir files into generics-take-2.linked-mir.json -``` +::: This time, the resulting JSON file contains a definition for `id_u8`. The reason that this works is because when `id_u8` calls `id`, the Rust compile @@ -194,13 +194,13 @@ only be able to verify the `id_u8` function from this file. If you are ever in doubt about which functions are accessible for verification with SAW, you can check this with `jq` like so: -``` +:::{code-block} console $ jq '.intrinsics | map(.name)' generics-take-2.linked-mir.json [ "generics_take_2/8b1bf337::id_u8", "generics_take_2/8b1bf337::id::_instaddce72e1232152c[0]" ] -``` +::: Here, "intrinsics" are monomorphic functions that are visible to SAW. Note that `saw-rustc` will optimize away all definitions that are not accessible from one @@ -231,7 +231,9 @@ identifiers provide us the mechanism for doing so. Let's take a closer look at what goes into an identifier. In general, an identifier will look like the following: -* `/::` +:::{code-block} +/:: +::: `` is the name of the crate in which the function is defined. All of the examples we've seen up to this point have been defined in standalone @@ -252,9 +254,9 @@ involve multiple _segments_, depending on the module hierarchy for the program being verified. For instance, a `read` function located in `core/src/ptr/mod.rs` will have the identifier: -``` +:::{code-block} core/::ptr::read -``` +::: Where `core` is the crate name and `ptr::read` is the function path, which has two segments `ptr` and `read`. There are also some special forms of @@ -262,9 +264,9 @@ segments that appear for functions defined in certain language constructs. For instance, if a function is defined in an `impl` block, then it will have `{impl}` as one of its segments, e.g., -``` +:::{code-block} core/::ptr::const_ptr::{impl}::offset -``` +::: The most cumbersome part of writing an identifier is the disambiguator, as it is extremely sensitive to changes in the code (not to mention hard to remember @@ -272,15 +274,15 @@ and type). Luckily, the vast majority of crate names correspond to exactly one disambiguator, and we can exploit this fact to abbreviate identifiers that live in such crates. For instance, we can abbreviate this identifier: -``` +:::{code-block} core/::ptr::read -``` +::: To simply: -``` +:::{code-block} core::ptr::read -``` +::: We will adopt the latter, shorter notation throughout the rest of the tutorial. SAW also understands this shorthand, so we will also use this notation when diff --git a/doc/rust-tutorial/case-study-salsa20.md b/doc/rust-tutorial/case-study-salsa20.md index bf65dd2bdb..d299e7c681 100644 --- a/doc/rust-tutorial/case-study-salsa20.md +++ b/doc/rust-tutorial/case-study-salsa20.md @@ -96,18 +96,20 @@ interesting code lives in [`src/core.rs`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/src/core.rs). At the top of this file, we have the `Core` struct: -``` rust -$include 8-14 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 8-14 +:language: rust +::: Let's walk through this: * The `state` field is an array that is `STATE_WORDS` elements long, where `STATE_WORDS` is a commonly used alias for `16`: - ``` rust - $include 88-89 code/salsa20/src/lib.rs - ``` + :::{literalinclude} code/salsa20/src/lib.rs + :lines: 88-89 + :language: rust + ::: * The `rounds` field is of type `PhantomData`. If you haven't seen it before, @@ -119,24 +121,27 @@ Let's walk through this: The reason that `Core` needs a `PhantomData` field is because `R` implements the `Rounds` trait: -``` rust -$include 1-5 code/salsa20/src/rounds.rs -``` +:::{literalinclude} code/salsa20/src/rounds.rs +:lines: 1-5 +:language: rust +::: A core operation in Salsa20 is hashing its input through a series of _rounds_. The `COUNT` constant indicates how many rounds should be performed. The Salsa20 spec assumes 20 rounds: -``` rust -$include 23-29 code/salsa20/src/rounds.rs -``` +:::{literalinclude} code/salsa20/src/rounds.rs +:lines: 23-29 +:language: rust +::: However, there are also reduced-round variants that perform 8 and 12 rounds, respectively: -``` rust -$include 7-21 code/salsa20/src/rounds.rs -``` +:::{literalinclude} code/salsa20/src/rounds.rs +:lines: 7-21 +:language: rust +::: Each number of rounds has a corresponding struct whose names begins with the letter `R`. For instance, a `Core` value represents a 20-round Salsa20 @@ -144,9 +149,10 @@ cipher. Here is the typical use case for a `Core` value: * A `Core` value is created using the `new` function: - ``` rust - $include 18-18 code/salsa20/src/core.rs - ``` + :::{literalinclude} code/salsa20/src/core.rs + :lines: 18 + :language: rust + ::: We'll omit the implementation for now. This function takes a secret `Key` value and a unique `Nonce` value and uses them to produce the initial `state` @@ -155,13 +161,15 @@ cipher. Here is the typical use case for a `Core` value: * After creating a `Core` value, the `counter_setup` and `rounds` functions are used to produce the Salsa20 keystream: - ``` rust - $include 83-83 code/salsa20/src/core.rs - ``` + :::{literalinclude} code/salsa20/src/core.rs + :lines: 83 + :language: rust + ::: - ``` rust - $include 90-90 code/salsa20/src/core.rs - ``` + :::{literalinclude} code/salsa20/src/core.rs + :lines: 90 + :language: rust + ::: We'll have more to say about these functions later. @@ -169,9 +177,10 @@ cipher. Here is the typical use case for a `Core` value: newly created `Core` value, produces its keystream, and applies it to a message to produce the `output`: - ``` rust - $include 68-68 code/salsa20/src/core.rs - ``` + :::{literalinclude} code/salsa20/src/core.rs + :lines: 68 + :language: rust + ::: Our ultimate goal is to verify the `apply_keystream` function, which is the Rust equivalent of the Salsa20 encryption function described in the spec. @@ -188,16 +197,16 @@ section](./about-mir-json.md#the-saw_rust_library_path-environment-variable). To build the `salsa20` crate, perform the following steps: -``` +:::{code-block} console $ cd code/salsa20/ $ cargo saw-build -``` +::: Near the end of the build output, you will see a line that looks like this: -``` +:::{code-block} console linking 9 mir files into <...>/saw-script/doc/rust-tutorial/code/salsa20/target/x86_64-unknown-linux-gnu/debug/deps/salsa20-dd0d90f28492b9cb.linked-mir.json -``` +::: This is the location of the MIR JSON file that we will need to provide to SAW. (When we tried it, the hash in the file name was `dd0d90f28492b9cb`, but it @@ -205,9 +214,9 @@ could very well be different on your machine.) Due to how `cargo` works, the location of this file is in a rather verbose, hard-to-remember location. For this reason, we recommend copying this file to a different path, e.g., -``` +:::{code-block} console $ cp <...>/saw-script/doc/rust-tutorial/code/salsa20/target/x86_64-unknown-linux-gnu/debug/deps/salsa20-dd0d90f28492b9cb.linked-mir.json code/salsa20/salsa20.linked-mir.json -``` +::: As a safeguard, we have also checked in a compressed version of this MIR JSON file as @@ -221,9 +230,10 @@ Now that we've built the `salsa20` crate, it's time to start writing some proofs! Let's start a new `code/salsa20/salsa20.saw` file as fill it in with the usual preamble: -``` -$include 1-3 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 1-3 +:language: sawscript +::: We are also going to need to make use of the Cryptol implementation of the Salsa20 spec, which is defined in @@ -231,9 +241,10 @@ Salsa20 spec, which is defined in SAW allows you to import standalone Cryptol `.cry` files by using the `import` command: -``` -$include 4-4 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 4 +:language: sawscript +::: As an aside, note that we have also checked in a [`code/salsa20/salsa20-reference.saw`](https://github.com/GaloisInc/saw-script/tree/master/doc/rust-tutorial/code/salsa20/salsa20-reference.saw), @@ -260,9 +271,10 @@ the problem into smaller pieces that are easier to understand in isolation. If we look at the implementation of `apply_keystream`, we see that it invokes the `round` function, which in turn invokes the `quarter_round` function: -``` rust -$include 122-142 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 122-142 +:language: rust +::: `quarter_round` is built on top of the standard library functions [`wrapping_add`](https://doc.rust-lang.org/std/primitive.usize.html#method.wrapping_add) @@ -274,9 +286,10 @@ so we have finally reached the bottom of the call stack. This makes The implementation of the Rust `quarter_round` function is quite similar to the Cryptol `quarterround` function in `Salsa20.cry`: -``` -$include 10-16 code/salsa20/Salsa20.cry -``` +:::{literalinclude} code/salsa20/Salsa20.cry +:lines: 10-16 +:language: cryptol +::: The Cryptol `quarterround` function doesn't have anything like the `state` argument in the Rust `quarter_round` function, but let's not fret about that @@ -285,29 +298,33 @@ have to figure out how to make it fit. Let's start filling out the SAW spec for `quarter_round`: -``` -$include 6-6 code/salsa20/salsa20-quarter_round-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail1.saw +:lines: 6 +:language: sawscript +::: We are going to need some fresh variables for the `a`, `b`, `c`, and `d` arguments: -``` -$include 7-10 code/salsa20/salsa20-quarter_round-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail1.saw +:lines: 7-10 +:language: sawscript +::: We will also need to allocate a reference for the `state` argument. The reference's underlying type is `STATE_WORDS` (`16`) elements long: -``` -$include 11-13 code/salsa20/salsa20-quarter_round-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail1.saw +:lines: 11-13 +:language: sawscript +::: Finally, we will need to pass these arguments to the function: -``` -$include 15-21 code/salsa20/salsa20-quarter_round-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail1.saw +:lines: 15-21 +:language: sawscript +::: With that, we have a spec for `quarter_round`! It's not very interesting just yet, as we don't specify what `state_ref` should point to after the function @@ -319,7 +336,7 @@ as expected. Let's check our progress thus far by running this through SAW: -``` +:::{code-block} console $ saw salsa20.saw ... [23:16:05.080] Type errors: @@ -330,7 +347,7 @@ either `enable_deprecated` or `enable_experimental`. salsa20/salsa20.saw:11:31-11:60: Unbound variable: "STATE_WORDS" (salsa20.saw:11:41-11:52) Note that some built-in commands are available only after running either `enable_deprecated` or `enable_experimental`. -``` +::: We've already run into some type errors. Not too surprising, considering this was our first attempt. The error message contains that `STATE_WORDS` is @@ -338,9 +355,10 @@ unbound. This makes sense if you think about it, as `STATE_WORDS` is defined in the Rust code, but not in the SAW file itself. Let's fix that by adding this line to `salsa20.saw`: -``` -$include 6-6 code/salsa20/salsa20-quarter_round-fail2.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail2.saw +:lines: 6 +:language: sawscript +::: That change fixes the type errors in `quarter_round_spec`. Hooray! Let's press on. @@ -350,17 +368,18 @@ know what the full identifier for the `quarter_round` function is. Because it is defined in the `salsa20` crate and in the `core.rs` file, so we would expect the identifier to be named `salsa20::core::quarter_round`: -``` -$include 25-26 code/salsa20/salsa20-quarter_round-fail2.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail2.saw +:lines: 25-26 +:language: sawscript +::: However, SAW disagrees: -``` +:::{code-block} console [00:22:56.970] Stack trace: "mir_verify" (salsa20.saw:26:3-26:13) Couldn't find MIR function named: salsa20::core::quarter_round -``` +::: Ugh. This is a consequence of how `mir-json` disambiguates identifiers. Because there is a separate `core` crate in the Rust standard libraries, `mir-json` @@ -371,13 +390,14 @@ up](https://github.com/GaloisInc/saw-script/issues/1980) more easily.) Once we change the identifier: -``` -$include 25-26 code/salsa20/salsa20-quarter_round-fail3.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail3.saw +:lines: 25-26 +:language: sawscript +::: We can run SAW once more. This time, SAW complains about a different thing: -``` +:::{code-block} console [01:00:19.697] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... [01:00:19.714] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... [01:00:19.717] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... @@ -385,7 +405,7 @@ We can run SAW once more. This time, SAW complains about a different thing: [01:00:19.739] SolverStats {solverStatsSolvers = fromList ["SBV->Z3"], solverStatsGoalSize = 53} [01:00:19.739] ----------Counterexample---------- [01:00:19.739] a: 2147483648 -``` +::: Here, SAW complains that we have an `index out of bounds`. Recall that we are indexing into the `state` array, which is of length 16, using the @@ -397,9 +417,10 @@ out of bounds. In practice, however, the only values of `a`/`b`/`c`/`d` that we will use are less than 16. We can express this fact as a precondition: -``` -$include 13-16 code/salsa20/salsa20-quarter_round-fail4.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail4.saw +:lines: 13-16 +:language: sawscript +::: That is enough to finally get SAW to verify this very stripped-down version of `quarter_round_spec`. Some good progress! But we aren't done yet, as we don't @@ -421,13 +442,14 @@ In Cryptol, one can look up elements of an array using the `(@@)` function, and one can perform in-place array updates using the `updates` function. This translates into a postcondition that looks like this: -``` -$include 28-30 code/salsa20/salsa20-quarter_round-fail4.saw -``` +:::{literalinclude} code/salsa20/salsa20-quarter_round-fail4.saw +:lines: 28-30 +:language: sawscript +::: What does SAW think of this? Someone surprisingly, SAW finds a counterexample: -``` +:::{code-block} console [01:43:30.065] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... [01:43:30.078] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... [01:43:30.084] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... @@ -440,7 +462,7 @@ What does SAW think of this? Someone surprisingly, SAW finds a counterexample: [01:43:30.802] c: 0 [01:43:30.802] d: 0 [01:43:30.802] state: [3788509705, 0, 0, 3223325776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1074561051, 0, 0] -``` +::: Note that in this counterexample, the values of `c` and `d` are the same. In the Rust version of the function, each element in `state` is updated @@ -454,18 +476,20 @@ are not encoding into `quarter_round_spec`'s preconditions. At this point, it can be helpful to observe _how_ the `quarter_round` function is used in practice. The call sites are found in the `rounds` function: -``` rust -$include 92-102 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 92-102 +:language: rust +::: Here, we can see that the values of `a`/`b`/`c`/`d` will only ever be chosen from a set of eight possible options. We can take advantage of this fact to constrain the possible set of values for `a`/`b`/`c`/`d`. The latest iteration of the `quarter_round_spec` is now: -``` -$include 10-38 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 10-28 +:language: sawscript +::: Note that: @@ -480,12 +504,12 @@ Note that: With this in place, will SAW verify `quarter_round_spec` now? -``` +:::{code-block} console [02:14:02.037] Verifying salsa20/10e438b3::core#1[0]::quarter_round[0] ... [02:14:02.051] Simulating salsa20/10e438b3::core#1[0]::quarter_round[0] ... [02:14:02.057] Checking proof obligations salsa20/10e438b3::core#1[0]::quarter_round[0] ... [02:14:18.616] Proof succeeded! salsa20/10e438b3::core#1[0]::quarter_round[0] -``` +::: At long last, it succeeds. Hooray! SAW does have to think for a while, however, as this proof takes about 17 seconds to complete. It would be unfortunate to @@ -494,9 +518,10 @@ still have other functions to verify, this is a very real possibility. For this reason, it can be helpful to temporarily turn this use of `mir_verify` into a `mir_unsafe_assume_spec`: -``` -$include 40-44 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 40-44 +:language: sawscript +::: Once we are done with the entire proof, we can come back and remove this use of `mir_unsafe_assume_spec`, as we're only using it as a time-saving measure. @@ -506,9 +531,10 @@ Once we are done with the entire proof, we can come back and remove this use of Now that we've warmed up, let's try verifying the `rounds` function, which is where `quarter_round` is invoked. Here is the full definition of `rounds`: -``` rust -$include 90-108 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 90-108 +:language: rust +::: First, `rounds` performs `COUNT` rounds on the `state` argument. After this, it takes each element of `self.state` and adds it to the corresponding element in @@ -520,9 +546,10 @@ difference is that while the Salsa20(x) hash function converts the results to little-endian form, the `rounds` function does not. `Salsa20.cry` implements this part of the spec here: -``` -$include 139-147 code/salsa20/Salsa20.cry -``` +:::{literalinclude} code/salsa20/Salsa20.cry +:lines: 139-147 +:language: cryptol +::: Where `Salsa20` is the hash function, and `Salsa20_rounds` is the part of the hash function that excludes the little-endian conversions. In other words, @@ -544,59 +571,67 @@ Alright, enough chatter—time to start writing a proof. First, let's look up th `R8` ADT. This is defined in the `salsa20` crate in the `rounds.rs` file, so its identifier becomes `salsa20::rounds::R8`: -``` -$include 46-46 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 46 +:language: sawscript +::: Next, we need to look up the `PhantomData` ADT, which is used in the `rounds` field of the `Core` struct. This is defined in `core::marker`: -``` -$include 47-47 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 47 +:language: sawscript +::: Finally, we must look up `Core` itself. Like `quarter_round`, the `Core` -struct` is defined in `salsa20::core#1`: +struct is defined in `salsa20::core#1`: -``` -$include 48-48 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 48 +:language: sawscript +::: Now that we have the necessary prerequisites, let's write a spec for the `rounds` function. First, we need to allocate a reference for the `self` argument: -``` -$include 50-51 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 50-51 +:language: sawscript +::: Next, we need to create symbolic values for the fields of the `Core` struct, which `self_ref` will point to. The `self.state` field will be a fresh array, and the `self.rounds` field will be a simple, empty struct value: -``` -$include 52-53 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 52-53 +:language: sawscript +::: Finally, putting all of the `self` values together: -``` -$include 54-55 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 54-55 +:language: sawscript +::: Next, we need a `state` argument (not to be confused with the `self.state` field in `Core`). This is handled much the same as it was in `quarter_round_spec`: -``` -$include 57-59 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 57-59 +:language: sawscript +::: Lastly, we cap it off with a call to `mir_execute_func`: -``` -$include 61-62 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 61-62 +:language: sawscript +::: (Again, we're missing some postconditions describing what `self_ref` and `state_ref` point to after the function returns, but we'll return to that in a @@ -614,16 +649,17 @@ for instantiations of generic functions are (there [will be in the future](https://github.com/GaloisInc/saw-script/issues/1980)), but it turns out that the identifier for `rounds::` is this: -``` -$include 64-65 code/salsa20/salsa20-rounds-take-1.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-1.saw +:lines: 64-65 +:language: sawscript +::: Note that we are using `quarter_round_ov` as a compositional override. Once again, SAW is happy with our work thus far: -``` +:::{code-block} console [03:12:35.990] Proof succeeded! salsa20/10e438b3::core#1[0]::{impl#0}[0]::rounds[0]::_inst6e4a2d7250998ef7[0] -``` +::: Nice. Now let's go back and fill in the missing postconditions in `rounds_spec`. In particular, we must declare what happens to both `self_ref` @@ -631,18 +667,20 @@ and `state_ref`. A closer examination of the code in the Rust `rounds` function reveals that the `self` argument is never modified at all, so that part is easy: -``` -$include 63-63 code/salsa20/salsa20-rounds-take-2.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-2.saw +:lines: 63 +:language: sawscript +::: The `state` argument, on the other hand, is modified in-place. This time, our job is made easier by the fact that `Salsa20_rounds` implements _exactly_ what we need. Because we are instantiating `rounds` at type `R8`, we must explicitly state that we are using 8 rounds: -``` -$include 64-64 code/salsa20/salsa20-rounds-take-2.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-2.saw +:lines: 64 +:language: sawscript +::: Once again, SAW is happy with our work. We're on a roll! @@ -653,53 +691,59 @@ the `r_adt` definition, which is response for looking up `R8`. We want to turn this into a function that, depending on the user input, will look up `R8`, `R12`, or `R20`: -``` -$include 46-46 code/salsa20/salsa20-rounds-take-3.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-3.saw +:lines: 46 +:language: sawscript +::: Where `str_concat` is a SAW function for concatenating strings together: -``` +:::{code-block} console sawscript> :type str_concat String -> String -> String -``` +::: We also want to parameterize `phantom_data_adt` and `core_adt`: -``` -$include 47-48 code/salsa20/salsa20-rounds-take-3.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-3.saw +:lines: 47-48 +:language: sawscript +::: Next, we need to parameterize `rounds_spec` by the number of rounds. This will require changes in both the preconditions and postconditions. On the preconditions side, we must pass the number of rounds to the relevant functions: -``` -$include 50-56 code/salsa20/salsa20-rounds-take-3.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-3.saw +:lines: 50-56 +:language: sawscript +::: And on the postconditions side, we must pass the number of rounds to the Cryptol `Salsa20_rounds` function: -``` -$include 66-67 code/salsa20/salsa20-rounds-take-3.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-3.saw +:lines: 66-67 +:language: sawscript +::: Finally, we must adjust the call to `rounds_spec` in the context of `mir_verify` so that we pick `8` as the number of rounds: -``` -$include 69-70 code/salsa20/salsa20-rounds-take-3.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-3.saw +:lines: 69-70 +:language: sawscript +::: SAW is happy with this generalization. To demonstrate that we have generalized things correctly, we can also verify the same function at `R20` instead of `R8`: -``` -$include 71-72 code/salsa20/salsa20-rounds-take-3.saw -``` +:::{literalinclude} code/salsa20/salsa20-rounds-take-3.saw +:lines: 71-72 +:language: sawscript +::: The only things that we had to change were the identifier and the argument to `rounds_spec`. Not bad! @@ -711,9 +755,10 @@ Before we do, however, there is one more function that `apply_keystream` calls, which we ought to verify first: `counter_setup`. Thankfully, the implementation of `counter_setup` is short and sweet: -``` rust -$include 83-86 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 83-86 +:language: rust +::: This updates the elements of the `state` array at indices `8` and `9` with the lower 32 bits and the upper 32 bits of the `counter` argument, respecitvely. @@ -726,16 +771,18 @@ For now, we should take matters into our own hands and write our own Cryptol spec for `counter_setup`. To do this, we will create a new Cryptol file named `Salsa20Extras.cry`, which imports from `Salsa20.cry`: -``` -$include 1-3 code/salsa20/Salsa20Extras.cry -``` +:::{literalinclude} code/salsa20/Salsa20Extras.cry +:lines: 1-3 +:language: cryptol +::: The Cryptol implementation of `counter_setup` will need arrays of length `STATE_WORDS`, so we shall define `STATE_WORDS` first: -``` -$include 5-5 code/salsa20/Salsa20Extras.cry -``` +:::{literalinclude} code/salsa20/Salsa20Extras.cry +:lines: 5 +:language: cryptol +::: Note that we preceded this definition with the `type` keyword. In Cryptol, sequence lengths are encoded at the type level, so if we want to use @@ -744,9 +791,10 @@ sequence lengths are encoded at the type level, so if we want to use Finally, we can write a Cryptol version of `counter_setup` using our old friend `updates` to perform a bulk sequence update: -``` -$include 8-10 code/salsa20/Salsa20Extras.cry -``` +:::{literalinclude} code/salsa20/Salsa20Extras.cry +:lines: 8-10 +:language: cryptol +::: Note that `counter` is a 64-bit word, but the elements of the `state` sequence are 32-bit words. As a result, we have to explicitly truncate `counter` and @@ -756,24 +804,27 @@ first 32 bits from each word. Returning to `salsa20.saw`, we must now make use of our new Cryptol file by `import`ing it at the top: -``` -$include 5-5 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 5 +:language: sawscript +::: With the `counter_setup` Cryptol implementation in scope, we can now write a spec for the Rust `counter_setup` function. There's not too much to remark on here, as the spec proves relatively straightforward to write: -``` -$include 74-90 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 74-90 +:language: sawscript +::: We can now verify `counter_setup` against `counter_setup_spec` at lengths `8` and `20`: -``` -$include 92-95 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 92-95 +:language: sawscript +::: That wasn't so bad. It's a bit unsatisfying that we had to resort to writing a Cryptol function not found in `Salsa20.cry`, but go along with this for now—it @@ -784,9 +835,10 @@ will become apparent later why this needed to be done. It's time. Now that we've verified `rounds` and `counter_setup`, it's time to tackle the topmost function in the call stack: `apply_keystream`: -``` rust -$include 68-80 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 68-80 +:language: rust +::: There aren't _that_ many lines of code in this function, but there is still quite a bit going on. Let's walk through `apply_keystream` in more detail: @@ -796,15 +848,17 @@ quite a bit going on. Let's walk through `apply_keystream` in more detail: length. That being said, the first line of `apply_keystream`'s implementation checks that `output`'s length is equal to `BLOCK_SIZE`: - ``` rust - $include 69-69 code/salsa20/src/core.rs - ``` + :::{literalinclude} code/salsa20/src/core.rs + :lines: 69 + :language: rust + ::: Where `BLOCK_SIZE` is defined here: - ``` rust - $include 82-83 code/salsa20/src/lib.rs - ``` + :::{literalinclude} code/salsa20/src/lib.rs + :lines: 82-83 + :language: rust + ::: So in practice, `output` must have exactly 64 elements. @@ -831,33 +885,37 @@ nonce as an argument, it's not immediately clear how we'd tie this back to `apply_keystream`. But no matter: we can do what we did before and define our own Cryptol version of `apply_keystream` in `Salsa20Extras.cry`: -``` -$include 12-17 code/salsa20/Salsa20Extras.cry -``` +:::{literalinclude} code/salsa20/Salsa20Extras.cry +:lines: 12-17 +:language: cryptol +::: This implementation builds on top of the Cryptol `counter_setup` and `Salsa20_rounds` functions, which we used as the reference implementations for the Rust `counter_setup` and `rounds` functions, respectively. We also make sure to define a `BLOCK_SIZE` type alias at the top of the file: -``` -$include 6-6 code/salsa20/Salsa20Extras.cry -``` +:::{literalinclude} code/salsa20/Salsa20Extras.cry +:lines: 6 +:language: cryptol +::: Now let's write a SAW spec for `apply_keystream`. Once again, we will need to reference `BLOCK_SIZE` when talking about the `output`-related parts of the spec, so make sure to define `BLOCK_SIZE` at the top of the `.saw` file: -``` -$include 8-8 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 8 +:language: sawscript +::: First, we need to declare all of our arguments, which proceeds as you would expect: -``` -$include 120-136 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 120-136 +:language: sawscript +::: What about the postconditions? We have two mutable references to contend with: `self_ref` and `output_ref`. The postcondition for `self_ref` is fairly @@ -866,24 +924,27 @@ called. This means that after the `apply_keystream` function has returned, `self_ref` will point to the results of calling the `counter_setup` Cryptol function: -``` -$include 138-140 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 138-140 +:language: sawscript +::: `output_ref` is where the interesting work happenings. After the Rust `apply_keystream` function has returned, it will point to the results of calling the Cryptol `apply_keystream` function that we just defined: -``` -$include 141-142 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 141-142 +:language: sawscript +::: Finally, we can put this all together and verify `apply_keystream` against `apply_keystream_spec` at lengths `8` and `20`: -``` -$include 144-148 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 144-148 +:language: sawscript +::: SAW will successfully verify these. We've achieved victory... or have we? Recall that we had to tailor the Cryptol `apply_keystream` function to @@ -907,9 +968,10 @@ internal state that is used to compute the keystream to apply when hashing. In order to use this internal state, however, we must first initialize it. The `new` function that is responsible for this initialization: -``` rust -$include 17-20 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 17-20 +:language: rust +::: Sure enough, this function takes a key and a nonce as an argument! This is a critical point that we overlooked. When using the `salsa20` crate, you wouldn't @@ -928,18 +990,20 @@ All that being said, we probably to verify `new_raw` (a lower-level helper function) rather than `new` itself. This is because the definitions of `Key` and `Nonce` are somewhat involved. For instance, `Key` is defined as: -``` rust -$include 27-27 code/salsa20/src/salsa.rs -``` +:::{literalinclude} code/salsa20/src/salsa.rs +:lines: 27 +:language: rust +::: [`GenericArray`](https://docs.rs/generic-array/latest/generic_array/struct.GenericArray.html) is a somewhat complicated abstraction. Luckily, we don't really _need_ to deal with it, since `new_raw` deals with simple array references rather than `GenericArray`s: -``` rust -$include 22-23 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 22-23 +:language: rust +::: The full implementation of `new_raw` is rather long, so we won't inline the whole thing here. At a high level, it initializes the `state` array of a `Core` @@ -948,9 +1012,10 @@ elements of the array are populated with `key`, some parts are populated with `iv` (i.e., the nonce), and other parts are populated with an array named `CONSTANTS`: -``` rust -$include 91-92 code/salsa20/src/lib.rs -``` +:::{literalinclude} code/salsa20/src/lib.rs +:lines: 91-92 +:language: rust +::: The comment about `"expand 32-byte k"` is a strong hint that `new_raw` is implementing a portion of the Salsa20 expansion function from the spec. (No @@ -958,17 +1023,19 @@ really, the spec literally says to use the exact string `"expand 32-byte k"`—look it up!) The `Salsa20.cry` Cryptol file has an implementation of this portion of the expansion function, which is named `Salsa20_init`: -``` -$include 182-189 code/salsa20/Salsa20.cry -``` +:::{literalinclude} code/salsa20/Salsa20.cry +:lines: 182-189 +:language: cryptol +::: Note that we were careful to say a _portion_ of the Salsa20 expansion function. There is also a Cryptol implementation of the full expansion function, named `Salsa20_expansion`: -``` -$include 179-180 code/salsa20/Salsa20.cry -``` +:::{literalinclude} code/salsa20/Salsa20.cry +:lines: 179-180 +:language: cryptol +::: This calls `Salsa20_init` followed by `Salsa20`, the latter of which performs hashing. Importantly, `new_raw` does _not_ do any hashing on its own, just @@ -977,27 +1044,30 @@ implementation of `new_raw`, not `Salsa20_expansion`. Alright, time to write a SAW spec. The first part of the spec is straightforward: -``` -$include 97-106 code/salsa20/salsa20-new_raw-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-new_raw-fail1.saw +:lines: 97-106 +:language: sawscript +::: As is usually the case, the postconditions are the tricky part. We know that the behavior of `new_raw` will roughly coincide with the `Salsa20_init` function, so let's try that first: -``` -$include 108-112 code/salsa20/salsa20-new_raw-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-new_raw-fail1.saw +:lines: 108-112 +:language: sawscript +::: If we attempt to verify this using `mir_verify`: -``` -$include 115-118 code/salsa20/salsa20-new_raw-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-new_raw-fail1.saw +:lines: 115-118 +:language: sawscript +::: SAW complains thusly: -``` +:::{code-block} console Cryptol error: [error] at salsa20.saw:109:45--109:54: Type mismatch: @@ -1005,7 +1075,7 @@ Cryptol error: Inferred type: 8 Context: [ERROR] _ When checking type of 2nd tuple field -``` +::: Here, the 2nd tuple field is the `nonce_arr` in `Salsa20_init(key_arr, nonce_arr)`. And sure enough, `Salsa20_init` expects the 2nd tuple field to be @@ -1015,42 +1085,45 @@ the remaining 8 elements from? The answer to this question can be found by looking at the implementation of `new_raw` more closely. Let's start at this code: -``` rust -$include 35-36 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 35-36 +:language: rust +::: This will chunk up `iv` (the nonce) into two 4-byte chunks and copies them over to the elements of `state` array at indices `6` and `7`. This is immediately followed by two updates at indices `8` and `9`, which are updated to be `0`: -``` rust -$include 39-40 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 39-40 +:language: rust +::: If you take the two 4-bytes chunks of `iv` and put two 4-byte `0` values after them, then you would have a total of 16 bytes. This suggests that the nonce value that `Salsa20_init` expects is actually this: -``` +:::{code-block} cryptol nonce_arr # zero : [16][8] -``` +::: Where `zero : [8][8]` is a Cryptol expression that returns all zeroes, and `(#)` is the Cryptol operator for concatenating two sequences together. Let's update `new_raw_spec` to reflect this: -``` -$include 109-109 code/salsa20/salsa20-new_raw-fail2.saw -``` +:::{literalinclude} code/salsa20/salsa20-new_raw-fail2.saw +:lines: 109 +:language: sawscript +::: This is closer to what we want, but not quite. SAW still complains: -``` +:::{code-block} console could not match specified value with actual value: ... type of actual value: [u32; 16] type of specified value: [u8; 64] -``` +::: This is because `Salsa20_init` returns something of type `[64][8]`, which corresponds to the Rust type `[u8; 64]`. `self.state`, on the other hand, is of @@ -1058,9 +1131,10 @@ type `[u32; 16]`. These types are very close, as they both contain the same number of bytes, but they are chunked up differently. Recall the code that copies the nonce value over to `self.state`: -``` rust -$include 35-36 code/salsa20/src/core.rs -``` +:::{literalinclude} code/salsa20/src/core.rs +:lines: 35-36 +:language: rust +::: In order to resolve the type differences between `iv` and `state`, this code needed to explicitly convert `iv` to little-endian form using the @@ -1068,17 +1142,19 @@ needed to explicitly convert `iv` to little-endian form using the function. There is a similar Cryptol function in `Salsa20.cry` named `littleendian_state`: -``` -$include 131-132 code/salsa20/Salsa20.cry -``` +:::{literalinclude} code/salsa20/Salsa20.cry +:lines: 131-132 +:language: cryptol +::: Note that `[64][8]` is the Cryptol equivalent of `[u8; 64]`, and `[16][32]` is the Cryptol equivalent of `[u32; 16]`. As such, this is exactly the function that we need to resolve the differences in types: -``` -$include 109-109 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 109 +:language: sawscript +::: With that change, SAW is finally happy with `new_raw_spec` and successfully verifies it. @@ -1092,9 +1168,9 @@ converting `counter` to little-endian form). This means that if you invoke `0` values with the `counter` argument. In order words, it would be tantamount to initializing `state` like so: -``` +:::{code-block} cryptol littleendian_state (Salsa20_init(key, nonce # littleendian_inverse counter)) -``` +::: Where `littleendian_inverse` (a sibling of `littleendian_state`) converts a `[64]` value to a `[8][8]` one. This pattern is a curious one... @@ -1105,9 +1181,10 @@ Let's now return to the problem of linking `apply_keystream` up to `Salsa20_encrypt`. In particular, let's take a closer look at the definition of `Salsa20_encrypt` itself: -``` -$include 198-201 code/salsa20/Salsa20.cry -``` +:::{literalinclude} code/salsa20/Salsa20.cry +:lines: 198-201 +:language: cryptol +::: Does anything about this definition strike you as interesting? Take a look at the `v#(littleendian_inverse i)` part—we _just_ saw a use of @@ -1132,9 +1209,9 @@ invoke `Salsa20_expansion` once with a nonce value where the lower 32 bits are set to `0`. That is, it will perform encryption with an initial state derived from: -``` +:::{code-block} cryptol Salsa20_init(k, v#(littleendian_inverse zero)) -``` +::: Which can be further simplified to `Salsa20_init(k, v # zero)`. This is very nearly what we want, as this gives us the behavior of the Rust `new_raw` @@ -1148,9 +1225,10 @@ of `Salsa20_encrypt` in the same file named `Salsa20_encrypt_with_offset`, where the offset argument `o` serves the same role that `counter` does in `counter_setup`: -``` -$include 191-196 code/salsa20/Salsa20.cry -``` +:::{literalinclude} code/salsa20/Salsa20.cry +:lines: 191-196 +:language: cryptol +::: (Observe that `Salsa20_encrypt(count, k, v, m)` is equivalent to `Salsa20_encrypt_with_offset(count, k, v, 0, m)`.) @@ -1161,9 +1239,10 @@ behavior of `apply_keystream` corresponds exactly to that of `Salsa20_encrypt_with_offset`. This insight will inform us how to write an alternative SAW spec for `apply_keystream`: -``` -$include 149-160 code/salsa20/salsa20-apply_keystream_alt-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-apply_keystream_alt-fail1.saw +:lines: 149-160 +:language: sawscript +::: Observe the following differences between `apply_keystream_alt_spec` and our earlier `apply_keystream_spec`: @@ -1179,30 +1258,33 @@ earlier `apply_keystream_spec`: The parts of the spec relating to `output` remain unchanged: -``` -$include 162-167 code/salsa20/salsa20-apply_keystream_alt-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-apply_keystream_alt-fail1.saw +:lines: 162-167 +:language: sawscript +::: The postconditions are slightly different in `apply_keystream_alt_spec`. While the parts relating to `self_ref` remain unchanged, we now have `output_ref` point to the results of calling `Salsa20_encrypt_with_offset`: -``` -$include 169-172 code/salsa20/salsa20-apply_keystream_alt-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-apply_keystream_alt-fail1.saw +:lines: 169-172 +:language: sawscript +::: Tying this all together, we call `mir_verify`, making sure to use compositional overrides involving `counter_setup` and `rounds`: -``` -$include 175-178 code/salsa20/salsa20-apply_keystream_alt-fail1.saw -``` +:::{literalinclude} code/salsa20/salsa20-apply_keystream_alt-fail1.saw +:lines: 175-178 +:language: sawscript +::: At long last, it is time to run SAW on this. When we do, we see this: -``` +:::{code-block} console [15:11:44.576] Checking proof obligations salsa20/10e438b3::core#1[0]::{impl#0}[0]::apply_keystream[0]::_inst6e4a2d7250998ef7[0] ... -``` +::: After this, SAW loops forever. Oh no! While somewhat disheartening, this is a reality of SMT-based verification that we must content with. SMT solvers are @@ -1231,16 +1313,17 @@ Yices (a different SMT solver) _can_ spot the patterns needed to prove both Z3 and Yices. In order to switch from Z3 to Yices, swap out the `z3` proof script with `yices`: -``` -$include 175-178 code/salsa20/salsa20-reference.saw -``` +:::{literalinclude} code/salsa20/salsa20-reference.saw +:lines: 175-178 +:language: sawscript +::: After doing this, SAW is leverage Yices to solve the proof goals almost immediately: -``` +:::{code-block} console [15:22:00.745] Proof succeeded! salsa20/10e438b3::core#1[0]::{impl#0}[0]::apply_keystream[0]::_instfa33e77d840484a0[0] -``` +::: And with that, we're finally done! You've successfully completed a non-trivial SAW exercise in writing some interesting proofs. Give yourself a well-deserved diff --git a/doc/rust-tutorial/compound-data-types.md b/doc/rust-tutorial/compound-data-types.md index a0f8618593..54400228f6 100644 --- a/doc/rust-tutorial/compound-data-types.md +++ b/doc/rust-tutorial/compound-data-types.md @@ -10,9 +10,10 @@ Rust includes array types where the length of the array is known ahead of time. For instance, this `index` function takes an `arr` argument that must contain exactly three `u32` values: -``` rust -$include 1-3 code/arrays.rs -``` +:::{literalinclude} code/arrays.rs +:lines: 1-3 +:language: rust +::: While Rust is good at catching many classes of programmer errors at compile time, one thing that it cannot catch in general is out-of-bounds array @@ -23,9 +24,10 @@ program to crash, since the `idx` will be out of the bounds of `arr`. SAW is suited to checking for these sorts of out-of-bound accesses. Let's write an incorrect spec for `index` to illustrate this: -``` -$include 3-14 code/arrays-fail.saw -``` +:::{literalinclude} code/arrays-fail.saw +:lines: 3-14 +:language: sawscript +::: Before we run this with SAW, let's highlight some of the new concepts that this spec uses: @@ -41,7 +43,7 @@ spec uses: As we hinted above, this spec is wrong, as it says that this should work for _any_ possible values of `idx`. SAW will catch this mistake: -``` +:::{code-block} console $ saw arrays-fail.saw @@ -57,29 +59,31 @@ $ saw arrays-fail.saw [21:03:05.445] Stack trace: "mir_verify" (arrays-fail.saw:14:1-14:11) Proof failed. -``` +::: We can repair this spec by adding some preconditions: -``` -$include 3-12 code/arrays.saw -``` +:::{literalinclude} code/arrays.saw +:lines: 3-12 +:language: sawscript +::: An alternative way of writing this spec is by using SAW's `mir_array_value` command: -``` +:::{code-block} console sawscript> :type mir_array_value MIRType -> [MIRValue] -> MIRValue -``` +::: Here, the `MIRType` argument represents the element type, and the list of `MIRValue` arguments are the element values of the array. We can rewrite `index_spec` using `mir_array_value` like so: -``` -$include 18-30 code/arrays.saw -``` +:::{literalinclude} code/arrays.saw +:lines: 18-30 +:language: sawscript +::: Here, `[arr0, arr1, arr2]` is Cryptol notation for constructing a length-3 sequence consisting of `arr0`, `arr1`, and `arr2` as the elements. @@ -91,9 +95,10 @@ and combining them with `mir_array_value`. There are some situations where `mir_array_value` is the only viable choice, however. Consider this variant of the `index` function: -``` rust -$include 5-7 code/arrays.rs -``` +:::{literalinclude} code/arrays.rs +:lines: 5-7 +:language: rust +::: When writing a SAW spec for `index_ref_arr`, we can't just create a symbolic variable for `arr` using `mir_alloc (mir_array 3 ...)`, as the reference values @@ -107,26 +112,28 @@ verifying a spec for `index_ref_arr`). Rust includes tuple types where the elements of the tuple can be of different types. For example: -``` rust -$include 1-3 code/tuples.rs -``` +:::{literalinclude} code/tuples.rs +:lines: 1-3 +:language: rust +::: SAW includes a `mir_tuple` function for specifying the type of a tuple value. In addition, one can embed MIR tuples into Cryptol, as Cryptol also includes tuple types whose fields can be indexed with `.0`, `.1`, etc. Here is a spec for `flip` that makes use of all these features: -``` -$include 3-9 code/tuples.saw -``` +:::{literalinclude} code/tuples.saw +:lines: 3-9 +:language: sawscript +::: SAW also includes a `mir_tuple_value` function for constructing a tuple value from other `MIRValue`s: -``` +:::{code-block} console sawscript> :type mir_tuple_value [MIRValue] -> MIRValue -``` +::: `mir_tuple_value` plays a similar role for tuples as `mir_array_value` does for arrays. @@ -136,9 +143,10 @@ arrays. Rust supports the ability for users to define custom struct types. Structs are uniquely identified by their names, so if you have two structs like these: -``` rust -$include 1-2 code/structs.rs -``` +:::{literalinclude} code/structs.rs +:lines: 1-2 +:language: rust +::: Then even though the fields of the `S` and `T` structs are the same, they are _not_ the same struct. This is a type system feature that Cryptol does not @@ -146,10 +154,10 @@ have, and for this reason, it is not possible to embed MIR struct values into Cryptol. It is also not possible to use `mir_fresh_var` to create a symbolic struct value. Instead, one can use the `mir_struct_value` command: -``` +:::{code-block} console sawscript> :type mir_struct_value MIRAdt -> [MIRValue] -> MIRValue -``` +::: Like with `mir_array_value` and `mir_tuple_value`, the `mir_struct_value` function takes a list of `MIRValue`s as arguments. What makes @@ -164,10 +172,10 @@ the MIR JSON file in which they are defined. Looking up these identifiers can be somewhat error-prone, so SAW offers a `mir_find_adt` command that computes an ADT's identifier and returns the `MIRAdt` associated with it: -``` +:::{code-block} console sawscript> :type mir_find_adt MIRModule -> String -> [MIRType] -> MIRAdt -``` +::: Here, `MIRModule` correspond to the MIR JSON file containing the ADT definition, and the `String` is the name of the ADT whose identifier we want to @@ -176,34 +184,38 @@ parameters to the struct (more on this in a bit). As an example, we can look up the `S` and `T` structs from above like so: -``` -$include 3-6 code/structs.saw -``` +:::{literalinclude} code/structs.saw +:lines: 3-6 +:language: sawscript +::: We pass an empty list of `MIRType`s to each use of `mir_find_adt`, as neither `S` nor `T` have any type parameters. An example of a struct that does include type parameters can be seen here: -``` rust -$include 12-12 code/structs.rs -``` +:::{literalinclude} code/structs.rs +:lines: 12 +:language: rust +::: As mentioned before, SAW doesn't support generic definitions out of the box, so the only way that we can make use of the `Foo` struct is by looking up a particular instantiation of `Foo`'s type parameters. If we define a function like this, for example: -``` rust -$include 14-16 code/structs.rs -``` +:::{literalinclude} code/structs.rs +:lines: 14-16 +:language: rust +::: Then this function instantiates `Foo`'s `A` type parameter with `u32` and the `B` type parameter with `u64`. We can use `mir_find_adt` to look up this particular instantiation of `Foo` like so: -``` -$include 7-7 code/structs.saw -``` +:::{literalinclude} code/structs.saw +:lines: 7 +:language: sawscript +::: In general, a MIR JSON file can have many separate instantiations of a single struct's type parameters, and each instantiation must be looked up separately @@ -212,9 +224,10 @@ using `mir_find_adt`. Having looked up `Foo` using `mir_find_adt`, let's use the resulting `MIRAdt` in a spec: -``` -$include 9-18 code/structs.saw -``` +:::{literalinclude} code/structs.saw +:lines: 9-18 +:language: sawscript +::: Note that we are directly writing out the values `27` and `42` in Cryptol. Cryptol's numeric literals can take on many different types, so in order to @@ -226,17 +239,19 @@ explicit type annotation. For instance, the expression `27 : [32]` means that Let's now verify a function that takes a struct value as an argument: -``` rust -$include 18-22 code/structs.rs -``` +:::{literalinclude} code/structs.rs +:lines: 18-22 +:language: rust +::: Moreover, let's verify this function for all possible `Bar` values. One way to do this is to write a SAW spec that constructs a struct value whose fields are themselves symbolic: -``` -$include 20-38 code/structs.saw -``` +:::{literalinclude} code/structs.saw +:lines: 20-38 +:language: sawscript +::: This is a rather tedious process, however, as we had to repeatedly use `mir_fresh_var` to create a fresh, symbolic value for each field. Moreover, @@ -254,9 +269,10 @@ recursively for struct fields, such as the `Foo` field in `Bar`. As an example, a much shorter way to write the spec above using `mir_fresh_expanded_value` is: -``` -$include 42-48 code/structs.saw -``` +:::{literalinclude} code/structs.saw +:lines: 42-48 +:language: sawscript +::: That's it! Note that the string `"b"` is used as a prefix for all fresh names that `mir_fresh_expanded_value` generates, so if SAW produces a counterexample @@ -276,12 +292,12 @@ has a number of different _variants_ that describe the different ways that an enum value can look like. A famous example of a Rust enum is the `Option` type, which is defined by the standard library like so: -``` rust +:::{code-block} rust enum Option { None, Some(T), } -``` +::: `Option` is commonly used in Rust code to represent a value that may be present (`Some`) or absent (`None`). For this reason, we will use `Option` as our @@ -290,19 +306,20 @@ motivating example of an enum in this section. First, let's start by defining some functions that make use of `Option`'s variants: -``` rust -$include 1-7 code/enums.rs -``` +:::{literalinclude} code/enums.rs +:lines: 1-7 +:language: rust +::: Both functions return an `Option` value, but each function returns a different variant. In order to tell these variants apart, we need a SAW function which can construct an enum value that allows the user to pick which variant they want to construct. The `mir_enum_value function does exactly that: -``` +:::{code-block} console sawscript> :type mir_enum_value MIRAdt -> String -> [MIRValue] -> MIRValue -``` +::: Like `mir_struct_value`, `mir_enum_value` also requires a `MIRAdt` argument in order to discern which particular enum you want. Unlike `mir_struct_value`, @@ -313,16 +330,18 @@ the `[MIRValue]` arguments represent the fields of the enum variant. Let's now verify some enum-related code with SAW. First, we must look up the `Option` ADT, which works just as if you had a struct type: -``` -$include 5-5 code/enums.saw -``` +:::{literalinclude} code/enums.saw +:lines: 5 +:language: sawscript +::: Next, we can use this ADT to construct enum values. We shall use `mir_enum_value` to create a `Some` value in the spec for `i_found_something`: -``` -$include 7-16 code/enums.saw -``` +:::{literalinclude} code/enums.saw +:lines: 7-16 +:language: sawscript +::: Note that while we used the full identifier `core::option::Option` to look up the `Option` ADT, we do not need to use the `core::option` prefix when @@ -332,9 +351,10 @@ prefix should be from the `option_u32` ADT, so the `"Some"` shorthand suffices. Similarly, we can also write a spec for `i_got_nothing`, which uses the `None` variant: -``` -$include 18-25 code/enums.saw -``` +:::{literalinclude} code/enums.saw +:lines: 18-25 +:language: sawscript +::: ### Symbolic enums @@ -348,16 +368,18 @@ Just as `mir_fresh_expanded_value` supports creating symbolic structs, example, given this function that accepts an `Option` value as an argument: -``` rust -$include 9-11 code/enums.rs -``` +:::{literalinclude} code/enums.rs +:lines: 9-11 +:language: rust +::: We can write a spec for this function that considers all possible `Option` values like so: -``` -$include 27-33 code/enums.saw -``` +:::{literalinclude} code/enums.saw +:lines: 27-33 +:language: sawscript +::: Here, `o` can be a `None` value, or it can be a `Some` value with a symbolic field. @@ -370,9 +392,10 @@ references (e.g., `&u32`), SAW does not permit allocating a slice directly. Instead, one must take a slice of an existing reference. To better illustrate this distinction, consider this function: -``` rust -$include 1-3 code/slices.rs -``` +:::{literalinclude} code/slices.rs +:lines: 1-3 +:language: rust +::: `sum_of_prefix` takes a slice to a sequence of `u32`s as an argument, indexes into the first two elements in the sequence, and adds them together. There are @@ -380,22 +403,25 @@ many possible ways we can write a spec for this function, as the slice argument may be backed by many different sequences. For example, the slice might be backed by an array whose length is exactly two: -``` rust -$include 6-8 code/slices.rs -``` +:::{literalinclude} code/slices.rs +:lines: 6-8 +:language: rust +::: We could also make a slice whose length is longer than two: -``` rust -$include 10-12 code/slices.rs -``` +:::{literalinclude} code/slices.rs +:lines: 10-12 +:language: rust +::: Alternatively, the slice might be a subset of an array whose length is longer than two: -``` rust -$include 14-16 code/slices.rs -``` +:::{literalinclude} code/slices.rs +:lines: 14-16 +:language: rust +::: All of these are valid ways of building the slice argument to `sum_of_prefix`. Let's try to write SAW specifications that construct these different forms of @@ -403,10 +429,10 @@ slices. To do so, we will need SAW functions that take a reference to a collection (e.g., an array) and converts them into a slice reference. The `mir_slice_value` function is one such function: -``` +:::{code-block} console sawscript> :type mir_slice_value MIRValue -> MIRValue -``` +::: `mir_slice_value arr_ref` is the SAW equivalent of writing `arr_ref[..]`. That is, if `arr_ref` is of type `&[T; N]`, then `mir_slice_value arr_ref` is of @@ -416,9 +442,10 @@ array itself. Let's use `mir_slice_value` to write a spec for `sum_of_prefix` when the slice argument is backed by an array of length two: -``` -$include 5-15 code/slices.saw -``` +:::{literalinclude} code/slices.saw +:lines: 5-15 +:language: sawscript +::: The first part of this spec allocates an array reference `a_ref` and declares that it points to a fresh array value `a_val`. The next part declares a slice @@ -431,9 +458,10 @@ As noted above, the `sum_of_prefix` function can work with slices of many different lengths. Here is a slight modification to this spec that declares it to take a slice of length 5 rather than a slice of length 2: -``` -$include 19-29 code/slices.saw -``` +:::{literalinclude} code/slices.saw +:lines: 19-29 +:language: sawscript +::: Both of these examples declare a slice whose length matches the length of the underlying array. In general, there is no reason that these have to be the @@ -442,10 +470,10 @@ length of the underlying array. In Rust, for example, we can write a slice of a subset of an array by writing `&arr_ref[0..2]`. The SAW equivalent of this can be achieved with the `mir_slice_range_value` function: -``` +:::{code-block} console sawscript> :type mir_slice_range_value MIRValue -> Int -> Int -> MIRValue -``` +::: `mir_slice_range_value` takes takes two additional `Int` arguments that represent (1) the index to start the slice from, and (2) the index at which the @@ -457,9 +485,10 @@ does _not_ include the third element (index `2`). For example, here is how to write a spec for `sum_of_prefix` where the slice is a length-2 subset of the original array: -``` -$include 33-43 code/slices.saw -``` +:::{literalinclude} code/slices.saw +:lines: 33-43 +:language: sawscript +::: Note that both `Int` arguments to `mir_slice_range_value` must be concrete (i.e., not symbolic). (See the section below if you want an explanation for why diff --git a/doc/rust-tutorial/docode.hs b/doc/rust-tutorial/docode.hs deleted file mode 100644 index 550c9fec15..0000000000 --- a/doc/rust-tutorial/docode.hs +++ /dev/null @@ -1,30 +0,0 @@ -module Main where - -import Control.Monad -import System.Process - -interactIO :: (String -> IO String) -> IO () -interactIO act = do - txt <- getContents - mapM_ (act >=> putStr) (lines txt) - --- TODO: this does no error handling whatsoever -processCommand :: String -> IO String -processCommand line = - case words line of - ("$cmd":cmd:args) -> do - result <- readProcess cmd args "" - return $ unlines [ unwords ("#" : cmd : args) ] ++ result - ["$include", "all", file] -> readFile file - ["$include", range, file] -> - do txt <- readFile file - return . unlines . take (endN - startN) $ drop startN (lines txt) - where - (start, end') = break (== '-') range - end = tail end' - startN = read start - 1 - endN = read end - _ -> return (line ++ "\n") - -main :: IO () -main = interactIO processCommand diff --git a/doc/rust-tutorial/overrides-and-compositional-verification.md b/doc/rust-tutorial/overrides-and-compositional-verification.md index 9fff3bd848..eff49c4f25 100644 --- a/doc/rust-tutorial/overrides-and-compositional-verification.md +++ b/doc/rust-tutorial/overrides-and-compositional-verification.md @@ -7,9 +7,10 @@ callee function and verify its behavior alongside the behavior of the callee function. This is a fine thing to do, but it can be inefficient. For example, consider a function like this: -``` rust -$include 5-9 code/overrides.rs -``` +:::{literalinclude} code/overrides.rs +:lines: 5-9 +:language: rust +::: Here, the caller function `f` invokes the callee function `g` three separate times. If we verify `f` with `mir_verify` as we have done up until this point, @@ -28,10 +29,10 @@ As it turns out, the command needed to produce an override specification is already familiar to us—it's `mir_verify`! If you examine the type of this command: -``` +:::{code-block} console sawscript> :type mir_verify MIRModule -> String -> [MIRSpec] -> Bool -> MIRSetup () -> ProofScript () -> TopLevel MIRSpec -``` +::: The returned value is a `MIRSpec`, which captures the behavior of the function that was verified as an override spec. This override can then be passed to @@ -41,9 +42,10 @@ Let's now try compositional verification in practice. To do so, we will first prove a spec for the `g` function above. For demonstration purposes, we will pick a simplistic implementation of `g`: -``` rust -$include 1-3 code/overrides.rs -``` +:::{literalinclude} code/overrides.rs +:lines: 1-3 +:language: rust +::: Note that we don't really _have_ to use compositional verification when `g` is this simple, as SAW is capable of reasoning about `g`'s behavior directly when @@ -54,9 +56,10 @@ implementation of `g` is small or large. The first step of compositional verification is to prove a spec for `g`, the callee function: -``` -$include 5-13 code/overrides.saw -``` +:::{literalinclude} code/overrides.saw +:lines: 5-13 +:language: sawscript +::: There's nothing that different about this particular proof from the proofs we've seen before. The only notable difference is that we bind the result of @@ -66,16 +69,18 @@ override"). This part is important, as we will need to use `g_ov` shortly. The next step is to write a spec for `f`. Since `g` adds `1` to its argument, `f` will add `3` to its argument: -``` -$include 15-21 code/overrides.saw -``` +:::{literalinclude} code/overrides.saw +:lines: 15-21 +:language: sawscript +::: Again, nothing too surprising. Now let's prove `f` against `f_spec` by using `g_ov` as a compositional override: -``` -$include 23-23 code/overrides.saw -``` +:::{literalinclude} code/overrides.saw +:lines: 23 +:language: sawscript +::: Here, note that instead of passing an empty list (`[]`) as we have done before, we now pass a list containing `g_ov`. This informs `mir_verify` that whenever @@ -86,7 +91,7 @@ this later in the tutorial), but for now, one override will suffice. Let's run the proof of `f` against `f_spec`, making sure to pay attention to the output of SAW: -``` +:::{code-block} console [19:06:17.392] Verifying overrides/96c5af24::f[0] ... [19:06:17.406] Simulating overrides/96c5af24::f[0] ... [19:06:17.407] Matching 1 overrides of overrides/96c5af24::g[0] ... @@ -100,7 +105,7 @@ the output of SAW: [19:06:17.407] Applied override! overrides/96c5af24::g[0] [19:06:17.407] Checking proof obligations overrides/96c5af24::f[0] ... [19:06:17.422] Proof succeeded! overrides/96c5af24::f[0] -``` +::: We've now proven `f` compositionally! The first two lines ("`Verifying ...`" and "`Simulating ...`") and the last two lines ("`Checking proof obligations @@ -130,27 +135,29 @@ function being overridden. For example, let's suppose that we wrote different `g` specs, one where the argument to `g` is even, and another where the argument to `g` is odd: -``` -$include 25-44 code/overrides.saw -``` +:::{literalinclude} code/overrides.saw +:lines: 25-44 +:language: sawscript +::: We can then prove `f` compositionally by passing both of the `g` overrides to `mir_verify`: -``` -$include 45-45 code/overrides.saw -``` +:::{literalinclude} code/overrides.saw +:lines: 45 +:language: sawscript +::: Like before, this will successfully verify. The only different now is that SAW will print output involving two overrides instead of just one: -``` +:::{code-block} console [20:48:07.649] Simulating overrides/96c5af24::f[0] ... [20:48:07.650] Matching 2 overrides of overrides/96c5af24::g[0] ... [20:48:07.650] Branching on 2 override variants of overrides/96c5af24::g[0] ... [20:48:07.652] Applied override! overrides/96c5af24::g[0] ... -``` +::: Keep in mind that if you provide at least one override for a function as part of a compositional verification, then SAW _must_ apply an override whenever it @@ -158,15 +165,16 @@ invokes that function during simulation. If SAW cannot find a matching override, then the verification will fail. For instance, consider what would happen if you tried proving `f` like so: -``` -$include 33-33 code/overrides-fail.saw -``` +:::{literalinclude} code/overrides-fail.saw +:lines: 33 +:language: sawscript +::: This time, we supply one override for `g` that only matches when the argument is even. This is a problem, as SAW will not be able to find a matching override when the argument is odd. Indeed, SAW will fail to verify this: -``` +:::{code-block} console [20:53:29.588] Verifying overrides/96c5af24::f[0] ... [20:53:29.602] Simulating overrides/96c5af24::f[0] ... [20:53:29.602] Matching 1 overrides of overrides/96c5af24::g[0] ... @@ -189,7 +197,7 @@ Run SAW with --sim-verbose=3 to see a description of each override. [20:53:29.624] x: 1 ... Proof failed. -``` +::: Here, we can see that `No override specification applies`, and SAW also generates a counterexample of `x: 1`. Sure enough, `1` is an odd number! @@ -206,9 +214,10 @@ mutable reference, it could potentially lead to incorrect proofs. This is the sort of thing that is best explained with an example, so consider these two functions: -``` rust -$include 1-9 code/overrides-mut.rs -``` +:::{literalinclude} code/overrides-mut.rs +:lines: 1-9 +:language: rust +::: The `side_effect` function does not return anything interesting; it is only ever invoked to perform a side effect of changing the mutable reference `a` to @@ -219,9 +228,10 @@ surprises just yet. Now let's make a first attempt at verifying `foo` using compositional verification. First, we will write a spec for `side_effect`: -``` -$include 5-10 code/overrides-mut-fail.saw -``` +:::{literalinclude} code/overrides-mut-fail.saw +:lines: 5-10 +:language: sawscript +::: `side_effect_spec` is somewhat odd. Although it goes through the effort of allocating a mutable reference `a_ref` and initializing it, nothing about this @@ -230,24 +240,27 @@ This omission is strange, but not outright wrong—the spec just underspecifies what the behavior of the function is. Indeed, SAW will successfully verify this spec using `mir_verify`: -``` -$include 18-18 code/overrides-mut-fail.saw -``` +:::{literalinclude} code/overrides-mut-fail.saw +:lines: 18 +:language: sawscript +::: Next, let's try to write a spec for `foo`: -``` -$include 12-16 code/overrides-mut-fail.saw -``` +:::{literalinclude} code/overrides-mut-fail.saw +:lines: 12-16 +:language: sawscript +::: At this point, alarm bells should be going off in your head. This spec incorrectly states that `foo(x)` should return `x`, but it should actually return `0`! This looks wrong, but consider what would happen if you tried to verify this compositionally using our `side_effect_ov` override: -``` -$include 19-19 code/overrides-mut-fail.saw -``` +:::{literalinclude} code/overrides-mut-fail.saw +:lines: 19 +:language: sawscript +::: If SAW were to simulate `foo(x)`, it would invoke create a temporary variable `b` and assign it to the value `x`, and then it would invoke `side_effect(&mut @@ -261,21 +274,22 @@ Now that we've made you sweat a little bit, it's time for some good news: SAW won't _actually_ let you prove `foo_spec`. If you try this compositional proof in practice, SAW will catch your mistake: -``` +:::{code-block} console [14:50:29.170] Verifying overrides_mut/11e47708::foo[0] ... [14:50:29.181] Simulating overrides_mut/11e47708::foo[0] ... [14:50:29.181] Matching 1 overrides of overrides_mut/11e47708::side_effect[0] ... [14:50:29.181] Branching on 1 override variants of overrides_mut/11e47708::side_effect[0] ... ... State of memory allocated in precondition (at overrides-mut-fail.saw:6:12) not described in postcondition -``` +::: The line of code that SAW points to in the "`State of memory ...`" error message is: -``` -$include 6-6 code/overrides-mut-fail.saw -``` +:::{literalinclude} code/overrides-mut-fail.saw +:lines: 6 +:language: sawscript +::: SAW informs us that although we allocated the mutable reference `a_ref`, we never indicated what it should point to after the function has returned. This @@ -289,15 +303,17 @@ exceptions. Thankfully, repairing this spec is relatively straightforward. Simply add a `mir_points_to` statement in the postconditions of `side_effect_spec`: -``` -$include 5-13 code/overrides-mut.saw -``` +:::{literalinclude} code/overrides-mut.saw +:lines: 5-13 +:language: sawscript +::: Then use the correct return value in `foo_spec`: -``` -$include 15-21 code/overrides-mut.saw -``` +:::{literalinclude} code/overrides-mut.saw +:lines: 15-21 +:language: sawscript +::: And now the compositional proof of `foo_spec` works! @@ -310,10 +326,10 @@ from a formal verification tool. In certain circumstances, however, it can be useful to say "I know what I'm doing, SAW—just believe me when I say this spec is valid!" In order to say this, you can use `mir_unsafe_assume_spec`: -``` +:::{code-block} console sawscript> :type mir_unsafe_assume_spec MIRModule -> String -> MIRSetup () -> TopLevel MIRSpec -``` +::: `mir_unsafe_assume_spec` is `mir_verify`'s cousin who likes to live a little more dangerously. Unlike `mir_verify`, the specification that you pass to @@ -341,9 +357,10 @@ later, but it can be nice to try something else first. For example, here is how one can unsafely assume `g_spec` and use it in a compositional proof of `f_spec`: -``` -$include 21-22 code/overrides-unsafe.saw -``` +:::{literalinclude} code/overrides-unsafe.saw +:lines: 21-22 +:language: sawscript +::: It should be emphasized that when we say "`unsafe`", we really mean it. `mir_unsafe_assume_spec` can be used to prove specs that are blatantly wrong, diff --git a/doc/rust-tutorial/reference-types.md b/doc/rust-tutorial/reference-types.md index 764972e6cc..fd2b0e5a21 100644 --- a/doc/rust-tutorial/reference-types.md +++ b/doc/rust-tutorial/reference-types.md @@ -5,9 +5,10 @@ such as `u8` and `u32`. While these are useful, Rust's type system features much more than just integers. A key part of Rust's type system are its reference types. For example, in this `read_ref` function: -``` rust -$include 1-3 code/ref-basics.rs -``` +:::{literalinclude} code/ref-basics.rs +:lines: 1-3 +:language: rust +::: The function reads the value that `r` (of type `&u32`) points to and returns it. Writing SAW specifications involving references is somewhat trickier than @@ -15,10 +16,10 @@ with other types of values because we must also specify what memory the reference points to. SAW provides a special command for doing this called `mir_alloc`: -``` +:::{code-block} console sawscript> :type mir_alloc MIRType -> MIRSetup MIRValue -``` +::: `mir_alloc` will allocate a reference value with enough space to hold a value of the given `MIRType`. Unlike `mir_fresh_var`, `mir_alloc` returns a @@ -30,9 +31,10 @@ embed the result of a call to `mir_alloc` in a Cryptol expression. `mir_alloc` must be used with some care. Here is a first, not-quite-correct attempt at writing a spec for `read_ref` using `mir_alloc`: -``` -$include 3-11 code/ref-basics-fail.saw -``` +:::{literalinclude} code/ref-basics-fail.saw +:lines: 3-11 +:language: sawscript +::: As the comment suggests, it's not entirely clear what this spec should return. We can't return `r`, since `read_ref` returns something of type `u32`, not @@ -41,7 +43,7 @@ that are obviously the right thing to use here. Nevertheless, it's not required for a SAW spec to include a `mir_return` statement, so let's see what happens if we verify this as-is: -``` +:::{code-block} console $ saw ref-basics-fail.saw @@ -55,7 +57,7 @@ Symbolic execution failed. Abort due to assertion failure: ref-basics.rs:2:5: 2:7: error: in ref_basics/54ae7b63::read_ref[0] attempted to read empty mux tree -``` +::: Clearly, SAW didn't like what we gave it. The reason this happens is although we allocated memory for the reference `r`, we never told SAW what value should @@ -67,19 +69,20 @@ business is about. SAW provides a `mir_points_to` command to declare what value a reference should point to: -``` +:::{code-block} console sawscript> :type mir_points_to MIRValue -> MIRValue -> MIRSetup () -``` +::: Here, the first `MIRValue` argument represents a reference value, and the second `MIRValue` argument represents the value that the reference should point to. In our spec for `read_ref`, we can declare that the reference should point to a symbolic `u32` value like so: -``` -$include 3-9 code/ref-basics.saw -``` +:::{literalinclude} code/ref-basics.saw +:lines: 3-9 +:language: sawscript +::: We have renamed `r` to `r_ref` in this revised spec to more easily distinguish it from `r_val`, which is the value that `r_ref` is declared to point to using @@ -97,15 +100,17 @@ the function is not allowed to modify the memory that the argument points to. Rust also features mutable references that do permit modifying the underlying memory, as seen in this `swap` function: -``` rust -$include 5-11 code/ref-basics.rs -``` +:::{literalinclude} code/ref-basics.rs +:lines: 5-11 +:language: rust +::: A corresponding spec for `swap` is: -``` -$include 15-28 code/ref-basics.saw -``` +:::{literalinclude} code/ref-basics.saw +:lines: 15-28 +:language: sawscript +::: There are two interesting things worth calling out in this spec: diff --git a/doc/rust-tutorial/saw-basics.md b/doc/rust-tutorial/saw-basics.md index b75d049576..69ce374c55 100644 --- a/doc/rust-tutorial/saw-basics.md +++ b/doc/rust-tutorial/saw-basics.md @@ -7,9 +7,9 @@ suitable for SAW. Let's put our skills to the test and verify something! We will build on the example from above, which we will put into a file named `saw-basics.rs`: -``` rust -$include all code/saw-basics.rs -``` +:::{literalinclude} code/saw-basics.rs +:language: rust +::: Our goal is to verify the correctness of the `id_u8` function. However, it is meaningless to talk about whether a function is correct without having a @@ -19,9 +19,10 @@ you to write a precise specification for describing a function's behavior. For example, here is a specification that captures the intended behavior of `id_u8`: -``` -$include 3-7 code/saw-basics.saw -``` +:::{literalinclude} code/saw-basics.saw +:lines: 3-7 +:language: sawscript +::: At a high level, this specification says that `id_u8` is a function that accepts a single argument of type `u8`, and it returns its argument unchanged. Nothing @@ -57,17 +58,19 @@ Now that we have a specification in hand, it's time to prove that `id_u8` actually adheres to the spec. To do so, we need to load the MIR JSON version of `id_u8` into SAW, which is done with the `mir_load_module` command: -``` -$include 9-9 code/saw-basics.saw -``` +:::{literalinclude} code/saw-basics.saw +:lines: 9 +:language: sawscript +::: This `m` variable contains the definition of `id_u8`, as well as the other code defined in the program. We can then pass `m` to the `mir_verify` command, which actually verifies that `id_u8` behaves according to `id_u8_spec`: -``` -$include 11-11 code/saw-basics.saw -``` +:::{literalinclude} code/saw-basics.saw +:lines: 11 +:language: sawscript +::: Here is what is going on in this command: @@ -90,9 +93,9 @@ Here is what is going on in this command: Putting this all together, our complete `saw-basics.saw` file is: -``` -$include all code/saw-basics.saw -``` +:::{literalinclude} code/saw-basics.saw +:language: sawscript +::: One minor detail that we left out until just now is that the SAW's interface to MIR is still experimental, so you must explicitly opt into it with the @@ -100,7 +103,7 @@ MIR is still experimental, so you must explicitly opt into it with the Now that everything is in place, we can check this proof like so: -``` +:::{code-block} console $ saw saw-basics.saw @@ -110,7 +113,7 @@ $ saw saw-basics.saw [16:14:07.017] Simulating saw_basics/f77ebf43::id_u8[0] ... [16:14:07.017] Checking proof obligations saw_basics/f77ebf43::id_u8[0] ... [16:14:07.017] Proof succeeded! saw_basics/f77ebf43::id_u8[0] -``` +::: Tada! SAW was successfully able to prove that `id_u8` adheres to its spec. @@ -124,9 +127,10 @@ not always so clear. For example, consider this function, which multiplies a number by two: -``` rust -$include 1-3 code/times-two.rs -``` +:::{literalinclude} code/times-two.rs +:lines: 1-3 +:language: rust +::: The straightforward way to implement this function would be to return `2 * x`, but the author of this function _really_ cared about performance. As such, the @@ -137,9 +141,10 @@ but it would be nice for SAW to check this. Let's write a specification for the `times_two` function: -``` -$include 3-7 code/times-two.saw -``` +:::{literalinclude} code/times-two.saw +:lines: 3-7 +:language: sawscript +::: This spec introduces code delimited by double curly braces `{{ ... }}`, which is a piece of syntax that we haven't seen before. The code in between the curly @@ -160,13 +165,14 @@ the function against a spec that is as simple and readable as possible. Our full SAW file is: -``` -$include 1-11 code/times-two.saw -``` +:::{literalinclude} code/times-two.saw +:lines: 1-11 +:language: sawscript +::: Which we can verify is correct like so: -``` +:::{code-block} console $ saw times-two.saw @@ -176,7 +182,7 @@ $ saw times-two.saw [17:51:35.512] Simulating times_two/6f4e41af::times_two[0] ... [17:51:35.513] Checking proof obligations times_two/6f4e41af::times_two[0] ... [17:51:35.527] Proof succeeded! times_two/6f4e41af::times_two[0] -``` +::: Nice! Even though the `times_two` function does not literally return `2 * x`, SAW is able to confirm that the function behaves as if it were implemented that @@ -189,18 +195,18 @@ what the `mir_term` function does. It is helpful to examine the type of `mir_term` by using SAW's interactive mode. To do so, run the `saw` binary without any other arguments: -``` +:::{code-block} console $ saw -``` +::: Then run `enable_experimental` (to enable MIR-related commands) and run `:type mir_term`: -``` +:::{code-block} console sawscript> enable_experimental sawscript> :type mir_term Term -> MIRValue -``` +::: Here, we see that `mir_term` accepts a `Term` as an argument and returns a `MIRValue`. In this context, the `Term` type represents a Cryptol value, and @@ -211,12 +217,12 @@ of as a subset of `MIRValue`s, and the `mir_term` function is used to promote a Most other MIR-related commands work over `MIRValue`s, as can be seen with SAW's `:type` command: -``` +:::{code-block} console sawscript> :type mir_execute_func [MIRValue] -> MIRSetup () sawscript> :type mir_return MIRValue -> MIRSetup () -``` +::: Note that `MIRSetup` is the type of statements in a MIR specification, and two `MIRSetup`-typed commands can be chained together by using `do`-notation. @@ -225,10 +231,10 @@ interesting, and the use of `()` here is very much analogous to how `()` is used in Rust. There are other `MIRSetup`-typed commands that _do_ return something interesting, as is the case with `mir_fresh_var`: -``` +:::{code-block} console sawscript> :type mir_fresh_var String -> MIRType -> MIRSetup Term -``` +::: This command returns a `MIRSetup Term`, which means that when you write `x <- mir_fresh_var ... ...` in a MIR specification, then `x` will be bound at type @@ -243,20 +249,22 @@ our earlier `{{ 2 * x }}` example works, as `x` is of type `Term`. As a sanity check, let's write a naïve version of `times_two` that explicitly returns `2 * x`: -``` rust -$include 5-7 code/times-two.rs -``` +:::{literalinclude} code/times-two.rs +:lines: 5-7 +:language: rust +::: It seems like we should be able to verify this `times_two_ref` function using the same spec that we used for `times_two`: -``` -$include 11-11 code/times-two-ref-fail.saw -``` +:::{literalinclude} code/times-two-ref-fail.saw +:lines: 11 +:language: sawscript +::: Somewhat surprisingly, SAW fails to verify this function: -``` +:::{code-block} console $ saw times-two-ref-fail.saw @@ -272,7 +280,7 @@ $ saw times-two-ref-fail.saw [18:58:22.640] Stack trace: "mir_verify" (times-two-ref-fail.saw:11:1-11:11) Proof failed. -``` +::: The "`which would overflow`" portion of the error message suggests what went wrong. When a Rust program is compiled with debug settings (which is the @@ -311,9 +319,10 @@ perfectly fine for inputs smaller than `2^^31`. We can encode such an assumption in SAW by adding a _precondition_. To do so, we write a slightly modified version of `times_two_spec`: -``` -$include 13-18 code/times-two.saw -``` +:::{literalinclude} code/times-two.saw +:lines: 13-18 +:language: sawscript +::: The most notable change is the `mir_precond {{ x < 2^^31 }};` line. `mir_precond` (where "`precond`" is short for "precondition") is a command that @@ -326,24 +335,26 @@ By doing this, we have limited the range of the function from `0` to `2^^31 - 1`, which is exactly the range of values for which `times_two_ref` is well defined. SAW will confirm this if we run it: -``` -$include 20-20 code/times-two.saw -``` +:::{literalinclude} code/times-two.saw +:lines: 20 +:language: sawscript +::: -``` +:::{code-block} console [19:23:53.480] Verifying times_two/56182919::times_two_ref[0] ... [19:23:53.496] Simulating times_two/56182919::times_two_ref[0] ... [19:23:53.497] Checking proof obligations times_two/56182919::times_two_ref[0] ... [19:23:53.531] Proof succeeded! times_two/56182919::times_two_ref[0] -``` +::: We can add as many preconditions to a spec as we see fit. For instance, if we only want to verify `times_two_ref` for positive integers, we could add an additional assumption: -``` -$include 22-28 code/times-two.saw -``` +:::{literalinclude} code/times-two.saw +:lines: 22-28 +:language: sawscript +::: In addition to preconditions, SAW also supports postconditions. Whereas preconditions represent conditions that must hold _before_ invoking a function, @@ -357,9 +368,10 @@ For example, if we call `times_two_ref` with a positive argument, then it should be the case that the return value should be strictly greater than the argument value. We can check for this using `mir_postcond` like so: -``` -$include 32-39 code/times-two.saw -``` +:::{literalinclude} code/times-two.saw +:lines: 32-39 +:language: sawscript +::: An additional convenience that SAW offers is the `mir_assert` command. `mir_assert` has the same type as `mir_precond` and `mir_postcond`, but @@ -372,9 +384,10 @@ then it declares a postcondition. For example, we can rewrite `times_two_ref_positive_postcond_spec` to use `mir_assert`s like so: -``` -$include 43-50 code/times-two.saw -``` +:::{literalinclude} code/times-two.saw +:lines: 43-50 +:language: sawscript +::: The choice of whether to use `mir_precond`/`mir_postcond` versus `mir_assert` is mostly a matter personal taste. diff --git a/doc/rust-tutorial/static-items.md b/doc/rust-tutorial/static-items.md index e12d54f560..be1fcdf5f4 100644 --- a/doc/rust-tutorial/static-items.md +++ b/doc/rust-tutorial/static-items.md @@ -13,16 +13,18 @@ There are two kinds of static items in Rust: mutable static items (which have a items are much easier to deal with, so let's start by looking at an example of a program that uses immutable static data: -``` rust -$include 1-5 code/statics.rs -``` +:::{literalinclude} code/statics.rs +:lines: 1-5 +:language: rust +::: This function will return `ANSWER`, i.e., `42`. We can write a spec that says as much: -``` -$include 5-9 code/statics.saw -``` +:::{literalinclude} code/statics.saw +:lines: 5-9 +:language: sawscript +::: This works, but it is somewhat unsatisfying, as it requires hard-coding the value of `ANSWER` into the spec. Ideally, we'd not have to think about the @@ -30,17 +32,18 @@ precise implementation of static items like `ANSWER`. Fortunately, SAW makes this possible by providing a `mir_static_initializer` function which computes the initial value of a static item at the start of the program: -``` +:::{code-block} console sawscript> :type mir_static_initializer String -> MIRValue -``` +::: In this case, `mir_static_initializer "statics::ANSWER"` is equivalent to writing `mir_term {{ 42 : [32] }}`, so this spec is also valid: -``` -$include 14-18 code/statics.saw -``` +:::{literalinclude} code/statics.saw +:lines: 14-18 +:language: sawscript +::: Like `mir_verify`, the `mir_static_initializer` function expects a full identifier as an argument, so we must write `"statics::ANSWER"` instead of @@ -49,24 +52,26 @@ just `"ANSWER". At the MIR level, there is a unique reference to every static item. You can obtain this reference by using the `mir_static` function: -``` +:::{code-block} console sawscript> :type mir_static String -> MIRValue -``` +::: Here is one situation in which you would need to use a _reference_ to a static item (which `mir_static` computes) rather than the _value_ of a static item (which `mir_static_initializer` computes): -``` rust -$include 7-9 code/statics.rs -``` +:::{literalinclude} code/statics.rs +:lines: 7-9 +:language: rust +::: A spec for this function would look like this: -``` -$include 23-27 code/statics.saw -``` +:::{literalinclude} code/statics.saw +:lines: 23-27 +:language: sawscript +::: That's about all there is to say regarding immutable static items. @@ -78,9 +83,10 @@ state that any function can access and modify. They are so tricky, in fact, that Rust does not even allow you to use them unless you surround them in an `unsafe` block: -``` rust -$include 11-15 code/statics.rs -``` +:::{literalinclude} code/statics.rs +:lines: 11-15 +:language: rust +::: The `mir_static_initializer` and `mut_static` functions work both immutable and mutable static items, so we can write specs for mutable items using mostly the @@ -90,13 +96,14 @@ mutable static items. For example, here is naïve attempt at porting the spec for `answer_to_the_ultimate_question` over to its mutable static counterpart, `mut_answer_to_the_ultimate_question`: -``` -$include 5-9 code/statics-fail.saw -``` +:::{literalinclude} code/statics-fail.saw +:lines: 5-9 +:language: sawscript +::: This looks plausible, but SAW will fail to verify it: -``` +:::{code-block} console [21:52:32.738] Verifying statics/28a97e47::mut_answer_to_the_ultimate_question[0] ... [21:52:32.745] Simulating statics/28a97e47::mut_answer_to_the_ultimate_question[0] ... ... @@ -104,7 +111,7 @@ Symbolic execution failed. Abort due to assertion failure: statics.rs:14:14: 14:24: error: in statics/28a97e47::mut_answer_to_the_ultimate_question[0] attempted to read empty mux tree -``` +::: Oh no! Recall that we have seen this "`attempted to read empty mux tree`" error message once before when discussing reference types. This error arose when we @@ -119,17 +126,19 @@ The solution to this problem is to perform this initialization explicitly using `mir_points_to` in the preconditions of the spec. For example, this is a valid spec: -``` -$include 32-40 code/statics-fail.saw -``` +:::{literalinclude} code/statics.saw +:lines: 32-40 +:language: sawscript +::: We don't necessarily have to use `mir_static_initializer` as the starting value for `MUT_ANSWER`, however. This spec, which uses `27` as the starting value, is equally valid: -``` -$include 45-52 code/statics-fail.saw -``` +:::{literalinclude} code/statics.saw +:lines: 45-52 +:language: sawscript +::: At this point, you are likely wondering: why do we need to explicitly initialize mutable static references but not immutable static references? After @@ -141,9 +150,10 @@ careful in specifying what a mutable static value is at the start of a function. For example, consider a slightly extended version of the earlier Rust code we saw: -``` rust -$include 11-22 code/statics.rs -``` +:::{literalinclude} code/statics.rs +:lines: 11-22 +:language: rust +::: Suppose someone were to ask you "what value does `mut_answer_to_the_ultimate_question` return?" This is not a straightforward @@ -163,18 +173,20 @@ pitfalls of using mutable references in compositional overrides. Mutable static items are also mutable values that are backed by references, and as such, they are also subject to the same pitfalls. Let's see an example of this: -``` rust -$include 1-12 code/statics-compositional.rs -``` +:::{literalinclude} code/statics-compositional.rs +:lines: 1-12 +:language: rust +::: The setup is almost the same, except that instead of passing a mutable reference as an argument to `side_effect`, we instead declare a mutable static item `A` that is shared between `side_effect` and `foo`. We could potentially write SAW specs for `side_effect` and `foo` like these: -``` -$include 5-20 code/statics-compositional-fail.saw -``` +:::{literalinclude} code/statics-compositional-fail.saw +:lines: 5-20 +:language: sawscript +::: Note that we have once again underspecified the behavior of `side_effect`, as we do not say what `A`'s value should be in the postconditions of @@ -183,7 +195,7 @@ rather than the initial value of `A`. By similar reasoning as before, we run the risk that using `side_effect_ov` could lead use to prove something incorrect. Thankfully, SAW can also catch this sort of mistake: -``` +:::{code-block} console [15:46:38.525] Verifying statics_compositional/16fea9c0::side_effect[0] ... [15:46:38.533] Simulating statics_compositional/16fea9c0::side_effect[0] ... [15:46:38.533] Checking proof obligations statics_compositional/16fea9c0::side_effect[0] ... @@ -194,20 +206,22 @@ incorrect. Thankfully, SAW can also catch this sort of mistake: [15:46:38.542] Branching on 1 override variants of statics_compositional/16fea9c0::side_effect[0] ... ... State of mutable static variable "statics_compositional/16fea9c0::A[0]" not described in postcondition -``` +::: To repair this proof, add a `mir_points_to` statement in the postconditions of `side_effect_spec`: -``` -$include 7-13 code/statics-compositional.saw -``` +:::{literalinclude} code/statics-compositional.saw +:lines: 7-13 +:language: sawscript +::: And then correct the behavior of `foo_spec`: -``` -$include 15-22 code/statics-compositional.saw -``` +:::{literalinclude} code/statics-compositional.saw +:lines: 15-22 +:language: sawscript +::: Be warned that if your program declares any mutable static items, then any compositional override _must_ state what the value of each mutable static item @@ -215,10 +229,10 @@ is in its postconditions. This applies _even if the override does not directly use the mutable static items_. For example, if we had declared a second mutable static item alongside `A`: -``` rust +:::{code-block} rust static mut A: u32 = 42; static mut B: u32 = 27; -``` +::: Then `side_effect_spec` would need an additional `mir_points_to` statement involving `B` to satisfy this requirement. This requirement is somewhat From 81a6250446fea85900882f49e7d95a87766d749f Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 19:14:15 -0800 Subject: [PATCH 18/67] manual: Remove PDF (+ generation) and split up manual.md. Analogous to 0df615677 and 9a72549d7. --- doc/manual/Makefile | 38 - ...analyzing-hardware-circuits-using-yosys.md | 240 + doc/manual/before.tex | 1 - doc/manual/bisimulation-prover.md | 310 + doc/manual/creating-symbolic-variables.md | 124 + doc/manual/cryptol-and-its-role-in-saw.md | 265 + doc/manual/direct-extraction.md | 36 + doc/manual/doc.css | 93 - .../extraction-to-the-coq-theorem-prover.md | 218 + doc/manual/figures/galois.pdf | Bin 10165 -> 0 bytes doc/manual/formal-deprecation-process.md | 38 + doc/manual/galois-whitepaper.cls | 143 - doc/manual/head.tex | 44 - doc/manual/introduction.md | 32 + doc/manual/invoking-saw.md | 96 + doc/manual/loading-code.md | 252 + doc/manual/manual.md | 5099 ----------------- doc/manual/manual.pdf | Bin 612835 -> 0 bytes doc/manual/proofs-about-terms.md | 434 ++ .../specification-based-verification.md | 2125 +++++++ doc/manual/structure-of-sawscript.md | 428 ++ doc/manual/symbolic-execution.md | 92 + doc/manual/symbolic-termination.md | 66 + doc/manual/the-term-type.md | 13 + doc/manual/transforming-term-values.md | 314 + 25 files changed, 5083 insertions(+), 5418 deletions(-) delete mode 100644 doc/manual/Makefile create mode 100644 doc/manual/analyzing-hardware-circuits-using-yosys.md delete mode 100644 doc/manual/before.tex create mode 100644 doc/manual/bisimulation-prover.md create mode 100644 doc/manual/creating-symbolic-variables.md create mode 100644 doc/manual/cryptol-and-its-role-in-saw.md create mode 100644 doc/manual/direct-extraction.md delete mode 100644 doc/manual/doc.css create mode 100644 doc/manual/extraction-to-the-coq-theorem-prover.md delete mode 100644 doc/manual/figures/galois.pdf create mode 100644 doc/manual/formal-deprecation-process.md delete mode 100644 doc/manual/galois-whitepaper.cls delete mode 100644 doc/manual/head.tex create mode 100644 doc/manual/introduction.md create mode 100644 doc/manual/invoking-saw.md create mode 100644 doc/manual/loading-code.md delete mode 100644 doc/manual/manual.md delete mode 100644 doc/manual/manual.pdf create mode 100644 doc/manual/proofs-about-terms.md create mode 100644 doc/manual/specification-based-verification.md create mode 100644 doc/manual/structure-of-sawscript.md create mode 100644 doc/manual/symbolic-execution.md create mode 100644 doc/manual/symbolic-termination.md create mode 100644 doc/manual/the-term-type.md create mode 100644 doc/manual/transforming-term-values.md diff --git a/doc/manual/Makefile b/doc/manual/Makefile deleted file mode 100644 index 9733ce9e24..0000000000 --- a/doc/manual/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -TARGET = manual -SRCS = ${TARGET}.md ${wildcard *.bib} ${wildcard *.cls} ${wildcard *.sty} -CODE = ${wildcard code/*.c} \ - ${wildcard code/*.cry} \ - ${wildcard code/*.java} \ - ${wildcard code/*.saw} -AUX = ${wildcard *.blg} ${wildcard *.bbl} ${wildcard *.aux} \ - ${wildcard *.eps} ${wildcard *.log} ${wildcard *.toc} -PDFARGS = -H head.tex \ - -B before.tex \ - --listings \ - -V documentclass:galois-whitepaper \ - -V fontsize:12 \ - --toc \ - --pdf-engine=pdflatex -HTMLARGS = --css doc.css \ - --standalone \ - --toc \ - --self-contained - -all: pdf - -pdf: ${TARGET}.pdf - -${TARGET}.pdf: ${TARGET}.md Makefile galois-whitepaper.cls - pandoc ${PDFARGS} -o $@ ${TARGET}.md - -${TARGET}.tex: ${TARGET}.md Makefile galois-whitepaper.cls - pandoc ${PDFARGS} -o $@ ${TARGET}.md - -${TARGET}.html: ${TARGET}.md Makefile - pandoc ${HTMLARGS} -o $@ ${TARGET}.md - -clean: - rm -f ${AUX} - -superClean: clean - rm -f ${TARGET}.pdf ${TARGET}.html diff --git a/doc/manual/analyzing-hardware-circuits-using-yosys.md b/doc/manual/analyzing-hardware-circuits-using-yosys.md new file mode 100644 index 0000000000..d79e0a1369 --- /dev/null +++ b/doc/manual/analyzing-hardware-circuits-using-yosys.md @@ -0,0 +1,240 @@ +# Analyzing Hardware Circuits using Yosys +SAW has experimental support for analysis of hardware descriptions written in VHDL ([via GHDL](https://github.com/ghdl/ghdl-yosys-plugin)) through an intermediate representation produced by [Yosys](https://yosyshq.net/yosys/). +This generally follows the same conventions and idioms used in the rest of SAWScript. + +## Processing VHDL With Yosys +Given a VHDL file `test.vhd` containing an entity `test`, one can generate an intermediate representation `test.json` suitable for loading into SAW: + +~~~~ +$ ghdl -a test.vhd +$ yosys +... +Yosys 0.10+1 (git sha1 7a7df9a3b4, gcc 10.3.0 -fPIC -Os) +yosys> ghdl test + +1. Executing GHDL. +Importing module test. + +yosys> write_json test.json + +2. Executing JSON backend. +~~~~ + +It can sometimes be helpful to invoke additional Yosys passes between the `ghdl` and `write_json` commands. +For example, at present SAW does not support the `$pmux` cell type. +Yosys is able to convert `$pmux` cells into trees of `$mux` cells using the `pmuxtree` command. +We expect there are many other situations where Yosys' considerable library of commands is valuable for pre-processing. + +## Example: Ripple-Carry Adder +Consider three VHDL entities. +First, a half-adder: + +~~~~vhdl +library ieee; +use ieee.std_logic_1164.all; + +entity half is + port ( + a : in std_logic; + b : in std_logic; + c : out std_logic; + s : out std_logic + ); +end half; + +architecture halfarch of half is +begin + c <= a and b; + s <= a xor b; +end halfarch; +~~~~ + +Next, a one-bit adder built atop that half-adder: + +~~~~vhdl +library ieee; +use ieee.std_logic_1164.all; + +entity full is + port ( + a : in std_logic; + b : in std_logic; + cin : in std_logic; + cout : out std_logic; + s : out std_logic + ); +end full; + +architecture fullarch of full is + signal half0c : std_logic; + signal half0s : std_logic; + signal half1c : std_logic; +begin + half0 : entity work.half port map (a => a, b => b, c => half0c, s => half0s); + half1 : entity work.half port map (a => half0s, b => cin, c => half1c, s => s); + cout <= half0c or half1c; +end fullarch; +~~~~ + +Finally, a four-bit adder: + +~~~~vhdl +library ieee; +use ieee.std_logic_1164.all; + +entity add4 is + port ( + a : in std_logic_vector(0 to 3); + b : in std_logic_vector(0 to 3); + res : out std_logic_vector(0 to 3) + ); +end add4; + +architecture add4arch of add4 is + signal full0cout : std_logic; + signal full1cout : std_logic; + signal full2cout : std_logic; + signal ignore : std_logic; +begin + full0 : entity work.full port map (a => a(0), b => b(0), cin => '0', cout => full0cout, s => res(0)); + full1 : entity work.full port map (a => a(1), b => b(1), cin => full0cout, cout => full1cout, s => res(1)); + full2 : entity work.full port map (a => a(2), b => b(2), cin => full1cout, cout => full2cout, s => res(2)); + full3 : entity work.full port map (a => a(3), b => b(3), cin => full2cout, cout => ignore, s => res(3)); +end add4arch; +~~~~ + +Using GHDL and Yosys, we can convert the VHDL source above into a format that SAW can import. +If all of the code above is in a file `adder.vhd`, we can run the following commands: + +~~~~ +$ ghdl -a adder.vhd +$ yosys -p 'ghdl add4; write_json adder.json' +~~~~ + +The produced file `adder.json` can then be loaded into SAW with `yosys_import`: + +~~~~ +$ saw +... +sawscript> enable_experimental +sawscript> m <- yosys_import "adder.json" +sawscript> :type m +Term +sawscript> type m +[23:57:14.492] {add4 : {a : [4], b : [4]} -> {res : [4]}, + full : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]}, + half : {a : [1], b : [1]} -> {c : [1], s : [1]}} +~~~~ + +`yosys_import` returns a `Term` with a Cryptol record type, where the fields correspond to each VHDL module. +We can access the fields of this record like we would any Cryptol record, and call the functions within like any Cryptol function. + +~~~~ +sawscript> type {{ m.add4 }} +[00:00:25.255] {a : [4], b : [4]} -> {res : [4]} +sawscript> eval_int {{ (m.add4 { a = 1, b = 2 }).res }} +[00:02:07.329] 3 +~~~~ + +We can also use all of SAW's infrastructure for asking solvers about `Term`s, such as the `sat` and `prove` commands. +For example: + +~~~~ +sawscript> sat w4 {{ m.add4 === \_ -> { res = 5 } }} +[00:04:41.993] Sat: [_ = (5, 0)] +sawscript> prove z3 {{ m.add4 === \inp -> { res = inp.a + inp.b } }} +[00:05:43.659] Valid +sawscript> prove yices {{ m.add4 === \inp -> { res = inp.a - inp.b } }} +[00:05:56.171] Invalid: [_ = (8, 13)] +~~~~ + +The full library of `ProofScript` tactics is available in this setting. +If necessary, proof tactics like `simplify` can be used to rewrite goals before querying a solver. + +Special support is provided for the common case of equivalence proofs between HDL modules and other `Term`s (e.g. Cryptol functions, other HDL modules, or "extracted" imperative LLVM or JVM code). +The command `yosys_verify` has an interface similar to `llvm_verify`: given a specification, some lemmas, and a proof tactic, it produces evidence of a proven equivalence that may be passed as a lemma to future calls of `yosys_verify`. +For example, consider the following Cryptol specifications for one-bit and four-bit adders: + +~~~~cryptol +cryfull : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} +cryfull inp = { cout = [cout], s = [s] } + where [cout, s] = zext inp.a + zext inp.b + zext inp.cin + +cryadd4 : {a : [4], b : [4]} -> {res : [4]} +cryadd4 inp = { res = inp.a + inp.b } +~~~~ + +We can prove equivalence between `cryfull` and the VHDL `full` module: + +~~~~ +sawscript> full_spec <- yosys_verify {{ m.full }} [] {{ cryfull }} [] w4; +~~~~ + +The result `full_spec` can then be used as an "override" when proving equivalence between `cryadd4` and the VHDL `add4` module: + +~~~~ +sawscript> add4_spec <- yosys_verify {{ m.add4 }} [] {{ cryadd4 }} [full_spec] w4; +~~~~ + +The above could also be accomplished through the use of `prove_print` and term rewriting, but it is much more verbose. + +`yosys_verify` may also be given a list of preconditions under which the equivalence holds. +For example, consider the following Cryptol specification for `full` that ignores the `cin` bit: + +~~~~cryptol +cryfullnocarry : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} +cryfullnocarry inp = { cout = [cout], s = [s] } + where [cout, s] = zext inp.a + zext inp.b +~~~~ + +This is not equivalent to `full` in general, but it is if constrained to inputs where `cin = 0`. +We may express that precondition like so: + +~~~~ +sawscript> full_nocarry_spec <- yosys_verify {{ adderm.full }} [{{\(inp : {a : [1], b : [1], cin : [1]}) -> inp.cin == 0}}] {{ cryfullnocarry }} [] w4; +~~~~ + +The resulting override `full_nocarry_spec` may still be used in the proof for `add4` (this is accomplished by rewriting to a conditional expression). + +## API Reference +N.B: The following commands must first be enabled using `enable_experimental`. + +* `yosys_import : String -> TopLevel Term` produces a `Term` given the path to a JSON file produced by the Yosys `write_json` command. + The resulting term is a Cryptol record, where each field corresponds to one HDL module exported by Yosys. + Each HDL module is in turn represented by a function from a record of input port values to a record of output port values. + For example, consider a Yosys JSON file derived from the following VHDL entities: + ~~~~vhdl + entity half is + port ( + a : in std_logic; + b : in std_logic; + c : out std_logic; + s : out std_logic + ); + end half; + + entity full is + port ( + a : in std_logic; + b : in std_logic; + cin : in std_logic; + cout : out std_logic; + s : out std_logic + ); + end full; + ~~~~ + The resulting `Term` will have the type: + ~~~~ + { half : {a : [1], b : [1]} -> {c : [1], s : [1]} + , full : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} + } + ~~~~ +* `yosys_verify : Term -> [Term] -> Term -> [YosysTheorem] -> ProofScript () -> TopLevel YosysTheorem` proves equality between an HDL module and a specification. + The first parameter is the HDL module - given a record `m` from `yosys_import`, this will typically look something like `{{ m.foo }}`. + The second parameter is a list of preconditions for the equality. + The third parameter is the specification, a term of the same type as the HDL module, which will typically be some Cryptol function or another HDL module. + The fourth parameter is a list of "overrides", which witness the results of previous `yosys_verify` proofs. + These overrides can be used to simplify terms by replacing use sites of submodules with their specifications. + + Note that `Term`s derived from HDL modules are "first class", and are not restricted to `yosys_verify`: they may also be used with SAW's typical `Term` infrastructure like `sat`, `prove_print`, term rewriting, etc. + `yosys_verify` simply provides a convenient and familiar interface, similar to `llvm_verify` or `jvm_verify`. diff --git a/doc/manual/before.tex b/doc/manual/before.tex deleted file mode 100644 index 2a8b21e849..0000000000 --- a/doc/manual/before.tex +++ /dev/null @@ -1 +0,0 @@ -\maketitle diff --git a/doc/manual/bisimulation-prover.md b/doc/manual/bisimulation-prover.md new file mode 100644 index 0000000000..0a9581f782 --- /dev/null +++ b/doc/manual/bisimulation-prover.md @@ -0,0 +1,310 @@ +# Bisimulation Prover + +SAW contains a bisimulation prover to prove that two terms simulate each other. +This prover allows users to prove that two terms executing in lockstep satisfy +some relations over the state of each circuit and their outputs. This type of +proof is useful in demonstrating the eventual equivalence of two circuits, or +of a circuit and a functional specification. SAW enables these proofs with the +experimental `prove_bisim` command: + +~~~~ +prove_bisim : ProofScript () -> [BisimTheorem] -> Term -> Term -> Term -> Term -> TopLevel BisimTheorem +~~~~ + +When invoking `prove_bisim strat theorems srel orel lhs rhs`, the arguments +represent the following: + +1. `strat`: A proof strategy to use during verification. +2. `theorems`: A list of already proven bisimulation theorems. +3. `srel`: A state relation between `lhs` and `rhs`. This relation must have + the type `lhsState -> rhsState -> Bit`. The relation's first argument is + `lhs`'s state prior to execution. The relation's second argument is `rhs`'s + state prior to execution. `srel` then returns a `Bit` indicating whether + the two arguments satisfy the bisimulation's state relation. +4. `orel`: An output relation between `lhs` and `rhs`. This relation must have + the type `(lhsState, output) -> (rhsState, output) -> Bit`. The relation's + first argument is a pair consisting of `lhs`'s state and output following + execution. The relation's second argument is a pair consisting of `rhs`'s + state and output following execution. `orel` then returns a `Bit` indicating + whether the two arguments satisfy the bisimulation's output relation. +5. `lhs`: A term that simulates `rhs`. `lhs` must have the type + `(lhsState, input) -> (lhsState, output)`. The first argument to `lhs` is a + tuple containing the internal state of `lhs`, as well as the input to `lhs`. + `lhs` returns a tuple containing its internal state after execution, as well + as its output. +6. `rhs`: A term that simulates `lhs`. `rhs` must have the type + `(rhsState, input) -> (rhsState, output)`. The first argument to `rhs` is a + tuple containing the internal state of `rhs`, as well as the input to `rhs`. + `rhs` returns a tuple containing its internal state after execution, as well + as its output. + +On success, `prove_bisim` returns a `BisimTheorem` that can be used in future +bisimulation proofs to enable compositional bisimulation proofs. On failure, +`prove_bisim` will abort. + +## Bisimulation Example + +This section walks through an example proving that the Cryptol implementation +of an AND gate that makes use of internal state and takes two cycles to +complete is equivalent to a pure function that computes the logical AND of its +inputs in one cycle. First, we define the implementation's state type: + +~~~~ +type andState = { loaded : Bit, origX : Bit, origY : Bit } +~~~~ + +`andState` is a record type with three fields: + +1. `loaded`: A `Bit` indicating whether the input to the AND gate has been + loaded into the state record. +2. `origX`: A `Bit` storing the first input to the AND gate. +3. `origY`: A `Bit` storing the second input to the AND gate. + +Now, we define the AND gate's implementation: + +~~~~ +andImp : (andState, (Bit, Bit)) -> (andState, (Bit, Bit)) +andImp (s, (x, y)) = + if s.loaded /\ x == s.origX /\ y == s.origY + then (s, (True, s.origX && s.origY)) + else ({ loaded = True, origX = x, origY = y }, (False, 0)) +~~~~ + +`andImp` takes a tuple as input where the first field is an `andState` holding +the gate's internal state, and second field is a tuple containing the inputs to +the AND gate. `andImp` returns a tuple consisting of the updated `andState` and +the gate's output. The output is a tuple where the first field is a ready bit +that is `1` when the second field is ready to be read, and the second field +is the result of gate's computation. + +`andImp` takes two cycles to complete: + +1. The first cycle loads the inputs into its state's `origX` and `origY` fields + and sets `loaded` to `True`. It sets both of its output bits to `0`. +2. The second cycle uses the stored input values to compute the logical AND. + It sets its ready bit to `1` and its second output to the logical AND + result. + +So long as the inputs remain fixed after the second cycle, `andImp`'s output +remains unchanged. If the inputs change, then `andImp` restarts the +computation (even if the inputs change between the first and second cycles). + +Next, we define the pure function we'd like to prove `andImp` bisimilar to: + +~~~~ +andSpec : ((), (Bit, Bit)) -> ((), (Bit, Bit)) +andSpec (_, (x, y)) = ((), (True, x && y)) +~~~~ + +`andSpec` takes a tuple as input where the first field is `()`, indicating that +`andSpec` is a pure function without internal state, and the second field is a +tuple containing the inputs to the AND function. `andSpec` returns a tuple +consisting of `()` (again, because `andSpec` is stateless) and the function's +output. Like `andImp`, the output is a tuple where the first field is a ready +bit that is `1` when the second field is ready to be read, and the second field +is the result of the function's computation. + +`andSpec` completes in a single cycle, and as such its ready bit is always `1`. +It computes the logical AND directly on the function's inputs using Cryptol's +`(&&)` operator. + +Next, we define a state relation over `andImp` and `andSpec`: + +~~~~ +andStateRel : andState -> () -> Bit +andStateRel _ () = True +~~~~ + +`andStateRel` takes two arguments: + +1. An `andState` for `andImp`. +2. An empty state (`()`) for `andSpec`. + +`andStateRel` returns a `Bit` indicating whether the relation is satisified. In +this case, `andStateRel` always returns `True` because `andSpec` is stateless +and therefore the state relation permits `andImp` to accept any state. + +Lastly, we define a relation over `andImp` and `andSpec`: + +~~~~ +andOutputRel : (andState, (Bit, Bit)) -> ((), (Bit, Bit)) -> Bit +andOutputRel (s, (impReady, impO)) ((), (_, specO)) = + if impReady then impO == specO else True +~~~~ + +`andOutputRel` takes two arguments: + +1. A return value from `andImp`. Specifically, a pair consisting of an + `andState` and a pair containing a ready bit and result of the logical AND. +2. A return value from `andSpec`. Specifically, a pair consisting of an empty + state `()` and a pair containing a ready bit and result of the logical AND. + +`andOutputRel` returns a `Bit` indicating whether the relation is satisfied. It +considers the relation satisfied in two ways: + +1. If `andImp`'s ready bit is set, the relation is satisfied if the output + values `impO` and `specO` from `andImp` and `andSpec` respectively are + equivalent. +2. If `andImp`'s ready bit is not set, the relation is satisfied. + +Put another way, the relation is satisfied if the end result of `andImp` and +`andSpec` are equivalent. The relation permits intermediate outputs to differ. + +We can verify that this relation is always satisfied--and therefore the two +terms are bisimilar--by using `prove_bisim`: + +~~~~ +import "And.cry"; +enable_experimental; + +and_bisim <- prove_bisim z3 [] {{ andStateRel }} {{ andOutputRel }} {{ andImp }} {{ andSpec }}; +~~~~ + +Upon running this script, SAW prints: + +~~~~ +Successfully proved bisimulation between andImp and andSpec +~~~~ + +### Building a NAND gate + +We can make the example more interesting by reusing components to build a NAND +gate. We first define a state type for the NAND gate implementation that +contains `andImp`'s state. This NAND gate will not need any additional state, +so we will define a type `nandState` that is equal to `andState`: + +~~~~ +type nandState = andState +~~~~ + +Now, we define an implementation `nandImp` that calls `andImp` and negates the +result: + +~~~~ +nandImp : (nandState, (Bit, Bit)) -> (nandState, (Bit, Bit)) +nandImp x = (s, (andReady, ~andRes)) + where + (s, (andReady, andRes)) = andImp x +~~~~ + +Note that `nandImp` is careful to preserve the ready status of `andImp`. +Because `nandImp` relies on `andImp`, it also takes two cycles to compute the +logical NAND of its inputs. + +Next, we define a specification `nandSpec` in terms of `andSpec`: + +~~~~ +nandSpec : ((), (Bit, Bit)) -> ((), (Bit, Bit)) +nandSpec (_, (x, y)) = ((), (True, ~ (andSpec ((), (x, y))).1.1)) +~~~~ + +As with `andSpec`, `nandSpec` is pure and computes its result in a single +cycle. + +Next, we define a state relation over `nandImp` and `nandSpec`: + +~~~~ +nandStateRel : andState -> () -> Bit +nandStateRel _ () = True +~~~~ + +As with `andStateRel`, this state relation is always `True` because `nandSpec` +is stateless. + +Lastly, we define an output relation indicating that `nandImp` and `nandSpec` +produce equivalent results once `nandImp`'s ready bit is `1`: + +~~~~ +nandOutputRel : (nandState, (Bit, Bit)) -> ((), (Bit, Bit)) -> Bit +nandOutputRel (s, (impReady, impO)) ((), (_, specO)) = + if impReady then impO == specO else True +~~~~ + +To prove that `nandImp` and `nandSpec` are bisimilar, we again use +`prove_bisim`. This time however, we can reuse the bisimulation proof for the +AND gate by including it in the `theorems` paramter for `prove_bisim`: + +~~~~ +prove_bisim z3 [and_bisim] {{ nandStateRel }} {{ nandOutputRel }} {{ nandImp }} {{ nandSpec }}; +~~~~ + +Upon running this script, SAW prints: + +~~~~ +Successfully proved bisimulation between nandImp and nandSpec +~~~~ + +## Understanding the proof goals + +While not necessary for simple proofs, more advanced proofs may require +inspecting proof goals. `prove_bisim` generates and attempts to solve the +following proof goals: + +~~~~ +OUTPUT RELATION THEOREM: + forall s1 s2 in. + srel s1 s2 -> orel (lhs (s1, in)) (rhs (s2, in)) + +STATE RELATION THEOREM: + forall s1 s2 out1 out2. + orel (s1, out1) (s2, out2) -> srel s1 s2 +~~~~ + +where the variables in the `forall`s are: + +* `s1`: Initial state for `lhs` +* `s2`: Initial state for `rhs` +* `in`: Input value to `lhs` and `rhs` +* `out1`: Initial output value for `lhs` +* `out2`: Initial output value for `rhs` + +The `STATE RELATION THEOREM` verifies that the output relation properly captures +the guarantees of the state relation. The `OUTPUT RELATION THEOREM` verifies +that if `lhs` and `rhs` are executed with related states, then the result of +that execution is also related. These two theorems together guarantee that the +terms simulate each other. + +When using composition, `prove_bisim` also generates and attempts to solve +the proof goal below for any successfully applied `BisimTheorem` in the +`theorems` list: + +~~~~ +COMPOSITION SIDE CONDITION: + forall g_lhs_s g_rhs_s. + g_srel g_lhs_s g_rhs_s -> f_srel f_lhs_s f_rhs_s + where + f_lhs_s = extract_inner_state g_lhs g_lhs_s f_lhs + f_rhs_s = extract_inner_state g_rhs g_rhs_s f_rhs +~~~~ + +where `g_lhs` is an outer term containing a call to an inner term `f_lhs` +represented by a `BisimTheorem` and `g_rhs` is an outer term containing a call +to an inner term `f_rhs` represented by the same `BisimTheorem`. The variables +in `COMPOSITION SIDE CONDITION` are: + +* `extract_inner_state x x_s y`: A helper function that takes an outer term `x`, an + outer state `x_s`, and an inner term `y`, and returns the inner state of `x_s` + that `x` passes to `y`. +* `g_lhs_s`: The state for `g_lhs` +* `g_rhs_s`: The state for `g_rhs` +* `g_srel`: The state relation for `g_lhs` and `g_rhs` +* `f_srel`: The state relation for `f_lhs` and `f_rhs` +* `f_lhs_s`: The state for `f_lhs`, as represented in `g_lhs_s` (extracted using + `extract_inner_state`). +* `f_rhs_s`: The state for `f_rhs`, as represented in `g_rhs_s` (extracted using + `extract_inner_state`). + +The `COMPOSITION SIDE CONDITION` exists to verify that the terms in the +bisimulation relation properly set up valid states for subterms they contain. + +## Limitations + +For now, the `prove_bisim` command has a couple limitations: + +* `lhs` and `rhs` must be named functions. This is because `prove_bisim` uses + these names to perform substitution when making use of compositionality. +* Each subterm present in the list of bisimulation theorems already + proven may be invoked at most once in `lhs` or `rhs`. That is, if some + function `g_lhs` calls `f_lhs`, and `prove_bisim` is invoked with a + `BisimTheorem` proving that `f_lhs` is bisimilar to `f_rhs`, then `g_lhs` may + call `f_lhs` at most once. diff --git a/doc/manual/creating-symbolic-variables.md b/doc/manual/creating-symbolic-variables.md new file mode 100644 index 0000000000..8d822ef1fe --- /dev/null +++ b/doc/manual/creating-symbolic-variables.md @@ -0,0 +1,124 @@ +# Creating Symbolic Variables + +The direct extraction process just discussed automatically introduces +symbolic variables and then abstracts over them, yielding a SAWScript +`Term` that reflects the semantics of the original Java, LLVM, or MIR code. +For simple functions, this is often the most convenient interface. For +more complex code, however, it can be necessary (or more natural) to +specifically introduce fresh variables and indicate what portions of the +program state they correspond to. + +* `fresh_symbolic : String -> Type -> TopLevel Term` is responsible for +creating new variables in this context. The first argument is a name +used for pretty-printing of terms and counter-examples. In many cases it +makes sense for this to be the same as the name used within SAWScript, +as in the following: + +~~~~ +x <- fresh_symbolic "x" ty; +~~~~ + +However, using the same name is not required. + +The second argument to `fresh_symbolic` is the type of the fresh +variable. Ultimately, this will be a SAWCore type; however, it is usually +convenient to specify it using Cryptol syntax with the type quoting +brackets `{|` and `|}`. For example, creating a 32-bit integer, as +might be used to represent a Java `int` or an LLVM `i32`, can be done as +follows: + +~~~~ +x <- fresh_symbolic "x" {| [32] |}; +~~~~ + +Although symbolic execution works best on symbolic variables, which are +"unbound" or "free", most of the proof infrastructure within SAW uses +variables that are *bound* by an enclosing lambda expression. Given a +`Term` with free symbolic variables, we can construct a lambda term that +binds them in several ways. + +* `abstract_symbolic : Term -> Term` finds all symbolic variables in the +`Term` and constructs a lambda expression binding each one, in some +order. The result is a function of some number of arguments, one for +each symbolic variable. It is the simplest but least flexible way to +bind symbolic variables. + +~~~~ +sawscript> x <- fresh_symbolic "x" {| [8] |} +sawscript> let t = {{ x + x }} +sawscript> print_term t +let { x@1 = Prelude.Vec 8 Prelude.Bool + } + in Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) + x + x +sawscript> let f = abstract_symbolic t +sawscript> print_term f +let { x@1 = Prelude.Vec 8 Prelude.Bool + } + in \(x : x@1) -> + Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x x +~~~~ + +If there are multiple symbolic variables in the `Term` passed to +`abstract_symbolic`, the ordering of parameters can be hard to predict. +In some cases (such as when a proof is the immediate next step, and it's +expected to succeed) the order isn't important. In others, it's nice to +have more control over the order. + +* `lambda : Term -> Term -> Term` is the building block for controlled +binding. It takes two terms: the one to transform, and the portion of +the term to abstract over. Generally, the first `Term` is one obtained +from `fresh_symbolic` and the second is a `Term` that would be passed to +`abstract_symbolic`. + +~~~~ +sawscript> let f = lambda x t +sawscript> print_term f +let { x@1 = Prelude.Vec 8 Prelude.Bool + } + in \(x : x@1) -> + Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x x +~~~~ + +* `lambdas : [Term] -> Term -> Term` allows you to list the order in which +symbolic variables should be bound. Consider, for example, a `Term` +which adds two symbolic variables: + +~~~~ +sawscript> x1 <- fresh_symbolic "x1" {| [8] |} +sawscript> x2 <- fresh_symbolic "x2" {| [8] |} +sawscript> let t = {{ x1 + x2 }} +sawscript> print_term t +let { x@1 = Prelude.Vec 8 Prelude.Bool + } + in Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) + x1 + x2 +~~~~ + +We can turn `t` into a function that takes `x1` followed by `x2`: + +~~~~ +sawscript> let f1 = lambdas [x1, x2] t +sawscript> print_term f1 +let { x@1 = Prelude.Vec 8 Prelude.Bool + } + in \(x1 : x@1) -> + \(x2 : x@1) -> + Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x1 + x2 +~~~~ + +Or we can turn `t` into a function that takes `x2` followed by `x1`: + +~~~~ +sawscript> let f1 = lambdas [x2, x1] t +sawscript> print_term f1 +let { x@1 = Prelude.Vec 8 Prelude.Bool + } + in \(x2 : x@1) -> + \(x1 : x@1) -> + Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x1 + x2 +~~~~ diff --git a/doc/manual/cryptol-and-its-role-in-saw.md b/doc/manual/cryptol-and-its-role-in-saw.md new file mode 100644 index 0000000000..e4d74b06e7 --- /dev/null +++ b/doc/manual/cryptol-and-its-role-in-saw.md @@ -0,0 +1,265 @@ +# Cryptol and its Role in SAW + +Cryptol is a domain-specific language originally designed for the +high-level specification of cryptographic algorithms. It is general +enough, however, to describe a wide variety of programs, and is +particularly applicable to describing computations that operate on +streams of data of some fixed size. + +In addition to being integrated into SAW, Cryptol is a standalone +language with its own manual: + +~~~~ +http://cryptol.net/files/ProgrammingCryptol.pdf +~~~~ + +SAW includes deep support for Cryptol, and in fact requires the use of +Cryptol for most non-trivial tasks. To fully understand the rest of +this manual and to effectively use SAW, you will need to develop at least +a rudimentary understanding of Cryptol. + +The primary use of Cryptol within SAWScript is to construct values of type +`Term`. Although `Term` values can be constructed from various sources, +inline Cryptol expressions are the most direct and convenient way to create +them. + +Specifically, a Cryptol expression can be placed inside double curly +braces (`{{` and `}}`), resulting in a value of type `Term`. As a very +simple example, there is no built-in integer addition operation in +SAWScript. However, we can use Cryptol's built-in integer addition operator +within SAWScript as follows: + +~~~~ +sawscript> let t = {{ 0x22 + 0x33 }} +sawscript> print t +85 +sawscript> :type t +Term +~~~~ + +Although it printed out in the same way as an `Int`, it is important to +note that `t` actually has type `Term`. We can see how this term is +represented internally, before being evaluated, with the `print_term` +function. + +~~~~ +sawscript> print_term t +let { x@1 = Prelude.Vec 8 Prelude.Bool + x@2 = Cryptol.TCNum 8 + x@3 = Cryptol.PLiteralSeqBool x@2 + } + in Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool x@2) + (Cryptol.ecNumber (Cryptol.TCNum 34) x@1 x@3) + (Cryptol.ecNumber (Cryptol.TCNum 51) x@1 x@3) +~~~~ + +For the moment, it's not important to understand what this output means. +We show it only to clarify that `Term` values have their own internal +structure that goes beyond what exists in SAWScript. The internal +representation of `Term` values is in a language called SAWCore. The +full semantics of SAWCore are beyond the scope of this manual. + +The text constructed by `print_term` can also be accessed +programmatically (instead of printing to the screen) using the +`show_term` function, which returns a `String`. The `show_term` function +is not a command, so it executes directly and does not need `<-` to bind +its result. Therefore, the following will have the same result as the +`print_term` command above: + +~~~~ +sawscript> let s = show_term t +sawscript> :type s +String +sawscript> print s + +~~~~ + +Numbers are printed in decimal notation by default when printing terms, +but the following two commands can change that behavior. + +* `set_ascii : Bool -> TopLevel ()`, when passed `true`, makes +subsequent `print_term` or `show_term` commands print sequences of bytes +as ASCII strings (and doesn't affect printing of anything else). + +* `set_base : Int -> TopLevel ()` prints all bit vectors in the given +base, which can be between 2 and 36 (inclusive). + +A `Term` that represents an integer (any bit vector, as affected by +`set_base`) can be translated into a SAWScript `Int` using the +`eval_int : Term -> Int` function. This function returns an +`Int` if the `Term` can be represented as one, and fails at runtime +otherwise. + +~~~~ +sawscript> print (eval_int t) +85 +sawscript> print (eval_int {{ True }}) + +"eval_int" (:1:1): +eval_int: argument is not a finite bitvector +sawscript> print (eval_int {{ [True] }}) +1 +~~~~ + +Similarly, values of type `Bit` in Cryptol can be translated into values +of type `Bool` in SAWScript using the `eval_bool : Term -> Bool` function: + +~~~~ +sawscript> let b = {{ True }} +sawscript> print_term b +Prelude.True +sawscript> print (eval_bool b) +true +~~~~ + +Anything with sequence type in Cryptol can be translated into a list of +`Term` values in SAWScript using the `eval_list : Term -> [Term]` function. + +~~~~ +sawscript> let l = {{ [0x01, 0x02, 0x03] }} +sawscript> print_term l +let { x@1 = Prelude.Vec 8 Prelude.Bool + x@2 = Cryptol.PLiteralSeqBool (Cryptol.TCNum 8) + } + in [Cryptol.ecNumber (Cryptol.TCNum 1) x@1 x@2 + ,Cryptol.ecNumber (Cryptol.TCNum 2) x@1 x@2 + ,Cryptol.ecNumber (Cryptol.TCNum 3) x@1 x@2] +sawscript> print (eval_list l) +[Cryptol.ecNumber (Cryptol.TCNum 1) (Prelude.Vec 8 Prelude.Bool) + (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) +,Cryptol.ecNumber (Cryptol.TCNum 2) (Prelude.Vec 8 Prelude.Bool) + (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) +,Cryptol.ecNumber (Cryptol.TCNum 3) (Prelude.Vec 8 Prelude.Bool) + (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8))] +~~~~ + +Finally, a list of `Term` values in SAWScript can be collapsed into a single +`Term` with sequence type using the `list_term : [Term] -> Term` function, +which is the inverse of `eval_list`. + +~~~~ +sawscript> let ts = eval_list l +sawscript> let l = list_term ts +sawscript> print_term l +let { x@1 = Prelude.Vec 8 Prelude.Bool + x@2 = Cryptol.PLiteralSeqBool (Cryptol.TCNum 8) + } + in [Cryptol.ecNumber (Cryptol.TCNum 1) x@1 x@2 + ,Cryptol.ecNumber (Cryptol.TCNum 2) x@1 x@2 + ,Cryptol.ecNumber (Cryptol.TCNum 3) x@1 x@2] +~~~~ + +In addition to being able to extract integer and Boolean values from +Cryptol expressions, `Term` values can be injected into Cryptol +expressions. When SAWScript evaluates a Cryptol expression between `{{` +and `}}` delimiters, it does so with several extra bindings in scope: + +* Any variable in scope that has SAWScript type `Bool` is visible in + Cryptol expressions as a value of type `Bit`. + +* Any variable in scope that has SAWScript type `Int` is visible in + Cryptol expressions as a *type variable*. Type variables can be + demoted to numeric bit vector values using the backtick (`` ` ``) + operator. + +* Any variable in scope that has SAWScript type `Term` is visible in + Cryptol expressions as a value with the Cryptol type corresponding to + the internal type of the term. The power of this conversion is that + the `Term` does not need to have originally been derived from a + Cryptol expression. + +In addition to these rules, bindings created at the Cryptol level, +either from included files or inside Cryptol quoting brackets, are +visible only to later Cryptol expressions, and not as SAWScript +variables. + +To make these rules more concrete, consider the following examples. If +we bind a SAWScript `Int`, we can use it as a Cryptol type variable. If +we create a `Term` variable that internally has function type, we can +apply it to an argument within a Cryptol expression, but not at the +SAWScript level: + +~~~~ +sawscript> let n = 8 +sawscript> :type n +Int +sawscript> let {{ f (x : [n]) = x + 1 }} +sawscript> :type {{ f }} +Term +sawscript> :type f + +:1:1-1:2: unbound variable: "f" (:1:1-1:2) +sawscript> print {{ f 2 }} +3 +~~~~ + +If `f` was a binding of a SAWScript variable to a `Term` of function +type, we would get a different error: + +~~~~ +sawscript> let f = {{ \(x : [n]) -> x + 1 }} +sawscript> :type {{ f }} +Term +sawscript> :type f +Term +sawscript> print {{ f 2 }} +3 +sawscript> print (f 2) + +type mismatch: Int -> t.0 and Term + at "_" (REPL) + mismatched type constructors: (->) and Term +~~~~ + +One subtlety of dealing with `Term`s constructed from Cryptol is that +because the Cryptol expressions themselves are type checked by the +Cryptol type checker, and because they may make use of other `Term` +values already in scope, they are not type checked until the Cryptol +brackets are evaluated. So type errors at the Cryptol level may occur at +runtime from the SAWScript perspective (though they occur before the +Cryptol expressions are run). + +So far, we have talked about using Cryptol *value* expressions. However, +SAWScript can also work with Cryptol *types*. The most direct way to +refer to a Cryptol type is to use type brackets: `{|` and `|}`. Any +Cryptol type written between these brackets becomes a `Type` value in +SAWScript. Some types in Cryptol are *numeric* (also known as *size*) +types, and correspond to non-negative integers. These can be translated +into SAWScript integers with the `eval_size` function. For example: + +~~~~ +sawscript> let {{ type n = 16 }} +sawscript> eval_size {| n |} +16 +sawscript> eval_size {| 16 |} +16 +~~~~ + +For non-numeric types, `eval_size` fails at runtime: + +~~~~ +sawscript> eval_size {| [16] |} + +"eval_size" (:1:1): +eval_size: not a numeric type +~~~~ + +In addition to the use of brackets to write Cryptol expressions inline, +several built-in functions can extract `Term` values from Cryptol files +in other ways. The `import` command at the top level imports all +top-level definitions from a Cryptol file and places them in scope +within later bracketed expressions. This includes [Cryptol `foreign` +declarations](https://galoisinc.github.io/cryptol/master/FFI.html). If a +[Cryptol implementation of a foreign +function](https://galoisinc.github.io/cryptol/master/FFI.html#cryptol-implementation-of-foreign-functions) +is present, then it will be used as the definition when reasoning about +the function. Otherwise, the function will be imported as an opaque +constant with no definition. + +The `cryptol_load` command behaves similarly, but returns a +`CryptolModule` instead. If any `CryptolModule` is in scope, its +contents are available qualified with the name of the `CryptolModule` +variable. A specific definition can be explicitly extracted from a +`CryptolModule` using the `cryptol_extract` command: + +* `cryptol_extract : CryptolModule -> String -> TopLevel Term` diff --git a/doc/manual/direct-extraction.md b/doc/manual/direct-extraction.md new file mode 100644 index 0000000000..9e01f68199 --- /dev/null +++ b/doc/manual/direct-extraction.md @@ -0,0 +1,36 @@ +# Direct Extraction + +In the case of the `max` function described earlier, the relevant inputs +and outputs are immediately apparent. The function takes two integer +arguments, always uses both of them, and returns a single integer value, +making no other changes to the program state. + +In cases like this, a direct translation is possible, given only an +identification of which code to execute. Two functions exist to handle +such simple code. The first, for LLVM is the more stable of the two: + +* `llvm_extract : LLVMModule -> String -> TopLevel Term` + +A similar function exists for Java, but is more experimental. + +* `jvm_extract : JavaClass -> String -> TopLevel Term` + +Because of its lack of maturity, it (and later Java-related commands) +must be enabled by running the `enable_experimental` command beforehand. + +* `enable_experimental : TopLevel ()` + +The structure of these two extraction functions is essentially +identical. The first argument describes where to look for code (in +either a Java class or an LLVM module, loaded as described in the +previous section). The second argument is the name of the method or +function to extract. + +When the extraction functions complete, they return a `Term` +corresponding to the value returned by the function or method as a +function of its arguments. + +These functions currently work only for code that takes some fixed +number of integral parameters, returns an integral result, and does not +access any dynamically-allocated memory (although temporary memory +allocated during execution is allowed). diff --git a/doc/manual/doc.css b/doc/manual/doc.css deleted file mode 100644 index 08327aa2df..0000000000 --- a/doc/manual/doc.css +++ /dev/null @@ -1,93 +0,0 @@ -body { - font-size: 14px; - line-height: 21px; - color: #333; - font-family: "Helvetica Neue", "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, sans-serif !important; -} -.container { - width: 950px; - margin: 0; - padding: 80px 0px 50px 50px; -} -p, li { - width: 625px; -} -a { - color: #191933; -} -h1, h2, h3, h4, h5, h6, b.header { - color: #000; - margin-top: 40px; - margin-bottom: 15px; - text-shadow: #fff 0 1px 1px; -} -h1 { font-size: 18px } -h2 { font-size: 16px } -h3, h4, h5, h6 { font-size: 14px } -.author { font-weight: normal } - -br.clear { - height: 0; - clear: both; -} -ul { - padding-left: 20px; -} -b.header { - display: block; -} -li { - margin-bottom: 10px; -} -code, pre, tt, textarea { - font-family: Monaco, Consolas, "Lucida Console", monospace; - font-size: 12px; - line-height: 18px; - color: #155; - white-space: pre-wrap; - word-wrap: break-word; -} - tt { - display: inline-block; - background: #fff; - border: 1px solid #dedede; - padding: 0px 0.2em; - } - pre { - border-left: 5px solid rgba(0,0,0,0.2); - padding: 3px 0 3px 12px; - font-size: 12px; - } - pre.no_bar { - border-left: 0; - margin-left: 0; - padding-left: 0; - } -div.code { - position: relative; - background: #fff; - border: 1px solid #d8d8d8; - -webkit-box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - -moz-box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - box-shadow: 0px 0px 4px rgba(0,0,0,0.23); - zoom: 1; -} - div.code { - text-transform: none; - position: absolute; - right: 8px; bottom: 8px; - } - div.code { - left: 8px; right: auto; - } - div.code pre, div.code textarea { - float: left; - width: 450px; - background: #fff; - border-left: 1px dotted #d0d0d0; - margin: 10px 0 15px 3px; - padding: 0 0 0 12px; - } - div.code pre:first-child { - border-left: 0; - } diff --git a/doc/manual/extraction-to-the-coq-theorem-prover.md b/doc/manual/extraction-to-the-coq-theorem-prover.md new file mode 100644 index 0000000000..48a6f8e98f --- /dev/null +++ b/doc/manual/extraction-to-the-coq-theorem-prover.md @@ -0,0 +1,218 @@ +# Extraction to the Coq theorem prover + +In addition to the (semi-)automatic and compositional proof modes +already discussed above, SAW has experimental support for exporting +Cryptol and SAWCore values as terms to the Coq proof assistant[^5]. +This is intended to support more manual proof efforts for properties +that go beyond what SAW can support (for example, proofs requiring +induction) or for connecting to preexisting formalizations in Coq +of useful algorithms (e.g. the fiat crypto library[^6]). + +This support consists of two related pieces. The first piece is a library of +formalizations of the primitives underlying Cryptol and SAWCore and +various supporting concepts that help bridge the conceptual gap +between SAW and Coq. The second piece is a term translation +that maps the syntactic forms of SAWCore onto corresponding +concepts in Coq syntax, designed to dovetail with the concepts +defined in the support library. SAWCore is a quite similar language +to the core calculus underlying Coq, so much of this translation is +quite straightforward; however, the languages are not exactly +equivalent, and there are some tricky cases that mostly arise from +Cryptol code that can only be partially supported. We will note +these restrictions later in the manual. + +We expect this extraction process to work with a fairly wide range of Coq +versions, as we are not using bleeding-edge Coq features. It has been +most fully tested with Coq version 8.13.2. + +## Support Library + +In order to make use of SAW's extraction capabilities, one must first +compile the support library using Coq so that the included definitions +and theorems can be referenced by the extracted code. From the top +directory of the SAW source tree, the source code for this support +library can be found in the `saw-core-coq/coq` subdirectory. +In this subdirectory you will find a `_CoqProject` and a `Makefile`. +A simple `make` invocation should be enough to compile +all the necessary files, assuming Coq is installed and `coqc` is +available in the user's `PATH`. HTML documentation for the support +library can also be generated by `make html` from the same directory. + +Once the library is compiled, the recommended way to import +it into your subsequent development is by adding the following +lines to your `_CoqProject` file: + +``` +-Q /saw-core-coq/coq/generated/CryptolToCoq CryptolToCoq +-Q /saw-core-coq/coq/handwritten/CryptolToCoq CryptolToCoq +``` + +Here `` refers to the location on your system where the +SAWScript source tree is checked out. This will add the relevant +library files to the `CryptolToCoq` namespace, where the extraction +process will expect to find them. + +The support library for extraction is broken into two parts: those +files which are handwritten, versus those that are automatically +generated. The handwritten files are generally fairly readable and +are reasonable for human inspection; they define most of the +interesting pipe-fitting that allows Cryptol and SAWCore definitions +to connect to corresponding Coq concepts. In particular the +file `SAWCoreScaffolding.v` file defines most of the bindings of base +types to Coq types, and the `SAWCoreVectorsAsCoqVectors.v` defines the +core bitvector operations. The automatically generated files are direct +translations of the SAWCore source files +(`saw-core/prelude/Prelude.sawcore` and +`cryptol-saw-core/saw/Cryptol.sawcore`) that correspond to the +standard libraries for SAWCore and Cryptol, respectively. + +The autogenerated files are intended to be kept up-to-date with +changes in the corresponding `sawcore` files, and end users should +not need to generate them. Nonetheless, if they are out of sync for some +reason, these files may be regenerated using the `saw` executable +by running `(cd saw-core-coq; saw saw/generate_scaffolding.saw)` +from the top-level of the SAW source directory before compiling them +with Coq as described above. + +You may also note some additional files and concepts in the standard +library, such as `CompM.v`, and a variety of lemmas and definitions +related to it. These definitions are related to the "heapster" system, +which form a separate use-case for the SAWCore to Coq translation. +These definitions will not be used for code extracted from Cryptol. + +## Cryptol module extraction + +There are several modes of use for the SAW to Coq term extraction +facility, but the easiest to use is whole Cryptol module extraction. +This will extract all the definitions in the given Cryptol module, +together with it's transitive dependencies, into a single Coq module +which can then be compiled and pulled into subsequence developments. + +Suppose we have a Cryptol source file named `source.cry` and we want +to generate a Coq file named `output.v`. We can accomplish this by +running the following commands in saw (either directly from the `saw` +command prompt, or via a script file) + +``` +enable_experimental; +write_coq_cryptol_module "source.cry" "output.v" [] []; +``` + +In this default mode, identifiers in the Cryptol source will be +directly translated into identifiers in Coq. This may occasionally +cause problems if source identifiers clash with Coq keywords or +preexisting definitions. The third argument to +`write_coq_cryptol_module` can be used to remap such names if +necessary by giving a list of `(in,out)` pairs of names. The fourth +argument is a list of source identifiers to skip translating, if +desired. Authoritative online documentation for this command can be +obtained directly from the `saw` executable via `:help +write_coq_cryptol_module` after `enable_experimental`. + +The resulting "output.v" file will have some of the usual hallmarks of +computer-generated code; it will have poor formatting and, explicit +parenthesis and fully-qualified names. Thankfully, once loaded into +Coq, the Coq pretty-printer will do a much better job of rendering +these terms in a somewhat human-readable way. + +## Proofs involving uninterpreted functions + +It is possible to write a Cryptol module that references uninterpreted +functions by using the `primitive` keyword to declare them in your +Cryptol source. Primitive Cryptol declarations will be translated into +Coq section variables; as usual in Coq, uses of these section +variables will be translated into additional parameters to the +definitions from outside the section. In this way, consumers of +the translated module can instantiate the declared Cryptol functions +with corresponding terms in subsequent Coq developments. + +Although the Cryptol interpreter itself will not be able to compute +with declared but undefined functions of this sort, they can be used +both to provide specifications for functions to be verified with +`llvm_verify` or `jvm_verify` and also for Coq extraction. + +For example, if I write the following Cryptol source file: + +``` +primitive f : Integer -> Integer + +g : Integer -> Bool +g x = f (f x) > 0 +``` + +After extraction, the generated term `g` will have Coq type: + +``` +(Integer -> Integer) -> Integer -> Bool +``` + +## Translation limitations and caveats + +Translation from Cryptol to Coq has a number of fundamental +limitations that must be addressed. The most severe of these is that +Cryptol is a fully general-recursive language, and may exhibit runtime +errors directly via calls to the `error` primitive, or via partial +operations (such as indexing a sequence out-of-bounds). The internal +language of Coq, by contrast, is a strongly-normalizing language of +total functions. As such, our translation is unable to extract all +Cryptol programs. + +### Recursive programs + +The most severe of the currently limitations for our system +is that the translation is unable to translate any recursive Cryptol +program. Doing this would require us to attempt to find some +termination argument for the recursive function sufficient to satisfy +Coq; for now, no attempt is made to do so. if you attempt to +extract a recursive function, SAW will produce an error +about a "malformed term" with `Prelude.fix` as the head symbol. + +Certain limited kinds of recursion are available via the +`foldl` Cryptol primitive operation, which is translated directly +into a fold operation in Coq. This is sufficient for many basic +iterative algorithms. + +### Type coercions + +Another limitation of the translation system is that Cryptol uses SMT +solvers during its typechecking process and uses the results of solver +proofs to justify some of its typing judgments. When extracting these +terms to Coq, type equality coercions must be generated. Currently, we +do not have a good way to transport the reasoning done inside +Cryptol's typechecker into Coq, so we just supply a very simple `Ltac` +tactic to discharge these coercions (see `solveUnsafeAssert` in +`CryptolPrimitivesForSAWCoreExtra.v`). This tactic is able to +discover simple coercions, but for anything nontrivial it may +fail. The result will be a typechecking failure when compiling the +generated code in Coq when the tactic fails. If you encounter this +problem, it may be possible to enhance the `solveUnsafeAssert` tactic +to cover your use case. + +### Error terms + +A final caveat that is worth mentioning is that Cryptol can sometimes +produce runtime errors. These can arise from explicit calls to the +`error` primitive, or from partially defined operations (e.g., +division by zero or sequence access out of bounds). Such instances +are translated to occurrences of an unrealized Coq axiom named `error`. +In order to avoid introducing an inconsistent environment, the `error` +axiom is restricted to apply only to inhabited types. All the types +arising from Cryptol programs are inhabited, so this is no problem +in principle. However, collecting and passing this information around +on the Coq side is a little tricky. + +The main technical device we use here is the `Inhabited` type class; +it simply asserts that a type has some distinguished inhabitant. We +provide instances for the base types and type constructors arising +from Cryptol, so the necessary instances ought to be automatically +constructed when needed. However, polymorphic Cryptol functions add +some complications, as type arguments must also come together with +evidence that they are inhabited. The translation process takes care +to add the necessary `Inhabited` arguments, so everything ought to +work out. However, if Coq typechecking of generated code fails with +errors about `Inhabited` class instances, it likely represents some +problem with this aspect of the translation. + + +[^5]: https://coq.inria.fr +[^6]: https://github.com/mit-plv/fiat-crypto diff --git a/doc/manual/figures/galois.pdf b/doc/manual/figures/galois.pdf deleted file mode 100644 index 58cbef37a024e8ce3904c4a3b45faf66e4eee23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10165 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 r^U6xgN^=TGaY}M=i30z(it*i TopLevel LLVMModule` + +The resulting `LLVMModule` can be passed into the various functions +described below to perform analysis of specific LLVM functions. + +The LLVM bitcode parser should generally work with LLVM versions between +3.5 and 16.0, though it may be incomplete for some versions. Debug +metadata has changed somewhat throughout that version range, so is the +most likely case of incompleteness. We aim to support every version +after 3.5, however, so report any parsing failures as [on +GitHub](https://github.com/GaloisInc/saw-script/issues). + +## Loading Java + +Loading Java code is slightly more complex, because of the more +structured nature of Java packages. First, when running `saw`, three flags +control where to look for classes: + +* The `-b` flag takes the path where the `java` executable lives, which is used + to locate the Java standard library classes and add them to the class + database. Alternatively, one can put the directory where `java` lives on the + `PATH`, which SAW will search if `-b` is not set. + +* The `-j` flag takes the name of a JAR file as an argument and adds the + contents of that file to the class database. + +* The `-c` flag takes the name of a directory as an argument and adds all class + files found in that directory (and its subdirectories) to the class database. + By default, the current directory is included in the class path. + +Most Java programs will only require setting the `-b` flag (or the `PATH`), as +that is enough to bring in the standard Java libraries. Note that when +searching the `PATH`, SAW makes assumptions about where the standard library +classes live. These assumptions are likely to hold on JDK 7 or later, but they +may not hold on older JDKs on certain operating systems. If you are using an +old version of the JDK and SAW is unable to find a standard Java class, you may +need to specify the location of the standard classes' JAR file with the `-j` +flag (or, alternatively, with the `SAW_JDK_JAR` environment variable). + +Once the class path is configured, you can pass the name of a class to +the `java_load_class` function. + +* `java_load_class : String -> TopLevel JavaClass` + +The resulting `JavaClass` can be passed into the various functions +described below to perform analysis of specific Java methods. + +Java class files from any JDK newer than version 6 should work. However, +support for JDK 9 and later is experimental. Verifying code that only uses +primitive data types is known to work well, but there are some as-of-yet +unresolved issues in verifying code involving classes such as `String`. For +more information on these issues, refer to +[this GitHub issue](https://github.com/GaloisInc/crucible/issues/641). + +## Loading MIR + +To load a piece of Rust code, first compile it to a MIR JSON file, as described +in [this section](#compiling-mir), and then provide the location of the JSON +file to the `mir_load_module` function: + +* `mir_load_module : String -> TopLevel MIRModule` + +SAW currently supports Rust code that can be built with a [January 23, 2023 +Rust nightly](https://static.rust-lang.org/dist/2023-01-23/). If you encounter +a Rust feature that SAW does not support, please report it [on +GitHub](https://github.com/GaloisInc/saw-script/issues). + +## Notes on Compiling Code for SAW + +SAW will generally be able to load arbitrary LLVM bitcode, JVM bytecode, and +MIR JSON files, but several guidelines can help make verification easier or +more likely to succeed. + +### Compiling LLVM + +For generating LLVM with `clang`, it can be helpful to: + +* Turn on debugging symbols with `-g` so that SAW can find source + locations of functions, names of variables, etc. + +* Optimize with `-O1` so that the generated bitcode more closely matches + the C/C++ source, making the results more comprehensible. + +* Use `-fno-threadsafe-statics` to prevent `clang` from emitting + unnecessary pthread code. + +* Link all relevant bitcode with `llvm-link` (including, *e.g.*, the C++ + standard library when analyzing C++ code). + +All SAW proofs include side conditions to rule out undefined behavior, +and proofs will only succeed if all of these side conditions have been +discharged. However the default SAW notion of undefined behavior is with +respect to the semantics of LLVM, rather than C or C++. If you want to +rule out undefined behavior according to the C or C++ standards, +consider compiling your code with `-fsanitize=undefined` or one of the +related flags[^1] to `clang`. + +Generally, you'll also want to use `-fsanitize-trap=undefined`, or one +of the related flags, to cause the compiled code to use `llvm.trap` to +indicate the presence of undefined behavior. Otherwise, the compiled +code will call a separate function, such as +`__ubsan_handle_shift_out_of_bounds`, for each type of undefined +behavior, and SAW currently does not have built in support for these +functions (though you could manually create overrides for them in a +verification script). + +[^1]: https://clang.llvm.org/docs/UsersManual.html#controlling-code-generation + +### Compiling Java + +For Java, the only compilation flag that tends to be valuable is `-g` to +retain information about the names of function arguments and local +variables. + +### Compiling MIR + +In order to verify Rust code, SAW analyzes Rust's MIR (mid-level intermediate +representation) language. In particular, SAW analyzes a particular form of MIR +that the [`mir-json`](https://github.com/GaloisInc/mir-json) tool produces. You +will need to intall `mir-json` and run it on Rust code in order to produce MIR +JSON files that SAW can load (see [this section](#loading-mir)). You will also +need to use `mir-json` to build custom versions of the Rust standard libraries +that are more suited to verification purposes. + +If you are working from a checkout of the `saw-script` repo, you can install +the `mir-json` tool and the custom Rust standard libraries by performing the +following steps: + +1. Clone the [`crucible`](https://github.com/GaloisInc/crucible) and `mir-json` + submodules like so: + + ``` + $ git submodule update deps/crucible deps/mir-json + ``` + +2. Navigate to the `mir-json` submodule: + + ``` + $ cd deps/mir-json + ``` + +3. Follow the instructions laid out in the [`mir-json` installation + instructions](https://github.com/GaloisInc/mir-json#installation-instructions) + in order to install `mir-json`. + +4. Navigate to the + [`crux-mir`](https://github.com/GaloisInc/crucible/tree/master/crux-mir) + subdirectory of the `crucible` submodule: + + ``` + $ cd ../crucible/crux-mir/ + ``` + +5. Run the `translate_libs.sh` script: + + ``` + $ ./translate_libs.sh + ``` + + This will compile the custom versions of the Rust standard libraries using + `mir-json`, placing the results under the `rlibs` subdirectory. + +6. Finally, define a `SAW_RUST_LIBRARY_PATH` environment variable that points + to the newly created `rlibs` subdirectory: + + ``` + $ export SAW_RUST_LIBRARY_PATH=<...>/crucible/crux-mir/rlibs + ``` + +For `cargo`-based projects, `mir-json` provides a `cargo` subcommand called +`cargo saw-build` that builds a JSON file suitable for use with SAW. `cargo +saw-build` integrates directly with `cargo`, so you can pass flags to it like +any other `cargo` subcommand. For example: + +``` +# Make sure that SAW_RUST_LIBRARY_PATH is defined, as described above +$ cargo saw-build + +linking 11 mir files into <...>/example-364cf2df365c7055.linked-mir.json + +``` + +Note that: + +* The full output of `cargo saw-build` here is omitted. The important part is + the `.linked-mir.json` file that appears after `linking X mir files into`, as + that is the JSON file that must be loaded with SAW. +* `SAW_RUST_LIBRARY_PATH` should point to the the MIR JSON files for the Rust + standard library. + +`mir-json` also supports compiling individual `.rs` files through `mir-json`'s +`saw-rustc` command. As the name suggests, it accepts all of the flags that +`rustc` accepts. For example: + +``` +# Make sure that SAW_RUST_LIBRARY_PATH is defined, as described above +$ saw-rustc example.rs + +linking 11 mir files into <...>/example.linked-mir.json + +``` + +## Notes on C++ Analysis + +The distance between C++ code and LLVM is greater than between C and +LLVM, so some additional considerations come into play when analyzing +C++ code with SAW. + +The first key issue is that the C++ standard library is large and +complex, and tends to be widely used by C++ applications. To analyze +most C++ code, it will be necessary to link your code with a version of +the `libc++` library[^2] compiled to LLVM bitcode. The `wllvm` program +can[^3] be useful for this. + +The C++ standard library includes a number of key global variables, and +any code that touches them will require that they be initialized using +`llvm_alloc_global`. + +Many C++ names are slightly awkward to deal with in SAW. They may be +mangled relative to the text that appears in the C++ source code. SAW +currently only understands the mangled names. The `llvm-nm` program can +be used to show the list of symbols in an LLVM bitcode file, and the +`c++filt` program can be used to demangle them, which can help in +identifying the symbol you want to refer to. In addition, C++ names from +namespaces can sometimes include quote marks in their LLVM encoding. For +example: + +~~~~ +%"class.quux::Foo" = type { i32, i32 } +~~~~ + +This can be mentioned in SAW by saying: + +~~~~ +llvm_type "%\"class.quux::Foo\"" +~~~~ + +Finally, there is no support for calling constructors in specifications, +so you will need to construct objects piece-by-piece using, *e.g.*, +`llvm_alloc` and `llvm_points_to`. + +[^2]: https://libcxx.llvm.org/docs/BuildingLibcxx.html +[^3]: https://github.com/travitch/whole-program-llvm diff --git a/doc/manual/manual.md b/doc/manual/manual.md deleted file mode 100644 index ba2ed22452..0000000000 --- a/doc/manual/manual.md +++ /dev/null @@ -1,5099 +0,0 @@ -# Introduction - -The Software Analysis Workbench (SAW) is a tool for constructing -mathematical models of the computational behavior of software, -transforming these models, and proving properties about them. - -SAW can currently construct models of a subset of programs written in -Cryptol, LLVM (and therefore C), and JVM (and therefore Java). SAW also has -experimental, incomplete support for MIR (and therefore Rust). The -models take the form of typed functional programs, so in a sense SAW can -be considered a translator from imperative programs to their functional -equivalents. Various external proof tools, including a variety of SAT -and SMT solvers, can be used to prove properties about the functional -models. SAW can construct models from arbitrary Cryptol programs, and -from C and Java programs that have fixed-size inputs and outputs and -that terminate after a fixed number of iterations of any loop (or a -fixed number of recursive calls). One common use case is to verify that -an algorithm specification in Cryptol is equivalent to an algorithm -implementation in C or Java. - -The process of extracting models from programs, manipulating them, -forming queries about them, and sending them to external provers is -orchestrated using a special purpose language called SAWScript. -SAWScript is a typed functional language with support for sequencing of -imperative commands. - -The rest of this document first describes how to use the SAW tool, -`saw`, and outlines the structure of the SAWScript language and its -relationship to Cryptol. It then presents the SAWScript commands that -transform functional models and prove properties about them. Finally, it -describes the specific commands available for constructing models from -imperative programs. - -# Invoking SAW - -The primary mechanism for interacting with SAW is through the `saw` -executable included as part of the standard binary distribution. With no -arguments, `saw` starts a read-evaluate-print loop (REPL) that allows -the user to interactively evaluate commands in the SAWScript language. -With one file name argument, it executes the specified file as a SAWScript -program. - -In addition to a file name, the `saw` executable accepts several -command-line options: - -`-h, -?, --help` - - ~ Print a help message. - -`-V, --version` - - ~ Show the version of the SAWScript interpreter. - -`-c path, --classpath=path` - - ~ Specify a colon-delimited list of paths to search for Java classes. - -`-i path, --import-path=path` - - ~ Specify a colon-delimited list of paths to search for imports. - -`-t, --extra-type-checking` - - ~ Perform extra type checking of intermediate values. - -`-I, --interactive` - - ~ Run interactively (with a REPL). This is the default if no other - arguments are specified. - -`-j path, --jars=path` - - ~ Specify a colon-delimited list of paths to `.jar` files to search - for Java classes. - -`-b path, --java-bin-dirs` - - ~ Specify a colon-delimited list of paths to search for a Java - executable. - -`-d num, --sim-verbose=num` - - ~ Set the verbosity level of the Java and LLVM simulators. - -`-v num, --verbose=num` - - ~ Set the verbosity level of the SAWScript interpreter. - -`--clean-mismatched-versions-solver-cache[=path]` - - ~ Run the `clean_mismatched_versions_solver_cache` command on the solver - cache at the given path, or if no path is given, the solver cache at the - value of the `SAW_SOLVER_CACHE_PATH` environment variable, then exit. See - the section **Caching Solver Results** for a description of the - `clean_mismatched_versions_solver_cache` command and the solver caching - feature in general. - -SAW also uses several environment variables for configuration: - -`CRYPTOLPATH` - - ~ Specify a colon-delimited list of directory paths to search for Cryptol - imports (including the Cryptol prelude). - -`PATH` - - ~ If the `--java-bin-dirs` option is not set, then the `PATH` will be - searched to find a Java executable. - -`SAW_IMPORT_PATH` - - ~ Specify a colon-delimited list of directory paths to search for imports. - -`SAW_JDK_JAR` - - ~ Specify the path of the `.jar` file containing the core Java - libraries. Note that that is not necessary if the `--java-bin-dirs` option - or the `PATH` environment variable is used, as SAW can use this information - to determine the location of the core Java libraries' `.jar` file. - -`SAW_SOLVER_CACHE_PATH` - - ~ Specify a path at which to keep a cache of solver results obtained during - calls to certain tactics. A cache is not created at this path until it is - needed. See the section **Caching Solver Results** for more detail about this - feature. - -On Windows, semicolon-delimited lists are used instead of colon-delimited -lists. - -# Structure of SAWScript - -A SAWScript program consists, at the top level, of a sequence of -commands to be executed in order. Each command is terminated with a -semicolon. For example, the `print` command displays a textual -representation of its argument. Suppose the following text is stored in -the file `print.saw`: - -~~~~ -print 3; -~~~~ - -The command `saw print.saw` will then yield output similar to the -following: - -~~~~ -Loading module Cryptol -Loading file "print.saw" -3 -~~~~ - -The same code can be run from the interactive REPL: - -~~~~ -sawscript> print 3; -3 -~~~~ - -At the REPL, terminating semicolons can be omitted: - -~~~~ -sawscript> print 3 -3 -~~~~ - -To make common use cases simpler, bare values at the REPL are treated as -if they were arguments to `print`: - -~~~~ -sawscript> 3 -3 -~~~~ - -One SAWScript file can be included in another using the `include` -command, which takes the name of the file to be included as an argument. -For example: - -~~~~ -sawscript> include "print.saw" -Loading file "print.saw" -3 -~~~~ - -Typically, included files are used to import definitions, not perform -side effects like printing. However, as you can see, if any commands -with side effects occur at the top level of the imported file, those -side effects will occur during import. - -## Syntax - -The syntax of SAWScript is reminiscent of functional languages such as -Cryptol, Haskell and ML. In particular, functions are applied by -writing them next to their arguments rather than by using parentheses -and commas. Rather than writing `f(x, y)`, write `f x y`. - -Comments are written as in C, Java, and Rust (among many other languages). All -text from `//` until the end of a line is ignored. Additionally, all -text between `/*` and `*/` is ignored, regardless of whether the line -ends. - -## Basic Types and Values - -All values in SAWScript have types, and these types are determined and -checked before a program runs (that is, SAWScript is statically typed). -The basic types available are similar to those in many other languages. - -* The `Int` type represents unbounded mathematical integers. Integer - constants can be written in decimal notation (e.g., `42`), hexadecimal - notation (`0x2a`), and binary (`0b00101010`). However, unlike many - languages, integers in SAWScript are used primarily as constants. - Arithmetic is usually encoded in Cryptol, as discussed in the next - section. - -* The Boolean type, `Bool`, contains the values `true` and `false`, like - in many other languages. As with integers, computations on Boolean - values usually occur in Cryptol. - -* Values of any type can be aggregated into tuples. For example, the - value `(true, 10)` has the type `(Bool, Int)`. - -* Values of any type can also be aggregated into records, which are - exactly like tuples except that their components have names. For - example, the value `{ b = true, n = 10 }` has the type `{ b : Bool, - n : Int }`. - -* A sequence of values of the same type can be stored in a list. For - example, the value `[true, false, true]` has the type `[Bool]`. - -* Strings of textual characters can be represented in the `String` type. - For example, the value `"example"` has type `String`. - -* The "unit" type, written `()`, is essentially a placeholder, similar - to `void` in languages like C and Java. It has only one value, also - written `()`. Values of type `()` convey no information. We will show - in later sections several cases where this is useful. - -* Functions are given types that indicate what type they consume and - what type they produce. For example, the type `Int -> Bool` indicates - a function that takes an `Int` as input and produces a `Bool` as - output. Functions with multiple arguments use multiple arrows. For - example, the type `Int -> String -> Bool` indicates a function in - which the first argument is an `Int`, the second is a `String`, and - the result is a `Bool`. It is possible, but not necessary, to group - arguments in tuples, as well, so the type `(Int, String) -> Bool` - describes a function that takes one argument, a pair of an `Int` and a - `String`, and returns a `Bool`. - -SAWScript also includes some more specialized types that do not have -straightforward counterparts in most other languages. These will appear -in later sections. - -## Basic Expression Forms - -One of the key forms of top-level command in SAWScript is a *binding*, -introduced with the `let` keyword, which gives a name to a value. For -example: - -~~~~ -sawscript> let x = 5 -sawscript> x -5 -~~~~ - -Bindings can have parameters, in which case they define functions. For -instance, the following function takes one parameter and constructs a -list containing that parameter as its single element. - -~~~~ -sawscript> let f x = [x] -sawscript> f "text" -["text"] -~~~~ - -Functions themselves are values and have types. The type of a function -that takes an argument of type `a` and returns a result of type `b` is -`a -> b`. - -Function types are typically inferred, as in the example `f` -above. In this case, because `f` only creates a list with the given -argument, and because it is possible to create a list of any element -type, `f` can be applied to an argument of any type. We say, therefore, -that `f` is *polymorphic*. Concretely, we write the type of `f` as `{a} -a -> [a]`, meaning it takes a value of any type (denoted `a`) and -returns a list containing elements of that same type. This means we can -also apply `f` to `10`: - -~~~~ -sawscript> f 10 -[10] -~~~~ - -However, we may want to specify that a function has a more -specific type. In this case, we could restrict `f` to operate only on -`Int` parameters. - -~~~~ -sawscript> let f (x : Int) = [x] -~~~~ - -This will work identically to the original `f` on an `Int` parameter: - -~~~~ -sawscript> f 10 -[10] -~~~~ - -However, it will fail for a `String` parameter: - -~~~~ -sawscript> f "text" - -type mismatch: String -> t.0 and Int -> [Int] - at "_" (REPL) -mismatched type constructors: String and Int -~~~~ - -Type annotations can be applied to any expression. The notation `(e : -t)` indicates that expression `e` is expected to have type `t` and -that it is an error for `e` to have a different type. Most types in -SAWScript are inferred automatically, but specifying them explicitly can -sometimes enhance readability. - -Because functions are values, functions can return other functions. We -make use of this feature when writing functions of multiple arguments. -Consider the function `g`, similar to `f` but with two arguments: - -~~~~ -sawscript> let g x y = [x, y] -~~~~ - -Like `f`, `g` is polymorphic. Its type is `{a} a -> a -> [a]`. This -means it takes an argument of type `a` and returns a *function* that -takes an argument of the same type `a` and returns a list of `a` values. -We can therefore apply `g` to any two arguments of the same type: - -~~~~ -sawscript> g 2 3 -[2,3] -sawscript> g true false -[true,false] -~~~~ - -But type checking will fail if we apply it to two values of different types: - -~~~~ -sawscript> g 2 false - -type mismatch: Bool -> t.0 and Int -> [Int] - at "_" (REPL) -mismatched type constructors: Bool and Int -~~~~ - -So far we have used two related terms, *function* and *command*, and we -take these to mean slightly different things. A function is any value -with a function type (e.g., `Int -> [Int]`). A command is any value with -a special command type (e.g. `TopLevel ()`, as shown below). These -special types allow us to restrict command usage to specific contexts, -and are also *parameterized* (like the list type). Most but not all -commands are also functions. - -The most important command type is the `TopLevel` type, indicating a -command that can run at the top level (directly at the REPL, or as one -of the top level commands in a script file). The `print` command -has the type `{a} a -> TopLevel ()`, where `TopLevel ()` means that it -is a command that runs in the `TopLevel` context and returns a value of -type `()` (that is, no useful information). In other words, it has a -side effect (printing some text to the screen) but doesn't produce any -information to use in the rest of the SAWScript program. This is the -primary usage of the `()` type. - -It can sometimes be useful to bind a sequence of commands together. This -can be accomplished with the `do { ... }` construct. For example: - -~~~~ -sawscript> let print_two = do { print "first"; print "second"; } -sawscript> print_two -first -second -~~~~ - -The bound value, `print_two`, has type `TopLevel ()`, since that is the -type of its last command. - -Note that in the previous example the printing doesn't occur until -`print_two` directly appears at the REPL. The `let` expression does not -cause those commands to run. The construct that *runs* a command is -written using the `<-` operator. This operator works like `let` except -that it says to run the command listed on the right hand side and bind -the result, rather than binding the variable to the command itself. -Using `<-` instead of `let` in the previous example yields: - -~~~~ -sawscript> print_two <- do { print "first"; print "second"; } -first -second -sawscript> print print_two -() -~~~~ - -Here, the `print` commands run first, and then `print_two` gets the -value returned by the second `print` command, namely `()`. Any command -run without using `<-` at either the top level of a script or within a -`do` block discards its result. However, the REPL prints the result of -any command run without using the `<-` operator. - -In some cases it can be useful to have more control over the value -returned by a `do` block. The `return` command allows us to do this. For -example, say we wanted to write a function that would print a message -before and after running some arbitrary command and then return the -result of that command. We could write: - -~~~~ -let run_with_message msg c = - do { - print "Starting."; - print msg; - res <- c; - print "Done."; - return res; - }; - -x <- run_with_message "Hello" (return 3); -print x; -~~~~ - -If we put this script in `run.saw` and run it with `saw`, we get -something like: - -~~~~ -Loading module Cryptol -Loading file "run.saw" -Starting. -Hello -Done. -3 -~~~~ - -Note that it ran the first `print` command, then the caller-specified -command, then the second `print` command. The result stored in `x` at -the end is the result of the `return` command passed in as an argument. - -## Other Basic Functions - -Aside from the functions we have listed so far, there are a number of other -operations for working with basic data structures and interacting -with the operating system. - -The following functions work on lists: - -* `concat : {a} [a] -> [a] -> [a]` takes two lists and returns the -concatenation of the two. - -* `head : {a} [a] -> a` returns the first element of a list. - -* `tail : {a} [a] -> [a]` returns everything except the first element. - -* `length : {a} [a] -> Int` counts the number of elements in a list. - -* `null : {a} [a] -> Bool` indicates whether a list is empty (has zero -elements). - -* `nth : {a} [a] -> Int -> a` returns the element at the given position, -with `nth l 0` being equivalent to `head l`. - -* `for : {m, a, b} [a] -> (a -> m b) -> m [b]` takes a list and a -function that runs in some command context. The passed command will be -called once for every element of the list, in order. Returns a list of -all of the results produced by the command. - -For interacting with the operating system, we have: - -* `get_opt : Int -> String` returns the command-line argument to `saw` -at the given index. Argument 0 is always the name of the `saw` -executable itself, and higher indices represent later arguments. - -* `exec : String -> [String] -> String -> TopLevel String` runs an -external program given, respectively, an executable name, a list of -arguments, and a string to send to the standard input of the program. -The `exec` command returns the standard output from the program it -executes and prints standard error to the screen. - -* `exit : Int -> TopLevel ()` stops execution of the current script and -returns the given exit code to the operating system. - -Finally, there are a few miscellaneous functions and commands: - -* `show : {a} a -> String` computes the textual representation of its -argument in the same way as `print`, but instead of displaying the value -it returns it as a `String` value for later use in the program. This can -be useful for constructing more detailed messages later. - -* `str_concat : String -> String -> String` concatenates two `String` -values, and can also be useful with `show`. - -* `time : {a} TopLevel a -> TopLevel a` runs any other `TopLevel` -command and prints out the time it took to execute. - -* `with_time : {a} TopLevel a -> TopLevel (Int, a)` returns both the -original result of the timed command and the time taken to execute it -(in milliseconds), without printing anything in the process. - -## REPL Actions - -There is an additional class of things that one may type at the REPL -for interactive use: - -* `:cd` changes the REPL's current directory. - -* `:pwd` prints the REPL's current directory. - -* `:env` displays the values and types of all currently bound -variables, including built-in functions and commands. - -* `:tenv` displays the expansions of all currently defined type -aliases, including those that are built in. - -* `:type` or `:t` checks and prints the type of an arbitrary SAWScript -expression: -~~~~ -sawscript> :t show -{a.0} a.0 -> String -~~~~ - -* `:help` or `:h` prints the help text for a built-in function or -command: -~~~~ -sawscript> :h show -Description ------------ - - show : {a} a -> String - -Convert the value of the given expression to a string. -~~~~ - -* `:quit` or `:q` exits the program. - -## Further built-in functions and commands - -SAW contains many built-in operations, referred to as "primitives." -These appear in SAWScript as built-in functions and commands. -The following sections of the manual will introduce many of these. - -## Experimental and deprecated functions and commands - -Some of the primitives available in SAW at any given time are -experimental. -These may be incomplete, unfinished, use at your own risk, etc. -The functions and commands associated with these are unavailable -by default; they can be made visible with the `enable_experimental` -command. - -Other primitives are considered deprecated. -Some of these, as the -[deprecation process](#formal-deprecation-process) proceeds, are -unavailable by default. - -They can be made visible with the `enable_deprecated` command. - -# The Term Type - -Perhaps the most important type in SAWScript, and the one most unlike -the built-in types of most other languages, is the `Term` type. -Essentially, a value of type `Term` precisely describes all -possible computations performed by some program. In particular, if -two `Term` values are *equivalent*, then the programs that they -represent will always compute the same results given the same inputs. We -will say more later about exactly what it means for two terms to be -equivalent, and how to determine whether two terms are equivalent. - -Before exploring the `Term` type more deeply, it is important to -understand the role of the Cryptol language in SAW. - -# Cryptol and its Role in SAW - -Cryptol is a domain-specific language originally designed for the -high-level specification of cryptographic algorithms. It is general -enough, however, to describe a wide variety of programs, and is -particularly applicable to describing computations that operate on -streams of data of some fixed size. - -In addition to being integrated into SAW, Cryptol is a standalone -language with its own manual: - -~~~~ -http://cryptol.net/files/ProgrammingCryptol.pdf -~~~~ - -SAW includes deep support for Cryptol, and in fact requires the use of -Cryptol for most non-trivial tasks. To fully understand the rest of -this manual and to effectively use SAW, you will need to develop at least -a rudimentary understanding of Cryptol. - -The primary use of Cryptol within SAWScript is to construct values of type -`Term`. Although `Term` values can be constructed from various sources, -inline Cryptol expressions are the most direct and convenient way to create -them. - -Specifically, a Cryptol expression can be placed inside double curly -braces (`{{` and `}}`), resulting in a value of type `Term`. As a very -simple example, there is no built-in integer addition operation in -SAWScript. However, we can use Cryptol's built-in integer addition operator -within SAWScript as follows: - -~~~~ -sawscript> let t = {{ 0x22 + 0x33 }} -sawscript> print t -85 -sawscript> :type t -Term -~~~~ - -Although it printed out in the same way as an `Int`, it is important to -note that `t` actually has type `Term`. We can see how this term is -represented internally, before being evaluated, with the `print_term` -function. - -~~~~ -sawscript> print_term t -let { x@1 = Prelude.Vec 8 Prelude.Bool - x@2 = Cryptol.TCNum 8 - x@3 = Cryptol.PLiteralSeqBool x@2 - } - in Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool x@2) - (Cryptol.ecNumber (Cryptol.TCNum 34) x@1 x@3) - (Cryptol.ecNumber (Cryptol.TCNum 51) x@1 x@3) -~~~~ - -For the moment, it's not important to understand what this output means. -We show it only to clarify that `Term` values have their own internal -structure that goes beyond what exists in SAWScript. The internal -representation of `Term` values is in a language called SAWCore. The -full semantics of SAWCore are beyond the scope of this manual. - -The text constructed by `print_term` can also be accessed -programmatically (instead of printing to the screen) using the -`show_term` function, which returns a `String`. The `show_term` function -is not a command, so it executes directly and does not need `<-` to bind -its result. Therefore, the following will have the same result as the -`print_term` command above: - -~~~~ -sawscript> let s = show_term t -sawscript> :type s -String -sawscript> print s - -~~~~ - -Numbers are printed in decimal notation by default when printing terms, -but the following two commands can change that behavior. - -* `set_ascii : Bool -> TopLevel ()`, when passed `true`, makes -subsequent `print_term` or `show_term` commands print sequences of bytes -as ASCII strings (and doesn't affect printing of anything else). - -* `set_base : Int -> TopLevel ()` prints all bit vectors in the given -base, which can be between 2 and 36 (inclusive). - -A `Term` that represents an integer (any bit vector, as affected by -`set_base`) can be translated into a SAWScript `Int` using the -`eval_int : Term -> Int` function. This function returns an -`Int` if the `Term` can be represented as one, and fails at runtime -otherwise. - -~~~~ -sawscript> print (eval_int t) -85 -sawscript> print (eval_int {{ True }}) - -"eval_int" (:1:1): -eval_int: argument is not a finite bitvector -sawscript> print (eval_int {{ [True] }}) -1 -~~~~ - -Similarly, values of type `Bit` in Cryptol can be translated into values -of type `Bool` in SAWScript using the `eval_bool : Term -> Bool` function: - -~~~~ -sawscript> let b = {{ True }} -sawscript> print_term b -Prelude.True -sawscript> print (eval_bool b) -true -~~~~ - -Anything with sequence type in Cryptol can be translated into a list of -`Term` values in SAWScript using the `eval_list : Term -> [Term]` function. - -~~~~ -sawscript> let l = {{ [0x01, 0x02, 0x03] }} -sawscript> print_term l -let { x@1 = Prelude.Vec 8 Prelude.Bool - x@2 = Cryptol.PLiteralSeqBool (Cryptol.TCNum 8) - } - in [Cryptol.ecNumber (Cryptol.TCNum 1) x@1 x@2 - ,Cryptol.ecNumber (Cryptol.TCNum 2) x@1 x@2 - ,Cryptol.ecNumber (Cryptol.TCNum 3) x@1 x@2] -sawscript> print (eval_list l) -[Cryptol.ecNumber (Cryptol.TCNum 1) (Prelude.Vec 8 Prelude.Bool) - (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) -,Cryptol.ecNumber (Cryptol.TCNum 2) (Prelude.Vec 8 Prelude.Bool) - (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) -,Cryptol.ecNumber (Cryptol.TCNum 3) (Prelude.Vec 8 Prelude.Bool) - (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8))] -~~~~ - -Finally, a list of `Term` values in SAWScript can be collapsed into a single -`Term` with sequence type using the `list_term : [Term] -> Term` function, -which is the inverse of `eval_list`. - -~~~~ -sawscript> let ts = eval_list l -sawscript> let l = list_term ts -sawscript> print_term l -let { x@1 = Prelude.Vec 8 Prelude.Bool - x@2 = Cryptol.PLiteralSeqBool (Cryptol.TCNum 8) - } - in [Cryptol.ecNumber (Cryptol.TCNum 1) x@1 x@2 - ,Cryptol.ecNumber (Cryptol.TCNum 2) x@1 x@2 - ,Cryptol.ecNumber (Cryptol.TCNum 3) x@1 x@2] -~~~~ - -In addition to being able to extract integer and Boolean values from -Cryptol expressions, `Term` values can be injected into Cryptol -expressions. When SAWScript evaluates a Cryptol expression between `{{` -and `}}` delimiters, it does so with several extra bindings in scope: - -* Any variable in scope that has SAWScript type `Bool` is visible in - Cryptol expressions as a value of type `Bit`. - -* Any variable in scope that has SAWScript type `Int` is visible in - Cryptol expressions as a *type variable*. Type variables can be - demoted to numeric bit vector values using the backtick (`` ` ``) - operator. - -* Any variable in scope that has SAWScript type `Term` is visible in - Cryptol expressions as a value with the Cryptol type corresponding to - the internal type of the term. The power of this conversion is that - the `Term` does not need to have originally been derived from a - Cryptol expression. - -In addition to these rules, bindings created at the Cryptol level, -either from included files or inside Cryptol quoting brackets, are -visible only to later Cryptol expressions, and not as SAWScript -variables. - -To make these rules more concrete, consider the following examples. If -we bind a SAWScript `Int`, we can use it as a Cryptol type variable. If -we create a `Term` variable that internally has function type, we can -apply it to an argument within a Cryptol expression, but not at the -SAWScript level: - -~~~~ -sawscript> let n = 8 -sawscript> :type n -Int -sawscript> let {{ f (x : [n]) = x + 1 }} -sawscript> :type {{ f }} -Term -sawscript> :type f - -:1:1-1:2: unbound variable: "f" (:1:1-1:2) -sawscript> print {{ f 2 }} -3 -~~~~ - -If `f` was a binding of a SAWScript variable to a `Term` of function -type, we would get a different error: - -~~~~ -sawscript> let f = {{ \(x : [n]) -> x + 1 }} -sawscript> :type {{ f }} -Term -sawscript> :type f -Term -sawscript> print {{ f 2 }} -3 -sawscript> print (f 2) - -type mismatch: Int -> t.0 and Term - at "_" (REPL) - mismatched type constructors: (->) and Term -~~~~ - -One subtlety of dealing with `Term`s constructed from Cryptol is that -because the Cryptol expressions themselves are type checked by the -Cryptol type checker, and because they may make use of other `Term` -values already in scope, they are not type checked until the Cryptol -brackets are evaluated. So type errors at the Cryptol level may occur at -runtime from the SAWScript perspective (though they occur before the -Cryptol expressions are run). - -So far, we have talked about using Cryptol *value* expressions. However, -SAWScript can also work with Cryptol *types*. The most direct way to -refer to a Cryptol type is to use type brackets: `{|` and `|}`. Any -Cryptol type written between these brackets becomes a `Type` value in -SAWScript. Some types in Cryptol are *numeric* (also known as *size*) -types, and correspond to non-negative integers. These can be translated -into SAWScript integers with the `eval_size` function. For example: - -~~~~ -sawscript> let {{ type n = 16 }} -sawscript> eval_size {| n |} -16 -sawscript> eval_size {| 16 |} -16 -~~~~ - -For non-numeric types, `eval_size` fails at runtime: - -~~~~ -sawscript> eval_size {| [16] |} - -"eval_size" (:1:1): -eval_size: not a numeric type -~~~~ - -In addition to the use of brackets to write Cryptol expressions inline, -several built-in functions can extract `Term` values from Cryptol files -in other ways. The `import` command at the top level imports all -top-level definitions from a Cryptol file and places them in scope -within later bracketed expressions. This includes [Cryptol `foreign` -declarations](https://galoisinc.github.io/cryptol/master/FFI.html). If a -[Cryptol implementation of a foreign -function](https://galoisinc.github.io/cryptol/master/FFI.html#cryptol-implementation-of-foreign-functions) -is present, then it will be used as the definition when reasoning about -the function. Otherwise, the function will be imported as an opaque -constant with no definition. - -The `cryptol_load` command behaves similarly, but returns a -`CryptolModule` instead. If any `CryptolModule` is in scope, its -contents are available qualified with the name of the `CryptolModule` -variable. A specific definition can be explicitly extracted from a -`CryptolModule` using the `cryptol_extract` command: - -* `cryptol_extract : CryptolModule -> String -> TopLevel Term` - -# Transforming Term Values - -The three primary functions of SAW are *extracting* models (`Term` -values) from programs, *transforming* those models, and *proving* -properties about models using external provers. So far we've shown how -to construct `Term` values from Cryptol programs; later sections -will describe how to extract them from other programs. Now we show how -to use the various term transformation features available in SAW. - -## Rewriting - -Rewriting a `Term` consists of applying one or more *rewrite rules* to -it, resulting in a new `Term`. A rewrite rule in SAW can be specified in -multiple ways: - - 1. as the definition of a function that can be unfolded, - 1. as a term of Boolean type (or a function returning a Boolean) that - is an equality statement, and - 1. as a term of _equality type_ with a body that encodes a proof that - the equality in the type is valid. - -In each case the term logically consists of two sides and describes a -way to transform the left side into the right side. Each side may -contain variables (bound by enclosing lambda expressions) and is -therefore a *pattern* which can match any term in which each variable -represents an arbitrary sub-term. The left-hand pattern describes a term -to match (which may be a sub-term of the full term being rewritten), and -the right-hand pattern describes a term to replace it with. Any variable -in the right-hand pattern must also appear in the left-hand pattern and -will be instantiated with whatever sub-term matched that variable in the -original term. - -For example, say we have the following Cryptol function: - -~~~~ - \(x:[8]) -> (x * 2) + 1 -~~~~ - -We might for some reason want to replace multiplication by a power of -two with a shift. We can describe this replacement using an equality -statement in Cryptol (a rule of form 2 above): - -~~~~ -\(y:[8]) -> (y * 2) == (y << 1) -~~~~ - -Interpreting this as a rewrite rule, it says that for any 8-bit vector -(call it `y` for now), we can replace `y * 2` with `y << 1`. Using this -rule to rewrite the earlier expression would then yield: - -~~~~ - \(x:[8]) -> (x << 1) + 1 -~~~~ - -The general philosophy of rewriting is that the left and right patterns, -while syntactically different, should be semantically equivalent. -Therefore, applying a set of rewrite rules should not change the -fundamental meaning of the term being rewritten. SAW is particularly -focused on the task of proving that some logical statement expressed as -a `Term` is always true. If that is in fact the case, then the entire -term can be replaced by the term `True` without changing its meaning. The -rewriting process can in some cases, by repeatedly applying rules that -themselves are known to be valid, reduce a complex term entirely to -`True`, which constitutes a proof of the original statement. In other -cases, rewriting can simplify terms before sending them to external -automated provers that can then finish the job. Sometimes this -simplification can help the automated provers run more quickly, and -sometimes it can help them prove things they would otherwise be unable -to prove by applying reasoning steps (rewrite rules) that are not -available to the automated provers. - -In practical use, rewrite rules can be aggregated into `Simpset` -values in SAWScript. A few pre-defined `Simpset` values exist: - -* `empty_ss : Simpset` is the empty set of rules. Rewriting with it -should have no effect, but it is useful as an argument to some of the -functions that construct larger `Simpset` values. - -* `basic_ss : Simpset` is a collection of rules that are useful in most -proof scripts. - -* `cryptol_ss : () -> Simpset` includes a collection of Cryptol-specific -rules. Some of these simplify away the abstractions introduced in the -translation from Cryptol to SAWCore, which can be useful when proving -equivalence between Cryptol and non-Cryptol code. Leaving these -abstractions in place is appropriate when comparing only Cryptol code, -however, so `cryptol_ss` is not included in `basic_ss`. - -The next set of functions can extend or apply a `Simpset`: - -* `addsimp' : Term -> Simpset -> Simpset` adds a single `Term` to an -existing `Simpset. - -* `addsimps' : [Term] -> Simpset -> Simpset` adds a list of `Term`s to -an existing `Simpset`. - -* `rewrite : Simpset -> Term -> Term` applies a `Simpset` to an existing -`Term` to produce a new `Term`. - -To make this more concrete, we examine how the rewriting example -sketched above, to convert multiplication into shift, can work in -practice. We simplify everything with `cryptol_ss` as we go along so -that the `Term`s don't get too cluttered. First, we declare the term -to be transformed: - -~~~~ -sawscript> let term = rewrite (cryptol_ss ()) {{ \(x:[8]) -> (x * 2) + 1 }} -sawscript> print_term term -\(x : Prelude.Vec 8 Prelude.Bool) -> - Prelude.bvAdd 8 (Prelude.bvMul 8 x (Prelude.bvNat 8 2)) - (Prelude.bvNat 8 1) -~~~~ - -Next, we declare the rewrite rule: - -~~~~ -sawscript> let rule = rewrite (cryptol_ss ()) {{ \(y:[8]) -> (y * 2) == (y << 1) }} -sawscript> print_term rule -let { x@1 = Prelude.Vec 8 Prelude.Bool - } - in \(y : x@1) -> - Cryptol.ecEq x@1 (Cryptol.PCmpWord 8) - (Prelude.bvMul 8 y (Prelude.bvNat 8 2)) - (Prelude.bvShiftL 8 Prelude.Bool 1 Prelude.False y - (Prelude.bvNat 1 1)) -~~~~ - -Finally, we apply the rule to the target term: - -~~~~ -sawscript> let result = rewrite (addsimp' rule empty_ss) term -sawscript> print_term result -\(x : Prelude.Vec 8 Prelude.Bool) -> - Prelude.bvAdd 8 - (Prelude.bvShiftL 8 Prelude.Bool 1 Prelude.False x - (Prelude.bvNat 1 1)) - (Prelude.bvNat 8 1) -~~~~ - -Note that `addsimp'` and `addsimps'` take a `Term` or list of `Term`s; -these could in principle be anything, and are not necessarily terms -representing logically valid equalities. They have `'` suffixes because -they are not intended to be the primary interface to rewriting. When using -these functions, the soundness of the proof process depends on the -correctness of these rules as a side condition. - -The primary interface to rewriting uses the `Theorem` type instead of -the `Term` type, as shown in the signatures for `addsimp` and -`addsimps`. - -* `addsimp : Theorem -> Simpset -> Simpset` adds a single `Theorem` to a -`Simpset`. - -* `addsimps : [Theorem] -> Simpset -> Simpset` adds several `Theorem` -values to a `Simpset`. - -A `Theorem` is essentially a `Term` that is proven correct in some way. -In general, a `Theorem` can be any statement, and may not be useful as a -rewrite rule. However, if it has an appropriate shape it can be used for -rewriting. In the ["Proofs about Terms"](#proofs-about-terms) section, -we'll describe how to construct `Theorem` values from `Term` values. - -In the absence of user-constructed `Theorem` values, there are some -additional built-in rules that are not included in either `basic_ss` and -`cryptol_ss` because they are not always beneficial, but that can -sometimes be helpful or essential. The `cryptol_ss` simpset includes -rewrite rules to unfold all definitions in the `Cryptol` SAWCore module, -but does not include any of the terms of equality type. - -* `add_cryptol_defs : `[String] -> Simpset -> Simpset` adds unfolding -rules for functions with the given names from the SAWCore `Cryptol` module -to the given `Simpset`. - -* `add_cryptol_eqs : [String] -> Simpset -> Simpset` adds the terms of -equality type with the given names from the SAWCore `Cryptol` module to -the given `Simpset`. - -* `add_prelude_defs : [String] -> Simpset -> Simpset` adds unfolding -rules from the SAWCore `Prelude` module to a `Simpset`. - -* `add_prelude_eqs : [String] -> Simpset -> Simpset` adds equality-typed -terms from the SAWCore `Prelude` module to a `Simpset`. - -Finally, it's possible to construct a theorem from an arbitrary SAWCore -expression (rather than a Cryptol expression), using the `core_axiom` -function. - -* `core_axiom : String -> Theorem` creates a `Theorem` from a `String` -in SAWCore syntax. Any `Theorem` introduced by this function is assumed -to be correct, so use it with caution. - -## Folding and Unfolding - -A SAWCore term can be given a name using the `define` function, and is -then by default printed as that name alone. A named subterm can be -"unfolded" so that the original definition appears again. - -* `define : String -> Term -> TopLevel Term` - -* `unfold_term : [String] -> Term -> Term` - -For example: - -~~~~ -sawscript> let t = {{ 0x22 }} -sawscript> print_term t -Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) - (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) -sawscript> t' <- define "t" t -sawscript> print_term t' -t -sawscript> let t'' = unfold_term ["t"] t' -sawscript> print_term t'' -Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) - (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) -~~~~ - -This process of folding and unfolding is useful both to make large terms -easier for humans to work with and to make automated proofs more -tractable. We'll describe the latter in more detail when we discuss -interacting with external provers. - -In some cases, folding happens automatically when constructing Cryptol -expressions. Consider the following example: - -~~~~ -sawscript> let t = {{ 0x22 }} -sawscript> print_term t -Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) - (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) -sawscript> let {{ t' = 0x22 }} -sawscript> print_term {{ t' }} -t' -~~~~ - -This illustrates that a bare expression in Cryptol braces gets -translated directly to a SAWCore term. However, a Cryptol *definition* -gets translated into a *folded* SAWCore term. In addition, because the -second definition of `t` occurs at the Cryptol level, rather than the -SAWScript level, it is visible only inside Cryptol braces. Definitions -imported from Cryptol source files are also initially folded and can be -unfolded as needed. - -## Other Built-in Transformation and Inspection Functions - -In addition to the `Term` transformation functions described so far, a -variety of others also exist. - -* `beta_reduce_term : Term -> Term` takes any sub-expression of the form -`(\x -> t) v` in the given `Term` and replaces it with a transformed -version of `t` in which all instances of `x` are replaced by `v`. - -* `replace : Term -> Term -> Term -> TopLevel Term` replaces arbitrary -subterms. A call to `replace x y t` replaces any instance of `x` inside -`t` with `y`. - -Assessing the size of a term can be particularly useful during benchmarking. -SAWScript provides two mechanisms for this. - -* `term_size : Term -> Int` calculates the number of nodes in the -Directed Acyclic Graph (DAG) representation of a `Term` used internally -by SAW. This is the most appropriate way of determining the resource use -of a particular term. - -* `term_tree_size : Term -> Int` calculates how large a `Term` would be -if it were represented by a tree instead of a DAG. This can, in general, -be much, much larger than the number returned by `term_size`, and serves -primarily as a way of assessing, for a specific term, how much benefit -there is to the term sharing used by the DAG representation. - -Finally, there are a few commands related to the internal SAWCore type of a -`Term`. - -* `check_term : Term -> TopLevel ()` checks that the internal structure -of a `Term` is well-formed and that it passes all of the rules of the -SAWCore type checker. - -* `type : Term -> Type` returns the type of a particular `Term`, which -can then be used to, for example, construct a new fresh variable with -`fresh_symbolic`. - -## Loading and Storing Terms - -Most frequently, `Term` values in SAWScript come from Cryptol, JVM, or -LLVM programs, or some transformation thereof. However, it is also -possible to obtain them from various other sources. - -* `parse_core : String -> Term` parses a `String` containing a term in -SAWCore syntax, returning a `Term`. - -* `read_core : String -> TopLevel Term` is like `parse_core`, but -obtains the text from the given file and expects it to be in the simpler -SAWCore external representation format, rather than the human-readable -syntax shown so far. - -* `read_aig : String -> TopLevel Term` returns a `Term` representation -of an And-Inverter-Graph (AIG) file in AIGER format. - -* `read_bytes : String -> TopLevel Term` reads a constant sequence of -bytes from a file and represents it as a `Term`. Its result will always -have Cryptol type `[n][8]` for some `n`. - -It is also possible to write `Term` values into files in various -formats, including: AIGER (`write_aig`), CNF (`write_cnf`), SAWCore -external representation (`write_core`), and SMT-Lib version 2 -(`write_smtlib2`). - -* `write_aig : String -> Term -> TopLevel ()` - -* `write_cnf : String -> Term -> TopLevel ()` - -* `write_core : String -> Term -> TopLevel ()` - -* `write_smtlib2 : String -> Term -> TopLevel ()` - -# Proofs about Terms - -The goal of SAW is to facilitate proofs about the behavior of -programs. It may be useful to prove some small fact to use as a rewrite -rule in later proofs, but ultimately these rewrite rules come together -into a proof of some higher-level property about a software system. - -Whether proving small lemmas (in the form of rewrite rules) or a -top-level theorem, the process builds on the idea of a *proof script* -that is run by one of the top level proof commands. - -* `prove_print : ProofScript () -> Term -> TopLevel Theorem` -takes a proof script (which we'll describe next) and a `Term`. The -`Term` should be of function type with a return value of `Bool` (`Bit` -at the Cryptol level). It will then use the proof script to attempt to -show that the `Term` returns `True` for all possible inputs. If it is -successful, it will print `Valid` and return a `Theorem`. If not, it -will abort. - -* `sat_print : ProofScript () -> Term -> TopLevel ()` is similar -except that it looks for a *single* value for which the `Term` evaluates -to `True` and prints out that value, returning nothing. - -* `prove_core : ProofScript () -> String -> TopLevel Theorem` -proves and returns a `Theorem` from a string in SAWCore syntax. - -## Automated Tactics - -The simplest proof scripts just specify the automated prover to use. -The `ProofScript` values `abc` and `z3` select the ABC and Z3 theorem -provers, respectively, and are typically good choices. - -For example, combining `prove_print` with `abc`: - -~~~~ -sawscript> t <- prove_print abc {{ \(x:[8]) -> x+x == x*2 }} -Valid -sawscript> t -Theorem (let { x@1 = Prelude.Vec 8 Prelude.Bool - x@2 = Cryptol.TCNum 8 - x@3 = Cryptol.PArithSeqBool x@2 - } - in (x : x@1) --> Prelude.EqTrue - (Cryptol.ecEq x@1 (Cryptol.PCmpSeqBool x@2) - (Cryptol.ecPlus x@1 x@3 x x) - (Cryptol.ecMul x@1 x@3 x - (Cryptol.ecNumber (Cryptol.TCNum 2) x@1 - (Cryptol.PLiteralSeqBool x@2))))) -~~~~ - -Similarly, `sat_print` will show that the function returns `True` for -one specific input (which it should, since we already know it returns -`True` for all inputs): - -~~~~ -sawscript> sat_print abc {{ \(x:[8]) -> x+x == x*2 }} -Sat: [x = 0] -~~~~ - -In addition to these, the `bitwuzla`, `boolector`, `cvc4`, `cvc5`, `mathsat`, -and `yices` provers are available. The internal decision procedure `rme`, short -for Reed-Muller Expansion, is an automated prover that works particularly well -on the Galois field operations that show up, for example, in AES. - -In more complex cases, some pre-processing can be helpful or necessary -before handing the problem off to an automated prover. The -pre-processing can involve rewriting, beta reduction, unfolding, the use -of provers that require slightly more configuration, or the use of -provers that do very little real work. - -## Proof Script Diagnostics - -During development of a proof, it can be useful to print various -information about the current goal. The following tactics are useful in -that context. - -* `print_goal : ProofScript ()` prints the entire goal in SAWCore -syntax. - -* `print_goal_consts : ProofScript ()` prints a list of unfoldable constants -in the current goal. - -* `print_goal_depth : Int -> ProofScript ()` takes an integer argument, `n`, -and prints the goal up to depth `n`. Any elided subterms are printed -with a `...` notation. - -* `print_goal_size : ProofScript ()` prints the number of nodes in the -DAG representation of the goal. - -## Rewriting in Proof Scripts - -One of the key techniques available for completing proofs in SAWScript -is the use of rewriting or transformation. The following commands -support this approach. - -* `simplify : Simpset -> ProofScript ()` works just like `rewrite`, -except that it works in a `ProofScript` context and implicitly -transforms the current (unnamed) goal rather than taking a `Term` as a -parameter. - -* `goal_eval : ProofScript ()` will evaluate the current proof goal to a -first-order combination of primitives. - -* `goal_eval_unint : [String] -> ProofScript ()` works like `goal_eval` -but avoids expanding or simplifying the given names. - -## Other Transformations - -Some useful transformations are not easily specified using equality -statements, and instead have special tactics. - -* `beta_reduce_goal : ProofScript ()` works like `beta_reduce_term` but -on the current goal. It takes any sub-expression of the form `(\x -> t) -v` and replaces it with a transformed version of `t` in which all -instances of `x` are replaced by `v`. - -* `unfolding : [String] -> ProofScript ()` works like `unfold_term` but -on the current goal. - -Using `unfolding` is mostly valuable for proofs -based entirely on rewriting, since the default behavior for automated -provers is to unfold everything before sending a goal to a prover. -However, with some provers it is possible to indicate that specific -named subterms should be represented as uninterpreted functions. - -* `unint_bitwuzla : [String] -> ProofScript ()` - -* `unint_cvc4 : [String] -> ProofScript ()` - -* `unint_cvc5 : [String] -> ProofScript ()` - -* `unint_yices : [String] -> ProofScript ()` - -* `unint_z3 : [String] -> ProofScript ()` - -The list of `String` arguments in these cases indicates the names of the -subterms to leave folded, and therefore present as uninterpreted -functions to the prover. To determine which folded constants appear in a -goal, use the `print_goal_consts` function described above. - -Ultimately, we plan to implement a more generic tactic that leaves -certain constants uninterpreted in whatever prover is ultimately used -(provided that uninterpreted functions are expressible in the prover). - -Note that each of the `unint_*` tactics have variants that are prefixed -with `sbv_` and `w4_`. The `sbv_`-prefixed tactics make use of the SBV -library to represent and solve SMT queries: - -* `sbv_unint_bitwuzla : [String] -> ProofScript ()` - -* `sbv_unint_cvc4 : [String] -> ProofScript ()` - -* `sbv_unint_cvc5 : [String] -> ProofScript ()` - -* `sbv_unint_yices : [String] -> ProofScript ()` - -* `sbv_unint_z3 : [String] -> ProofScript ()` - -The `w4_`-prefixed tactics make use of the What4 library instead of SBV: - -* `w4_unint_bitwuzla : [String] -> ProofScript ()` - -* `w4_unint_cvc4 : [String] -> ProofScript ()` - -* `w4_unint_cvc5 : [String] -> ProofScript ()` - -* `w4_unint_yices : [String] -> ProofScript ()` - -* `w4_unint_z3 : [String] -> ProofScript ()` - -In most specifications, the choice of SBV versus What4 is not important, as -both libraries are broadly compatible in terms of functionality. There are some -situations where one library may outpeform the other, however, due to -differences in how each library represents certain SMT queries. There are also -some experimental features that are only supported with What4 at the moment, -such as `enable_lax_loads_and_stores`. - -## Caching Solver Results - -SAW has the capability to cache the results of tactics which call out to -automated provers. This can save a considerable amount of time in cases such as -proof development and CI, where the same proof scripts are often run repeatedly -without changes. - -This caching is available for all tactics which call out to automated provers -at runtime: `abc`, `boolector`, `cvc4`, `cvc5`, `mathsat`, `yices`, `z3`, -`rme`, and the family of `unint` tactics described in the previous section. - -When solver caching is enabled and one of the tactics mentioned above is -encountered, if there is already an entry in the cache corresponding to the -call then the cached result is used, otherwise the appropriate solver is -queried, and the result saved to the cache. Entries are indexed by a SHA256 -hash of the exact query to the solver (ignoring variable names), any options -passed to the solver, and the names and full version strings of all the solver -backends involved (e.g. ABC and SBV for the `abc` tactic). This ensures cached -results are only used when they would be identical to the result of actually -running the tactic. - -The simplest way to enable solver caching is to set the environment variable -`SAW_SOLVER_CACHE_PATH`. With this environment variable set, `saw` and -`saw-remote-api` will automatically keep an [LMDB](http://www.lmdb.tech/doc/) -database at the given path containing the solver result cache. Setting this -environment variable globally therefore creates a global, concurrency-safe -solver result cache used by all newly created `saw` or `saw-remote-api` -processes. Note that when this environment variable is set, SAW does not create -a cache at the specified path until it is actually needed. - -There are also a number of SAW commands related to solver caching. - -* `set_solver_cache_path` is like setting `SAW_SOLVER_CACHE_PATH` for the - remainder of the current session, but opens an LMDB database at the specified - path immediately. If a cache is already in use in the current session - (i.e. through a prior call to `set_solver_cache_path` or through - `SAW_SOLVER_CACHE_PATH` being set and the cache being used at least once) - then all entries in the cache already in use will be copied to the new cache - being opened. - -* `clean_mismatched_versions_solver_cache` will remove all entries in the - solver result cache which were created using solver backend versions which do - not match the versions in the current environment. This can be run after an - update to clear out any old, unusable entries from the solver cache. This - command can also be run directly from the command line through the - `--clean-mismatched-versions-solver-cache` command-line option. - -* `print_solver_cache` prints to the console all entries in the cache whose - SHA256 hash keys start with the given hex string. Providing an empty string - results in all entries in the cache being printed. - -* `print_solver_cache_stats` prints to the console statistics including the - size of the solver cache, where on disk it is stored, and some counts of how - often it has been used during the current session. - -For performing more complicated database operations on the set of cached -results, the file `solver_cache.py` is provided with the Python bindings of the -SAW Remote API. This file implements a general-purpose Python interface for -interacting with the LMDB databases kept by SAW for solver caching. - -Below is an example of using solver caching with `saw -v Debug`. Only the -relevant output is shown, the rest abbreviated with "...". - -~~~~ -sawscript> set_solver_cache_path "example.cache" -sawscript> prove_print z3 {{ \(x:[8]) -> x+x == x*2 }} -[22:13:00.832] Caching result: d1f5a76e7a0b7c01 (SBV 9.2, Z3 4.8.7 - 64 bit) -... -sawscript> prove_print z3 {{ \(new:[8]) -> new+new == new*2 }} -[22:13:04.122] Using cached result: d1f5a76e7a0b7c01 (SBV 9.2, Z3 4.8.7 - 64 bit) -... -sawscript> prove_print (w4_unint_z3_using "qfnia" []) \ - {{ \(x:[8]) -> x+x == x*2 }} -[22:13:09.484] Caching result: 4ee451f8429c2dfe (What4 v1.3-29-g6c462cd using qfnia, Z3 4.8.7 - 64 bit) -... -sawscript> print_solver_cache "d1f5a76e7a0b7c01" -[22:13:13.250] SHA: d1f5a76e7a0b7c01bdfe7d0e1be82b4f233a805ae85a287d45933ed12a54d3eb -[22:13:13.250] - Result: unsat -[22:13:13.250] - Solver: "SBV->Z3" -[22:13:13.250] - Versions: SBV 9.2, Z3 4.8.7 - 64 bit -[22:13:13.250] - Last used: 2023-07-25 22:13:04.120351 UTC - -sawscript> print_solver_cache "4ee451f8429c2dfe" -[22:13:16.727] SHA: 4ee451f8429c2dfefecb6216162bd33cf053f8e66a3b41833193529449ef5752 -[22:13:16.727] - Result: unsat -[22:13:16.727] - Solver: "W4 ->z3" -[22:13:16.727] - Versions: What4 v1.3-29-g6c462cd using qfnia, Z3 4.8.7 - 64 bit -[22:13:16.727] - Last used: 2023-07-25 22:13:09.484464 UTC - -sawscript> print_solver_cache_stats -[22:13:20.585] == Solver result cache statistics == -[22:13:20.585] - 2 results cached in example.cache -[22:13:20.585] - 2 insertions into the cache so far this run (0 failed attempts) -[22:13:20.585] - 1 usage of cached results so far this run (0 failed attempts) -~~~~ - -## Other External Provers - -In addition to the built-in automated provers already discussed, SAW -supports more generic interfaces to other arbitrary theorem provers -supporting specific interfaces. - -* `external_aig_solver : String -> [String] -> ProofScript ()` -supports theorem provers that can take input as a single-output AIGER -file. The first argument is the name of the executable to run. The -second argument is the list of command-line parameters to pass to that -executable. Any element of this list equal to `"%f"` will be replaced -with the name of the temporary AIGER file generated for the proof goal. -The output from the solver is expected to be in DIMACS solution format. - -* `external_cnf_solver : String -> [String] -> ProofScript ()` -works similarly but for SAT solvers that take input in DIMACS CNF format -and produce output in DIMACS solution format. - -## Offline Provers - -For provers that must be invoked in more complex ways, or to defer proof -until a later time, there are functions to write the current goal to a -file in various formats, and then assume that the goal is valid through -the rest of the script. - -* `offline_aig : String -> ProofScript ()` - -* `offline_cnf : String -> ProofScript ()` - -* `offline_extcore : String -> ProofScript ()` - -* `offline_smtlib2 : String -> ProofScript ()` - -* `offline_unint_smtlib2 : [String] -> String -> ProofScript ()` - -These support the AIGER, DIMACS CNF, shared SAWCore, and SMT-Lib v2 -formats, respectively. The shared representation for SAWCore is -described [in the `saw-script` -repository](https://github.com/GaloisInc/saw-script/blob/master/doc/extcore.md). -The `offline_unint_smtlib2` command represents the folded subterms -listed in its first argument as uninterpreted functions. - -## Finishing Proofs without External Solvers - -Some proofs can be completed using unsound placeholders, or using -techniques that do not require significant computation. - -* `assume_unsat : ProofScript ()` indicates that the current goal -should be assumed to be unsatisfiable. This is an alias for -`assume_valid`. Users should prefer to use `admit` instead. - -* `assume_valid : ProofScript ()` indicates that the current -goal should be assumed to be valid. Users should prefer to -use `admit` instead - -* `admit : String -> ProofScript ()` indicates that the current -goal should be assumed to be valid without proof. The given -string should be used to record why the user has decided to -assume this proof goal. - -* `quickcheck : Int -> ProofScript ()` runs the goal on the given -number of random inputs, and succeeds if the result of evaluation is -always `True`. This is unsound, but can be helpful during proof -development, or as a way to provide some evidence for the validity of a -specification believed to be true but difficult or infeasible to prove. - -* `trivial : ProofScript ()` states that the current goal should -be trivially true. This tactic recognizes instances of equality -that can be demonstrated by conversion alone. In particular -it is able to prove `EqTrue x` goals where `x` reduces to -the constant value `True`. It fails if this is not the case. - -## Multiple Goals - -The proof scripts shown so far all have a single implicit goal. As in -many other interactive provers, however, SAWScript proofs can have -multiple goals. The following commands can introduce or work with -multiple goals. These are experimental and can be used only after -`enable_experimental` has been called. - -* `goal_apply : Theorem -> ProofScript ()` will apply a given -introduction rule to the current goal. This will result in zero or more -new subgoals. - -* `goal_assume : ProofScript Theorem` will convert the first hypothesis -in the current proof goal into a local `Theorem` - -* `goal_insert : Theorem -> ProofScript ()` will insert a given -`Theorem` as a new hypothesis in the current proof goal. - -* `goal_intro : String -> ProofScript Term` will introduce a quantified -variable in the current proof goal, returning the variable as a `Term`. - -* `goal_when : String -> ProofScript () -> ProofScript ()` will run the -given proof script only when the goal name contains the given string. - -* `goal_exact : Term -> ProofScript ()` will attempt to use the given -term as an exact proof for the current goal. This tactic will succeed -whever the type of the given term exactly matches the current goal, -and will fail otherwise. - -* `split_goal : ProofScript ()` will split a goal of the form -`Prelude.and prop1 prop2` into two separate goals `prop1` and `prop2`. - -## Proof Failure and Satisfying Assignments - -The `prove_print` and `sat_print` commands print out their essential -results (potentially returning a `Theorem` in the case of -`prove_print`). In some cases, though, one may want to act -programmatically on the result of a proof rather than displaying it. - -The `prove` and `sat` commands allow this sort of programmatic analysis -of proof results. To allow this, they use two types we haven't mentioned -yet: `ProofResult` and `SatResult`. These are different from the other -types in SAWScript because they encode the possibility of two outcomes. -In the case of `ProofResult`, a statement may be valid or there may be a -counter-example. In the case of `SatResult`, there may be a satisfying -assignment or the statement may be unsatisfiable. - -* `prove : ProofScript SatResult -> Term -> TopLevel ProofResult` - -* `sat : ProofScript SatResult -> Term -> TopLevel SatResult` - -To operate on these new types, SAWScript includes a pair of functions: - -* `caseProofResult : {b} ProofResult -> b -> (Term -> b) -> b` takes a -`ProofResult`, a value to return in the case that the statement is -valid, and a function to run on the counter-example, if there is one. - -* `caseSatResult : {b} SatResult -> b -> (Term -> b) -> b` has the same -shape: it returns its first argument if the result represents an -unsatisfiable statement, or its second argument applied to a satisfying -assignment if it finds one. - -## AIG Values and Proofs - -Most SAWScript programs operate on `Term` values, and in most cases this -is the appropriate representation. It is possible, however, to represent -the same function that a `Term` may represent using a different data -structure: an And-Inverter-Graph (AIG). An AIG is a representation of a -Boolean function as a circuit composed entirely of AND gates and -inverters. Hardware synthesis and verification tools, including the ABC -tool that SAW has built in, can do efficient verification and -particularly equivalence checking on AIGs. - -To take advantage of this capability, a handful of built-in commands can -operate on AIGs. - -* `bitblast : Term -> TopLevel AIG` represents a `Term` as an `AIG` by -"blasting" all of its primitive operations (things like bit-vector -addition) down to the level of individual bits. - -* `load_aig : String -> TopLevel AIG` loads an `AIG` from an external -AIGER file. - -* `save_aig : String -> AIG -> TopLevel ()` saves an `AIG` to an -external AIGER file. - -* `save_aig_as_cnf : String -> AIG -> TopLevel ()` writes an `AIG` out -in CNF format for input into a standard SAT solver. - -# Symbolic Execution - -Analysis of Java and LLVM within SAWScript relies heavily on *symbolic -execution*, so some background on how this process works can help with -understanding the behavior of the available built-in functions. - -At the most abstract level, symbolic execution works like normal program -execution except that the values of all variables within the program can be -arbitrary *expressions*, potentially containing free variables, rather than -concrete values. Therefore, each symbolic execution corresponds to some set -of possible concrete executions. - -As a concrete example, consider the following C program that returns -the maximum of two values: - -~~~~ c -unsigned int max(unsigned int x, unsigned int y) { - if (y > x) { - return y; - } else { - return x; - } -} -~~~~ - -If you call this function with two concrete inputs, like this: - -~~~~ c -int r = max(5, 4); -~~~~ - -then it will assign the value `5` to `r`. However, we can also consider what -it will do for *arbitrary* inputs. Consider the following example: - -~~~~ c -int r = max(a, b); -~~~~ - -where `a` and `b` are variables with unknown values. It is still -possible to describe the result of the `max` function in terms of `a` -and `b`. The following expression describes the value of `r`: - -~~~~ -ite (b > a) b a -~~~~ - -where `ite` is the "if-then-else" mathematical function, which based on -the value of the first argument returns either the second or third. One -subtlety of constructing this expression, however, is the treatment of -conditionals in the original program. For any concrete values of `a` and -`b`, only one branch of the `if` statement will execute. During symbolic -execution, on the other hand, it is necessary to execute *both* -branches, track two different program states (each composed of symbolic -values), and then *merge* those states after executing the `if` -statement. This merging process takes into account the original branch -condition and introduces the `ite` expression. - -A symbolic execution system, then, is very similar to an interpreter -that has a different notion of what constitutes a value and executes -*all* paths through the program instead of just one. Therefore, the -execution process is similar to that of a normal -interpreter, and the process of generating a model for a piece of code -is similar to building a test harness for that same code. - -More specifically, the setup process for a test harness typically takes -the following form: - -* Initialize or allocate any resources needed by the code. For Java and - LLVM code, this typically means allocating memory and setting the - initial values of variables. - -* Execute the code. - -* Check the desired properties of the system state after the code - completes. - -Accordingly, three pieces of information are particularly relevant to -the symbolic execution process, and are therefore needed as input to the -symbolic execution system: - -* The initial (potentially symbolic) state of the system. - -* The code to execute. - -* The final state of the system, and which parts of it are relevant to - the properties being tested. - -In the following sections, we describe how the Java and LLVM analysis -primitives work in the context of these key concepts. We start with the -simplest situation, in which the structure of the initial and final -states can be directly inferred, and move on to more complex cases that -require more information from the user. - -# Symbolic Termination - -Above we described the process of executing multiple branches and -merging the results when encountering a conditional statement in the -program. When a program contains loops, the branch that chooses to -continue or terminate a loop could go either way. Therefore, without a -bit more information, the most obvious implementation of symbolic -execution would never terminate when executing programs that contain -loops. - -The solution to this problem is to analyze the branch condition whenever -considering multiple branches. If the condition for one branch can never -be true in the context of the current symbolic state, there is no reason -to execute that branch, and skipping it can make it possible for -symbolic execution to terminate. - -Directly comparing the branch condition to a constant can sometimes be -enough to ensure termination. For example, in simple, bounded loops like -the following, comparison with a constant is sufficient. - -~~~~ c -for (int i = 0; i < 10; i++) { - // do something -} -~~~~ - -In this case, the value of `i` is always concrete, and will eventually -reach the value `10`, at which point the branch corresponding to -continuing the loop will be infeasible. - -As a more complex example, consider the following function: - -~~~~ c -uint8_t f(uint8_t i) { - int done = 0; - while (!done) { - if (i % 8 == 0) done = 1; - i += 5; - } - return i; -} -~~~~ - -The loop in this function can only be determined to symbolically -terminate if the analysis takes into account algebraic rules about -common multiples. Similarly, it can be difficult to prove that a base -case is eventually reached for all inputs to a recursive program. - -In this particular case, however, the code *is* guaranteed to terminate -after a fixed number of iterations (where the number of possible -iterations is a function of the number of bits in the integers being -used). To show that the last iteration is in fact the last possible one, -it's necessary to do more than just compare the branch condition with a -constant. Instead, we can use the same proof tools that we use to -ultimately analyze the generated models to, early in the process, prove -that certain branch conditions can never be true (i.e., are -*unsatisfiable*). - -Normally, most of the Java and LLVM analysis commands simply compare -branch conditions to the constant `True` or `False` to determine whether -a branch may be feasible. However, each form of analysis allows branch -satisfiability checking to be turned on if needed, in which case -functions like `f` above will terminate. - -Next, we examine the details of the specific commands available to -analyze JVM and LLVM programs. - -# Loading Code - -The first step in analyzing any code is to load it into the system. - -## Loading LLVM - -To load LLVM code, simply provide the location of a valid bitcode file -to the `llvm_load_module` function. - -* `llvm_load_module : String -> TopLevel LLVMModule` - -The resulting `LLVMModule` can be passed into the various functions -described below to perform analysis of specific LLVM functions. - -The LLVM bitcode parser should generally work with LLVM versions between -3.5 and 16.0, though it may be incomplete for some versions. Debug -metadata has changed somewhat throughout that version range, so is the -most likely case of incompleteness. We aim to support every version -after 3.5, however, so report any parsing failures as [on -GitHub](https://github.com/GaloisInc/saw-script/issues). - -## Loading Java - -Loading Java code is slightly more complex, because of the more -structured nature of Java packages. First, when running `saw`, three flags -control where to look for classes: - -* The `-b` flag takes the path where the `java` executable lives, which is used - to locate the Java standard library classes and add them to the class - database. Alternatively, one can put the directory where `java` lives on the - `PATH`, which SAW will search if `-b` is not set. - -* The `-j` flag takes the name of a JAR file as an argument and adds the - contents of that file to the class database. - -* The `-c` flag takes the name of a directory as an argument and adds all class - files found in that directory (and its subdirectories) to the class database. - By default, the current directory is included in the class path. - -Most Java programs will only require setting the `-b` flag (or the `PATH`), as -that is enough to bring in the standard Java libraries. Note that when -searching the `PATH`, SAW makes assumptions about where the standard library -classes live. These assumptions are likely to hold on JDK 7 or later, but they -may not hold on older JDKs on certain operating systems. If you are using an -old version of the JDK and SAW is unable to find a standard Java class, you may -need to specify the location of the standard classes' JAR file with the `-j` -flag (or, alternatively, with the `SAW_JDK_JAR` environment variable). - -Once the class path is configured, you can pass the name of a class to -the `java_load_class` function. - -* `java_load_class : String -> TopLevel JavaClass` - -The resulting `JavaClass` can be passed into the various functions -described below to perform analysis of specific Java methods. - -Java class files from any JDK newer than version 6 should work. However, -support for JDK 9 and later is experimental. Verifying code that only uses -primitive data types is known to work well, but there are some as-of-yet -unresolved issues in verifying code involving classes such as `String`. For -more information on these issues, refer to -[this GitHub issue](https://github.com/GaloisInc/crucible/issues/641). - -## Loading MIR - -To load a piece of Rust code, first compile it to a MIR JSON file, as described -in [this section](#compiling-mir), and then provide the location of the JSON -file to the `mir_load_module` function: - -* `mir_load_module : String -> TopLevel MIRModule` - -SAW currently supports Rust code that can be built with a [January 23, 2023 -Rust nightly](https://static.rust-lang.org/dist/2023-01-23/). If you encounter -a Rust feature that SAW does not support, please report it [on -GitHub](https://github.com/GaloisInc/saw-script/issues). - -## Notes on Compiling Code for SAW - -SAW will generally be able to load arbitrary LLVM bitcode, JVM bytecode, and -MIR JSON files, but several guidelines can help make verification easier or -more likely to succeed. - -### Compiling LLVM - -For generating LLVM with `clang`, it can be helpful to: - -* Turn on debugging symbols with `-g` so that SAW can find source - locations of functions, names of variables, etc. - -* Optimize with `-O1` so that the generated bitcode more closely matches - the C/C++ source, making the results more comprehensible. - -* Use `-fno-threadsafe-statics` to prevent `clang` from emitting - unnecessary pthread code. - -* Link all relevant bitcode with `llvm-link` (including, *e.g.*, the C++ - standard library when analyzing C++ code). - -All SAW proofs include side conditions to rule out undefined behavior, -and proofs will only succeed if all of these side conditions have been -discharged. However the default SAW notion of undefined behavior is with -respect to the semantics of LLVM, rather than C or C++. If you want to -rule out undefined behavior according to the C or C++ standards, -consider compiling your code with `-fsanitize=undefined` or one of the -related flags[^1] to `clang`. - -Generally, you'll also want to use `-fsanitize-trap=undefined`, or one -of the related flags, to cause the compiled code to use `llvm.trap` to -indicate the presence of undefined behavior. Otherwise, the compiled -code will call a separate function, such as -`__ubsan_handle_shift_out_of_bounds`, for each type of undefined -behavior, and SAW currently does not have built in support for these -functions (though you could manually create overrides for them in a -verification script). - -[^1]: https://clang.llvm.org/docs/UsersManual.html#controlling-code-generation - -### Compiling Java - -For Java, the only compilation flag that tends to be valuable is `-g` to -retain information about the names of function arguments and local -variables. - -### Compiling MIR - -In order to verify Rust code, SAW analyzes Rust's MIR (mid-level intermediate -representation) language. In particular, SAW analyzes a particular form of MIR -that the [`mir-json`](https://github.com/GaloisInc/mir-json) tool produces. You -will need to intall `mir-json` and run it on Rust code in order to produce MIR -JSON files that SAW can load (see [this section](#loading-mir)). You will also -need to use `mir-json` to build custom versions of the Rust standard libraries -that are more suited to verification purposes. - -If you are working from a checkout of the `saw-script` repo, you can install -the `mir-json` tool and the custom Rust standard libraries by performing the -following steps: - -1. Clone the [`crucible`](https://github.com/GaloisInc/crucible) and `mir-json` - submodules like so: - - ``` - $ git submodule update deps/crucible deps/mir-json - ``` - -2. Navigate to the `mir-json` submodule: - - ``` - $ cd deps/mir-json - ``` - -3. Follow the instructions laid out in the [`mir-json` installation - instructions](https://github.com/GaloisInc/mir-json#installation-instructions) - in order to install `mir-json`. - -4. Navigate to the - [`crux-mir`](https://github.com/GaloisInc/crucible/tree/master/crux-mir) - subdirectory of the `crucible` submodule: - - ``` - $ cd ../crucible/crux-mir/ - ``` - -5. Run the `translate_libs.sh` script: - - ``` - $ ./translate_libs.sh - ``` - - This will compile the custom versions of the Rust standard libraries using - `mir-json`, placing the results under the `rlibs` subdirectory. - -6. Finally, define a `SAW_RUST_LIBRARY_PATH` environment variable that points - to the newly created `rlibs` subdirectory: - - ``` - $ export SAW_RUST_LIBRARY_PATH=<...>/crucible/crux-mir/rlibs - ``` - -For `cargo`-based projects, `mir-json` provides a `cargo` subcommand called -`cargo saw-build` that builds a JSON file suitable for use with SAW. `cargo -saw-build` integrates directly with `cargo`, so you can pass flags to it like -any other `cargo` subcommand. For example: - -``` -# Make sure that SAW_RUST_LIBRARY_PATH is defined, as described above -$ cargo saw-build - -linking 11 mir files into <...>/example-364cf2df365c7055.linked-mir.json - -``` - -Note that: - -* The full output of `cargo saw-build` here is omitted. The important part is - the `.linked-mir.json` file that appears after `linking X mir files into`, as - that is the JSON file that must be loaded with SAW. -* `SAW_RUST_LIBRARY_PATH` should point to the the MIR JSON files for the Rust - standard library. - -`mir-json` also supports compiling individual `.rs` files through `mir-json`'s -`saw-rustc` command. As the name suggests, it accepts all of the flags that -`rustc` accepts. For example: - -``` -# Make sure that SAW_RUST_LIBRARY_PATH is defined, as described above -$ saw-rustc example.rs - -linking 11 mir files into <...>/example.linked-mir.json - -``` - -## Notes on C++ Analysis - -The distance between C++ code and LLVM is greater than between C and -LLVM, so some additional considerations come into play when analyzing -C++ code with SAW. - -The first key issue is that the C++ standard library is large and -complex, and tends to be widely used by C++ applications. To analyze -most C++ code, it will be necessary to link your code with a version of -the `libc++` library[^2] compiled to LLVM bitcode. The `wllvm` program -can[^3] be useful for this. - -The C++ standard library includes a number of key global variables, and -any code that touches them will require that they be initialized using -`llvm_alloc_global`. - -Many C++ names are slightly awkward to deal with in SAW. They may be -mangled relative to the text that appears in the C++ source code. SAW -currently only understands the mangled names. The `llvm-nm` program can -be used to show the list of symbols in an LLVM bitcode file, and the -`c++filt` program can be used to demangle them, which can help in -identifying the symbol you want to refer to. In addition, C++ names from -namespaces can sometimes include quote marks in their LLVM encoding. For -example: - -~~~~ -%"class.quux::Foo" = type { i32, i32 } -~~~~ - -This can be mentioned in SAW by saying: - -~~~~ -llvm_type "%\"class.quux::Foo\"" -~~~~ - -Finally, there is no support for calling constructors in specifications, -so you will need to construct objects piece-by-piece using, *e.g.*, -`llvm_alloc` and `llvm_points_to`. - -[^2]: https://libcxx.llvm.org/docs/BuildingLibcxx.html -[^3]: https://github.com/travitch/whole-program-llvm - -# Direct Extraction - -In the case of the `max` function described earlier, the relevant inputs -and outputs are immediately apparent. The function takes two integer -arguments, always uses both of them, and returns a single integer value, -making no other changes to the program state. - -In cases like this, a direct translation is possible, given only an -identification of which code to execute. Two functions exist to handle -such simple code. The first, for LLVM is the more stable of the two: - -* `llvm_extract : LLVMModule -> String -> TopLevel Term` - -A similar function exists for Java, but is more experimental. - -* `jvm_extract : JavaClass -> String -> TopLevel Term` - -Because of its lack of maturity, it (and later Java-related commands) -must be enabled by running the `enable_experimental` command beforehand. - -* `enable_experimental : TopLevel ()` - -The structure of these two extraction functions is essentially -identical. The first argument describes where to look for code (in -either a Java class or an LLVM module, loaded as described in the -previous section). The second argument is the name of the method or -function to extract. - -When the extraction functions complete, they return a `Term` -corresponding to the value returned by the function or method as a -function of its arguments. - -These functions currently work only for code that takes some fixed -number of integral parameters, returns an integral result, and does not -access any dynamically-allocated memory (although temporary memory -allocated during execution is allowed). - -# Creating Symbolic Variables - -The direct extraction process just discussed automatically introduces -symbolic variables and then abstracts over them, yielding a SAWScript -`Term` that reflects the semantics of the original Java, LLVM, or MIR code. -For simple functions, this is often the most convenient interface. For -more complex code, however, it can be necessary (or more natural) to -specifically introduce fresh variables and indicate what portions of the -program state they correspond to. - -* `fresh_symbolic : String -> Type -> TopLevel Term` is responsible for -creating new variables in this context. The first argument is a name -used for pretty-printing of terms and counter-examples. In many cases it -makes sense for this to be the same as the name used within SAWScript, -as in the following: - -~~~~ -x <- fresh_symbolic "x" ty; -~~~~ - -However, using the same name is not required. - -The second argument to `fresh_symbolic` is the type of the fresh -variable. Ultimately, this will be a SAWCore type; however, it is usually -convenient to specify it using Cryptol syntax with the type quoting -brackets `{|` and `|}`. For example, creating a 32-bit integer, as -might be used to represent a Java `int` or an LLVM `i32`, can be done as -follows: - -~~~~ -x <- fresh_symbolic "x" {| [32] |}; -~~~~ - -Although symbolic execution works best on symbolic variables, which are -"unbound" or "free", most of the proof infrastructure within SAW uses -variables that are *bound* by an enclosing lambda expression. Given a -`Term` with free symbolic variables, we can construct a lambda term that -binds them in several ways. - -* `abstract_symbolic : Term -> Term` finds all symbolic variables in the -`Term` and constructs a lambda expression binding each one, in some -order. The result is a function of some number of arguments, one for -each symbolic variable. It is the simplest but least flexible way to -bind symbolic variables. - -~~~~ -sawscript> x <- fresh_symbolic "x" {| [8] |} -sawscript> let t = {{ x + x }} -sawscript> print_term t -let { x@1 = Prelude.Vec 8 Prelude.Bool - } - in Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) - x - x -sawscript> let f = abstract_symbolic t -sawscript> print_term f -let { x@1 = Prelude.Vec 8 Prelude.Bool - } - in \(x : x@1) -> - Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x x -~~~~ - -If there are multiple symbolic variables in the `Term` passed to -`abstract_symbolic`, the ordering of parameters can be hard to predict. -In some cases (such as when a proof is the immediate next step, and it's -expected to succeed) the order isn't important. In others, it's nice to -have more control over the order. - -* `lambda : Term -> Term -> Term` is the building block for controlled -binding. It takes two terms: the one to transform, and the portion of -the term to abstract over. Generally, the first `Term` is one obtained -from `fresh_symbolic` and the second is a `Term` that would be passed to -`abstract_symbolic`. - -~~~~ -sawscript> let f = lambda x t -sawscript> print_term f -let { x@1 = Prelude.Vec 8 Prelude.Bool - } - in \(x : x@1) -> - Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x x -~~~~ - -* `lambdas : [Term] -> Term -> Term` allows you to list the order in which -symbolic variables should be bound. Consider, for example, a `Term` -which adds two symbolic variables: - -~~~~ -sawscript> x1 <- fresh_symbolic "x1" {| [8] |} -sawscript> x2 <- fresh_symbolic "x2" {| [8] |} -sawscript> let t = {{ x1 + x2 }} -sawscript> print_term t -let { x@1 = Prelude.Vec 8 Prelude.Bool - } - in Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) - x1 - x2 -~~~~ - -We can turn `t` into a function that takes `x1` followed by `x2`: - -~~~~ -sawscript> let f1 = lambdas [x1, x2] t -sawscript> print_term f1 -let { x@1 = Prelude.Vec 8 Prelude.Bool - } - in \(x1 : x@1) -> - \(x2 : x@1) -> - Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x1 - x2 -~~~~ - -Or we can turn `t` into a function that takes `x2` followed by `x1`: - -~~~~ -sawscript> let f1 = lambdas [x2, x1] t -sawscript> print_term f1 -let { x@1 = Prelude.Vec 8 Prelude.Bool - } - in \(x2 : x@1) -> - \(x1 : x@1) -> - Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x1 - x2 -~~~~ - -# Specification-Based Verification - -The built-in functions described so far work by extracting models of -code that can then be used for a variety of purposes, including proofs -about the properties of the code. - -When the goal is to prove equivalence between some LLVM, Java, or MIR code and -a specification, however, a more declarative approach is sometimes -convenient. The following sections describe an approach that combines -model extraction and verification with respect to a specification. A -verified specification can then be used as input to future -verifications, allowing the proof process to be decomposed. - -## Running a Verification - -Verification of LLVM is controlled by the `llvm_verify` command. - -~~~~ -llvm_verify : - LLVMModule -> - String -> - [CrucibleMethodSpec] -> - Bool -> - LLVMSetup () -> - ProofScript SatResult -> - TopLevel CrucibleMethodSpec -~~~~ - -The first two arguments specify the module and function name to verify, -as with `llvm_verify`. The third argument specifies the list of -already-verified specifications to use for compositional verification -(described later; use `[]` for now). The fourth argument specifies -whether to do path satisfiability checking, and the fifth gives the -specification of the function to be verified. Finally, the last argument -gives the proof script to use for verification. The result is a proved -specification that can be used to simplify verification of functions -that call this one. - -Similar commands are available for JVM programs: - -~~~~ -jvm_verify : - JavaClass -> - String -> - [JVMMethodSpec] -> - Bool -> - JVMSetup () -> - ProofScript SatResult -> - TopLevel JVMMethodSpec -~~~~ - -And for MIR programs: - -~~~~ -mir_verify : - MIRModule -> - String -> - [MIRSpec] -> - Bool -> - MIRSetup () -> - ProofScript () -> - TopLevel MIRSpec -~~~~ - -### Running a MIR-based verification - -(Note: API functions involving MIR verification require `enable_experimental` -in order to be used. As such, some parts of this API may change before being -finalized.) - -The `String` supplied as an argument to `mir_verify` is expected to be a -function _identifier_. An identifier is expected adhere to one of the following -conventions: - -* `/::` -* `::` - -Where: - -* `` is the name of the crate in which the function is defined. (If - you produced your MIR JSON file by compiling a single `.rs` file with - `saw-rustc`, then the crate name is the same as the name of the file, but - without the `.rs` file extension.) -* `` is a hash of the crate and its dependencies. In extreme - cases, it is possible for two different crates to have identical crate names, - in which case the disambiguator must be used to distinguish between the two - crates. In the common case, however, most crate names will correspond to - exactly one disambiguator, and you are allowed to leave out the - `/` part of the `String` in this case. If you supply an - identifier with an ambiguous crate name and omit the disambiguator, then SAW - will raise an error. -* `` is the path to the function within the crate. Sometimes, - this is as simple as the function name itself. In other cases, a function - path may involve multiple _segments_, depending on the module hierarchy for - the program being verified. For instance, a `read` function located in - `core/src/ptr/mod.rs` will have the identifier: - - ``` - core::ptr::read - ``` - - Where `core` is the crate name and `ptr::read` is the function path, which - has two segments `ptr` and `read`. There are also some special forms of - segments that appear for functions defined in certain language constructs. - For instance, if a function is defined in an `impl` block, then it will have - `{impl}` as one of its segments, e.g., - - ``` - core::ptr::const_ptr::{impl}::offset - ``` - - If you are in doubt about what the full identifier for a given function is, - consult the MIR JSON file for your program. - ------ - -Now we describe how to construct a value of type `LLVMSetup ()`, `JVMSetup ()`, -or `MIRSetup ()`. - -## Structure of a Specification - -A specifications for Crucible consists of three logical components: - -* A specification of the initial state before execution of the function. - -* A description of how to call the function within that state. - -* A specification of the expected final value of the program state. - -These three portions of the specification are written in sequence within a `do` -block of type `{LLVM,JVM,MIR}Setup`. The command `{llvm,jvm,mir}_execute_func` -separates the specification of the initial state from the specification of the -final state, and specifies the arguments to the function in terms of the -initial state. Most of the commands available for state description will work -either before or after `{llvm,jvm,mir}_execute_func`, though with slightly -different meaning, as described below. - -## Creating Fresh Variables - -In any case where you want to prove a property of a function for an entire -class of inputs (perhaps all inputs) rather than concrete values, the initial -values of at least some elements of the program state must contain fresh -variables. These are created in a specification with the -`{llvm,jvm,mir}_fresh_var` commands rather than `fresh_symbolic`. - -* `llvm_fresh_var : String -> LLVMType -> LLVMSetup Term` - -* `jvm_fresh_var : String -> JavaType -> JVMSetup Term` - -* `mir_fresh_var : String -> MIRType -> MIRSetup Term` - -The first parameter to both functions is a name, used only for -presentation. It's possible (though not recommended) to create multiple -variables with the same name, but SAW will distinguish between them -internally. The second parameter is the LLVM, Java, or MIR type of the -variable. The resulting `Term` can be used in various subsequent -commands. - -Note that the second parameter to `{llvm,jvm,mir}_fresh_var` must be a type -that has a counterpart in Cryptol. (For more information on this, refer to the -"Cryptol type correspondence" section.) If the type does not have a Cryptol -counterpart, the function will raise an error. If you do need to create a fresh -value of a type that cannot be represented in Cryptol, consider using a -function such as `llvm_fresh_expanded_val` (for LLVM verification) or -`mir_fresh_expanded_value` (for MIR verification). - -LLVM types are built with this set of functions: - -* `llvm_int : Int -> LLVMType` -* `llvm_alias : String -> LLVMType` -* `llvm_array : Int -> LLVMType -> LLVMType` -* `llvm_float : LLVMType` -* `llvm_double : LLVMType` -* `llvm_packed_struct : [LLVMType] -> LLVMType` -* `llvm_struct_type : [LLVMType] -> LLVMType` - -Java types are built up using the following functions: - -* `java_bool : JavaType` -* `java_byte : JavaType` -* `java_char : JavaType` -* `java_short : JavaType` -* `java_int : JavaType` -* `java_long : JavaType` -* `java_float : JavaType` -* `java_double : JavaType` -* `java_class : String -> JavaType` -* `java_array : Int -> JavaType -> JavaType` - -MIR types are built up using the following functions: - -* `mir_adt : MIRAdt -> MIRType` -* `mir_array : Int -> MIRType -> MIRType` -* `mir_bool : MIRType` -* `mir_char : MIRType` -* `mir_i8 : MIRType` -* `mir_i6 : MIRType` -* `mir_i32 : MIRType` -* `mir_i64 : MIRType` -* `mir_i128 : MIRType` -* `mir_isize : MIRType` -* `mir_f32 : MIRType` -* `mir_f64 : MIRType` -* `mir_lifetime : MIRType` -* `mir_ref : MIRType -> MIRType` -* `mir_ref_mut : MIRType -> MIRType` -* `mir_slice : MIRType -> MIRType` -* `mir_str : MIRType` -* `mir_tuple : [MIRType] -> MIRType` -* `mir_u8 : MIRType` -* `mir_u6 : MIRType` -* `mir_u32 : MIRType` -* `mir_u64 : MIRType` -* `mir_u128 : MIRType` -* `mir_usize : MIRType` - -Most of these types are straightforward mappings to the standard LLVM -and Java types. The one key difference is that arrays must have a fixed, -concrete size. Therefore, all analysis results are valid only under the -assumption that any arrays have the specific size indicated, and may not -hold for other sizes. - -The `llvm_int` function takes an `Int` parameter indicating the variable's bit -width. For example, the C `uint16_t` and `int16_t` types correspond to -`llvm_int 16`. The C `bool` type is slightly trickier. A bare `bool` type -typically corresponds to `llvm_int 1`, but if a `bool` is a member of a -composite type such as a pointer, array, or struct, then it corresponds to -`llvm_int 8`. This is due to a peculiarity in the way Clang compiles `bool` -down to LLVM. When in doubt about how a `bool` is represented, check the LLVM -bitcode by compiling your code with `clang -S -emit-llvm`. - -LLVM types can also be specified in LLVM syntax directly by using the -`llvm_type` function. - -* `llvm_type : String -> LLVMType` - -For example, `llvm_type "i32"` yields the same result as `llvm_int 32`. - -The most common use for creating fresh variables is to state that a -particular function should have the specified behaviour for arbitrary -initial values of the variables in question. Sometimes, however, it can -be useful to specify that a function returns (or stores, more about this -later) an arbitrary value, without specifying what that value should be. -To express such a pattern, you can also run `llvm_fresh_var` from -the post state (i.e., after `llvm_execute_func`). - -## The SetupValue and JVMValue Types - -Many specifications require reasoning about both pure values and about -the configuration of the heap. The `SetupValue` type corresponds to -values that can occur during symbolic execution, which includes both -`Term` values, pointers, and composite types consisting of either of -these (both structures and arrays). - -The `llvm_term`, `jvm_term`, and `mir_term` functions create a `SetupValue`, -`JVMValue`, or `MIRValue`, respectively, from a `Term`: - -* `llvm_term : Term -> SetupValue` -* `jvm_term : Term -> JVMValue` -* `mir_term : Term -> MIRValue` - -The value that these functions return will have an LLVM, JVM, or MIR type -corresponding to the Cryptol type of the `Term` argument. (For more information -on this, refer to the "Cryptol type correspondence" section.) If the type does -not have a Cryptol counterpart, the function will raise an error. - -### Cryptol type correspondence - -The `{llvm,jvm,mir}_fresh_var` functions take an LLVM, JVM, or MIR type as an -argument and produces a `Term` variable of the corresponding Cryptol type as -output. Similarly, the `{llvm,jvm,mir}_term` functions take a Cryptol `Term` as -input and produce a value of the corresponding LLVM, JVM, or MIR type as -output. This section describes precisely which types can be converted to -Cryptol types (and vice versa) in this way. - -#### LLVM verification - -The following LLVM types correspond to Cryptol types: - -* `llvm_alias `: Corresponds to the same Cryptol type as the type used - in the definition of ``. -* `llvm_array `: Corresponds to the Cryptol sequence `[][]`, - where `` is the Cryptol type corresponding to ``. -* `llvm_int `: Corresponds to the Cryptol word `[]`. -* `llvm_struct_type [, ..., ]` and `llvm_packed_struct [, ..., ]`: - Corresponds to the Cryptol tuple `(, ..., )`, where `` - is the Cryptol type corresponding to `` for each `i` ranging from `1` - to `n`. - -The following LLVM types do _not_ correspond to Cryptol types: - -* `llvm_double` -* `llvm_float` -* `llvm_pointer` - -#### JVM verification - -The following Java types correspond to Cryptol types: - -* `java_array `: Corresponds to the Cryptol sequence `[][]`, - where `` is the Cryptol type corresponding to ``. -* `java_bool`: Corresponds to the Cryptol `Bit` type. -* `java_byte`: Corresponds to the Cryptol `[8]` type. -* `java_char`: Corresponds to the Cryptol `[16]` type. -* `java_int`: Corresponds to the Cryptol `[32]` type. -* `java_long`: Corresponds to the Cryptol `[64]` type. -* `java_short`: Corresponds to the Cryptol `[16]` type. - -The following Java types do _not_ correspond to Cryptol types: - -* `java_class` -* `java_double` -* `java_float` - -#### MIR verification - -The following MIR types correspond to Cryptol types: - -* `mir_array `: Corresponds to the Cryptol sequence `[][]`, - where `` is the Cryptol type corresponding to ``. -* `mir_bool`: Corresponds to the Cryptol `Bit` type. -* `mir_char`: Corresponds to the Cryptol `[32]` type. -* `mir_i8` and `mir_u8`: Corresponds to the Cryptol `[8]` type. -* `mir_i16` and `mir_u16`: Corresponds to the Cryptol `[16]` type. -* `mir_i32` and `mir_u32`: Corresponds to the Cryptol `[32]` type. -* `mir_i64` and `mir_u64`: Corresponds to the Cryptol `[64]` type. -* `mir_i128` and `mir_u128`: Corresponds to the Cryptol `[128]` type. -* `mir_isize` and `mir_usize`: Corresponds to the Cryptol `[32]` type. -* `mir_tuple [, ..., ]`: Corresponds to the Cryptol tuple - `(, ..., )`, where `` is the Cryptol type corresponding - to `` for each `i` ranging from `1` to `n`. - -The following MIR types do _not_ correspond to Cryptol types: - -* `mir_adt` -* `mir_f32` -* `mir_f64` -* `mir_ref` and `mir_ref_mut` -* `mir_slice` -* `mir_str` - -## Executing - -Once the initial state has been configured, the `{llvm,jvm,mir}_execute_func` -command specifies the parameters of the function being analyzed in terms -of the state elements already configured. - -* `llvm_execute_func : [SetupValue] -> LLVMSetup ()` -* `jvm_execute_func : [JVMValue] -> JVMSetup ()` -* `mir_execute_func : [MIRValue] -> MIRSetup ()` - -## Return Values - -To specify the value that should be returned by the function being -verified use the `{llvm,jvm,mir}_return` command. - -* `llvm_return : SetupValue -> LLVMSetup ()` -* `jvm_return : JVMValue -> JVMSetup ()` -* `mir_return : MIRValue -> MIRSetup ()` - -## A First Simple Example - -The commands introuduced so far are sufficient to verify simple programs -that do not use pointers (or that use them only internally). Consider, -for instance the C program that adds its two arguments together: - -~~~~ -#include -uint32_t add(uint32_t x, uint32_t y) { - return x + y; -} -~~~~ - -We can specify this function's expected behavior as follows: - -~~~~ -let add_setup = do { - x <- llvm_fresh_var "x" (llvm_int 32); - y <- llvm_fresh_var "y" (llvm_int 32); - llvm_execute_func [llvm_term x, llvm_term y]; - llvm_return (llvm_term {{ x + y : [32] }}); -}; -~~~~ - -We can then compile the C file `add.c` into the bitcode file `add.bc` -and verify it with ABC: - -~~~~ -m <- llvm_load_module "add.bc"; -add_ms <- llvm_verify m "add" [] false add_setup abc; -~~~~ - -## Compositional Verification - -The primary advantage of the specification-based approach to -verification is that it allows for compositional reasoning. That is, -when proving properties of a given method or function, we can make use -of properties we have already proved about its callees rather than -analyzing them anew. This enables us to reason about much larger -and more complex systems than otherwise possible. - -The `llvm_verify`, `jvm_verify`, and `mir_verify` functions return values of -type `CrucibleMethodSpec`, `JVMMethodSpec`, and `MIRMethodSpec`, respectively. -These values are opaque objects that internally contain both the information -provided in the associated `LLVMSetup`, `JVMSetup`, or `MIRSetup` blocks, -respectively, and the results of the verification process. - -Any of these `MethodSpec` objects can be passed in via the third -argument of the `..._verify` functions. For any function or method -specified by one of these parameters, the simulator will not follow -calls to the associated target. Instead, it will perform the following -steps: - -* Check that all `llvm_points_to` and `llvm_precond` statements - (or the corresponding JVM or MIR statements) in the specification are - satisfied. - -* Update the simulator state and optionally construct a return value as - described in the specification. - -More concretely, building on the previous example, say we have a -doubling function written in terms of `add`: - -~~~~ -uint32_t dbl(uint32_t x) { - return add(x, x); -} -~~~~ - -It has a similar specification to `add`: - -~~~~ -let dbl_setup = do { - x <- llvm_fresh_var "x" (llvm_int 32); - llvm_execute_func [llvm_term x]; - llvm_return (llvm_term {{ x + x : [32] }}); -}; -~~~~ - -And we can verify it using what we've already proved about `add`: - -~~~~ -llvm_verify m "dbl" [add_ms] false dbl_setup abc; -~~~~ - -In this case, doing the verification compositionally doesn't save -computational effort, since the functions are so simple, but it -illustrates the approach. - -### Compositional Verification and Mutable Allocations - -A common pitfall when using compositional verification is to reuse a -specification that underspecifies the value of a mutable allocation. In -general, doing so can lead to unsound verification, so SAW goes through great -lengths to check for this. - -Here is an example of this pitfall in an LLVM verification. Given this C code: - -~~~ c -void side_effect(uint32_t *a) { - *a = 0; -} - -uint32_t foo(uint32_t x) { - uint32_t b = x; - side_effect(&b); - return b; -} -~~~ - -And the following SAW specifications: - -~~~ -let side_effect_spec = do { - a_ptr <- llvm_alloc (llvm_int 32); - a_val <- llvm_fresh_var "a_val" (llvm_int 32); - llvm_points_to a_ptr (llvm_term a_val); - - llvm_execute_func [a_ptr]; -}; - -let foo_spec = do { - x <- llvm_fresh_var "x" (llvm_int 32); - - llvm_execute_func [llvm_term x]; - - llvm_return (llvm_term x); -}; -~~~ - -Should SAW be able to verify the `foo` function against `foo_spec` using -compositional verification? That is, should the following be expected to work? - -~~~ -side_effect_ov <- llvm_verify m "side_effect" [] false side_effect_spec z3; -llvm_verify m "foo" [side_effect_ov] false foo_spec z3; -~~~ - -A literal reading of `side_effect_spec` would suggest that the `side_effect` -function allocates `a_ptr` but then does nothing with it, implying that `foo` -returns its argument unchanged. This is incorrect, however, as the -`side_effect` function actually changes its argument to point to `0`, so the -`foo` function ought to return `0` as a result. SAW should not verify `foo` -against `foo_spec`, and indeed it does not. - -The problem is that `side_effect_spec` underspecifies the value of `a_ptr` in -its postconditions, which can lead to the potential unsoundness seen above when -`side_effect_spec` is used in compositional verification. To prevent this -source of unsoundness, SAW will _invalidate_ the underlying memory of any -mutable pointers (i.e., those declared with `llvm_alloc`, not -`llvm_alloc_global`) allocated in the preconditions of compositional override -that do not have a corresponding `llvm_points_to` statement in the -postconditions. Attempting to read from invalidated memory constitutes an -error, as can be seen in this portion of the error message when attempting to -verify `foo` against `foo_spec`: - -~~~ -invalidate (state of memory allocated in precondition (at side.saw:3:12) not described in postcondition) -~~~ - -To fix this particular issue, add an `llvm_points_to` statement to -`side_effect_spec`: - -~~~ -let side_effect_spec = do { - a_ptr <- llvm_alloc (llvm_int 32); - a_val <- llvm_fresh_var "a_val" (llvm_int 32); - llvm_points_to a_ptr (llvm_term a_val); - - llvm_execute_func [a_ptr]; - - // This is new - llvm_points_to a_ptr (llvm_term {{ 0 : [32] }}); -}; -~~~ - -After making this change, SAW will reject `foo_spec` for a different reason, as -it claims that `foo` returns its argument unchanged when it actually returns -`0`. - -Note that invalidating memory itself does not constitute an error, so if the -`foo` function never read the value of `b` after calling `side_effect(&b)`, -then there would be no issue. It is only when a function attempts to _read_ -from invalidated memory that an error is thrown. In general, it can be -difficult to predict when a function will or will not read from invalidated -memory, however. For this reason, it is recommended to always specify the -values of mutable allocations in the postconditions of your specs, as it can -avoid pitfalls like the one above. - -The same pitfalls apply to compositional MIR verification, with a couple of key -differences. In MIR verification, mutable references are allocated using -`mir_alloc_mut`. Here is a Rust version of the pitfall program above: - -~~~ rust -pub fn side_effect(a: &mut u32) { - *a = 0; -} - -pub fn foo(x: u32) -> u32 { - let mut b: u32 = x; - side_effect(&mut b); - b -} -~~~ - -~~~ -let side_effect_spec = do { - a_ref <- mir_alloc_mut mir_u32; - a_val <- mir_fresh_var "a_val" mir_u32; - mir_points_to a_ref (mir_term a_val); - - mir_execute_func [a_ref]; -}; - -let foo_spec = do { - x <- mir_fresh_var "x" mir_u32; - - mir_execute_func [mir_term x]; - - mir_return (mir_term {{ x }}); -}; -~~~ - -Just like above, if you attempted to prove `foo` against `foo_spec` using -compositional verification: - -~~~ -side_effect_ov <- mir_verify m "test::side_effect" [] false side_effect_spec z3; -mir_verify m "test::foo" [side_effect_ov] false foo_spec z3; -~~~ - -Then SAW would throw an error, as `side_effect_spec` underspecifies the value -of `a_ref` in its postconditions. `side_effect_spec` can similarly be repaired -by adding a `mir_points_to` statement involving `a_ref` in `side_effect_spec`'s -postconditions. - -MIR verification differs slightly from LLVM verification in how it catches -underspecified mutable allocations when using compositional overrides. The LLVM -memory model achieves this by invalidating the underlying memory in -underspecified allocations. The MIR memory model, on the other hand, does not -have a direct counterpart to memory invalidation. As a result, any MIR overrides -must specify the values of all mutable allocations in their postconditions, -_even if the function that calls the override never uses the allocations_. - -To illustrate this point more finely, suppose that the `foo` function had -instead been defined like this: - -~~~ rust -pub fn foo(x: u32) -> u32 { - let mut b: u32 = x; - side_effect(&mut b); - 42 -} -~~~ - -Here, it does not particularly matter what effects the `side_effect` function -has on its argument, as `foo` will now return `42` regardless. Still, if you -attempt to prove `foo` by using `side_effect` as a compositional override, then -it is strictly required that you specify the value of `side_effect`'s argument -in its postconditions, even though the answer that `foo` returns is unaffected -by this. This is in contrast with LLVM verification, where one could get away -without specifying `side_effect`'s argument in this example, as the invalidated -memory in `b` would never be read. - -### Compositional Verification and Mutable Global Variables - -Just like with local mutable allocations (see the previous section), -specifications used in compositional overrides must specify the values of -mutable global variables in their postconditions. To illustrate this using LLVM -verification, here is a variant of the C program from the previous example that -uses a mutable global variable `a`: - -~~~ c - -uint32_t a = 42; - -void side_effect(void) { - a = 0; -} - -uint32_t foo(void) { - side_effect(); - return a; -} -~~~ - -If we attempted to verify `foo` against this `foo_spec` specification using -compositional verification: - -~~~ -let side_effect_spec = do { - llvm_alloc_global "a"; - llvm_points_to (llvm_global "a") (llvm_global_initializer "a"); - - llvm_execute_func []; -}; - -let foo_spec = do { - llvm_alloc_global "a"; - llvm_points_to (llvm_global "a") (llvm_global_initializer "a"); - - llvm_execute_func []; - - llvm_return (llvm_global_initializer "a"); -}; - -side_effect_ov <- llvm_verify m "side_effect" [] false side_effect_spec z3; -llvm_verify m "foo" [side_effect_ov] false foo_spec z3; -~~~ - -Then SAW would reject it, as `side_effect_spec` does not specify what `a`'s -value should be in its postconditions. Just as with local mutable allocations, -SAW will invalidate the underlying memory in `a`, and subsequently reading from -`a` in the `foo` function will throw an error. The solution is to add an -`llvm_points_to` statement in the postconditions that declares that `a`'s value -is set to `0`. - -The same concerns apply to MIR verification, where mutable global variables are -referred to as `static mut` items. (See the [MIR static -items](#mir-static-items) section for more information). Here is a Rust version -of the program above: - -~~~ rust -static mut A: u32 = 42; - -pub fn side_effect() { - unsafe { - A = 0; - } -} - -pub fn foo() -> u32 { - side_effect(); - unsafe { A } -} -~~~ - -~~~ -let side_effect_spec = do { - mir_points_to (mir_static "test::A") (mir_static_initializer "test::A"); - - mir_execute_func []; -}; - -let foo_spec = do { - mir_points_to (mir_static "test::A") (mir_static_initializer "test::A"); - - mir_execute_func []; - - mir_return (mir_static_initializer "test::A"); -}; - -side_effect_ov <- mir_verify m "side_effect" [] false side_effect_spec z3; -mir_verify m "foo" [side_effect_ov] false foo_spec z3; -~~~ - -Just as above, we can repair this by adding a `mir_points_to` statement in -`side_effect_spec`'s postconditions that specifies that `A` is set to `0`. - -Recall from the previous section that MIR verification is stricter than LLVM -verification when it comes to specifying mutable allocations in the -postconditions of compositional overrides. This is especially true for mutable -static items. In MIR verification, any compositional overrides must specify the -values of all mutable static items in the entire program in their -postconditions, _even if the function that calls the override never uses the -static items_. For example, if the `foo` function were instead defined like -this: - -~~~ rust -pub fn foo() -> u32 { - side_effect(); - 42 -} -~~~ - -Then it is still required for `side_effect_spec` to specify what `A`'s value -will be in its postconditions, despite the fact that this has no effect on the -value that `foo` will return. - -## Specifying Heap Layout - -Most functions that operate on pointers expect that certain pointers -point to allocated memory before they are called. The `llvm_alloc` -command allows you to specify that a function expects a particular -pointer to refer to an allocated region appropriate for a specific type. - -* `llvm_alloc : LLVMType -> LLVMSetup SetupValue` - -This command returns a `SetupValue` consisting of a pointer to the -allocated space, which can be used wherever a pointer-valued -`SetupValue` can be used. - -In the initial state, `llvm_alloc` specifies that the function -expects a pointer to allocated space to exist. In the final state, it -specifies that the function itself performs an allocation. - -When using the experimental Java implementation, separate functions -exist for specifying that arrays or objects are allocated: - -* `jvm_alloc_array : Int -> JavaType -> JVMSetup JVMValue` specifies an -array of the given concrete size, with elements of the given type. - -* `jvm_alloc_object : String -> JVMSetup JVMValue` specifies an object -of the given class name. - -The experimental MIR implementation also has a `mir_alloc` function, which -behaves similarly to `llvm_alloc`. `mir_alloc` creates an immutable reference, -but there is also a `mir_alloc_mut` function for creating a mutable reference: - -* `mir_alloc : MIRType -> MIRSetup MIRValue` - -* `mir_alloc_mut : MIRType -> MIRSetup MIRValue` - -MIR tracks whether references are mutable or immutable at the type level, so it -is important to use the right allocation command for a given reference type. - -In LLVM, it's also possible to construct fresh pointers that do not -point to allocated memory (which can be useful for functions that -manipulate pointers but not the values they point to): - -* `llvm_fresh_pointer : LLVMType -> LLVMSetup SetupValue` - -The NULL pointer is called `llvm_null` in LLVM and `jvm_null` in -JVM: - -* `llvm_null : SetupValue` -* `jvm_null : JVMValue` - -One final, slightly more obscure command is the following: - -* `llvm_alloc_readonly : LLVMType -> LLVMSetup SetupValue` - -This works like `llvm_alloc` except that writes to the space -allocated are forbidden. This can be useful for specifying that a -function should take as an argument a pointer to allocated space that it -will not modify. Unlike `llvm_alloc`, regions allocated with -`llvm_alloc_readonly` are allowed to alias other read-only regions. - -## Specifying Heap Values - -Pointers returned by `llvm_alloc`, `jvm_alloc_{array,object}`, or -`mir_alloc{,_mut}` don't initially point to anything. So if you pass such a -pointer directly into a function that tried to dereference it, symbolic -execution will fail with a message about an invalid load. For some functions, -such as those that are intended to initialize data structures (writing to the -memory pointed to, but never reading from it), this sort of uninitialized -memory is appropriate. In most cases, however, it's more useful to state that a -pointer points to some specific (usually symbolic) value, which you can do with -the *points-to* family of commands. - -### LLVM heap values - -LLVM verification primarily uses the `llvm_points_to` command: - -* `llvm_points_to : SetupValue -> SetupValue -> LLVMSetup ()` -takes two `SetupValue` arguments, the first of which must be a pointer, -and states that the memory specified by that pointer should contain the -value given in the second argument (which may be any type of -`SetupValue`). - -When used in the final state, `llvm_points_to` specifies that the -given pointer *should* point to the given value when the function -finishes. - -Occasionally, because C programs frequently reinterpret memory of one -type as another through casts, it can be useful to specify that a -pointer points to a value that does not agree with its static type. - -* `llvm_points_to_untyped : SetupValue -> SetupValue -> -LLVMSetup ()` works like `llvm_points_to` but omits type -checking. Rather than omitting type checking across the board, we -introduced this additional function to make it clear when a type -reinterpretation is intentional. As an alternative, one -may instead use `llvm_cast_pointer` to line up the static types. - -### JVM heap values - -JVM verification has two categories of commands for specifying heap values. -One category consists of the `jvm_*_is` commands, which allow users to directly -specify what value a heap object points to. There are specific commands for -each type of JVM heap object: - -* `jvm_array_is : JVMValue -> Term -> JVMSetup ()` declares that an array (the - first argument) contains a sequence of values (the second argument). -* `jvm_elem_is : JVMValue -> Int -> JVMValue -> JVMSetup ()` declares that an - array (the first argument) has an element at the given index (the second - argument) containing the given value (the third argument). -* `jvm_field_is : JVMValue -> String -> JVMValue -> JVMSetup ()` declares that - an object (the first argument) has a field (the second argument) containing - the given value (the third argument). -* `jvm_static_field_is : String -> JVMValue -> JVMSetup ()` declares that a - named static field (the first argument) contains the given value (the second - argument). By default, the field name is assumed to belong to the same class - as the method being specified. Static fields belonging to other classes can - be selected using the `.` syntax in the first argument. - -Another category consists of the `jvm_modifies_*` commands. Like the `jvm_*_is` -commands, these specify that a JVM heap object points to valid memory, but -unlike the `jvm_*_is` commands, they leave the exact value being pointed to as -unspecified. These are useful for writing partial specifications for methods -that modify some heap value, but without saying anything specific about the new -value. - -* `jvm_modifies_array : JVMValue -> JVMSetup ()` -* `jvm_modifies_elem : JVMValue -> Int -> JVMSetup ()` -* `jvm_modifies_field : JVMValue -> String -> JVMSetup ()` -* `jvm_modifies_static_field : String -> JVMSetup ()` - -### MIR heap values - -MIR verification has a single `mir_points_to` command: - -* `mir_points_to : MIRValue -> MIRValue -> MIRSetup ()` -takes two `SetupValue` arguments, the first of which must be a reference, -and states that the memory specified by that reference should contain the -value given in the second argument (which may be any type of -`SetupValue`). - -## Working with Compound Types - -The commands mentioned so far give us no way to specify the values of -compound types (arrays or `struct`s). Compound values can be dealt with -either piecewise or in their entirety. - -* `llvm_elem : SetupValue -> Int -> SetupValue` yields a pointer to -an internal element of a compound value. For arrays, the `Int` parameter -is the array index. For `struct` values, it is the field index. - -* `llvm_field : SetupValue -> String -> SetupValue` yields a pointer -to a particular named `struct` field, if debugging information is -available in the bitcode. - -Either of these functions can be used with `llvm_points_to` to -specify the value of a particular array element or `struct` field. -Sometimes, however, it is more convenient to specify all array elements -or field values at once. The `llvm_array_value` and `llvm_struct_value` -functions construct compound values from lists of element values. - -* `llvm_array_value : [SetupValue] -> SetupValue` -* `llvm_struct_value : [SetupValue] -> SetupValue` - -To specify an array or struct in which each element or field is -symbolic, it would be possible, but tedious, to use a large combination -of `llvm_fresh_var` and `llvm_elem` or `llvm_field` commands. -However, the following function can simplify the common case -where you want every element or field to have a fresh value. - -* `llvm_fresh_expanded_val : LLVMType -> LLVMSetup SetupValue` - -The `llvm_struct_value` function normally creates a `struct` whose layout -obeys the alignment rules of the platform specified in the LLVM file -being analyzed. Structs in LLVM can explicitly be "packed", however, so -that every field immediately follows the previous in memory. The -following command will create values of such types: - -* `llvm_packed_struct_value : [SetupValue] -> SetupValue` - -C programs will sometimes make use of pointer casting to implement -various kinds of polymorphic behaviors, either via direct pointer -casts, or by using `union` types to codify the pattern. To reason -about such cases, the following operation is useful. - -* `llvm_cast_pointer : SetupValue -> LLVMType -> SetupValue` - -This function function casts the type of the input value (which must be a -pointer) so that it points to values of the given type. This mainly -affects the results of subsequent `llvm_field` and `llvm_elem` calls, -and any eventual `points_to` statements that the resulting pointer -flows into. This is especially useful for dealing with C `union` -types, as the type information provided by LLVM is imprecise in these -cases. - -We can automate the process of applying pointer casts if we have debug -information avaliable: - -* `llvm_union : SetupValue -> String -> SetupValue` - -Given a pointer setup value, this attempts to select the named union -branch and cast the type of the pointer. For this to work, debug -symbols must be included; moreover, the process of correlating LLVM -type information with information contained in debug symbols is a bit -heuristic. If `llvm_union` cannot figure out how to cast a pointer, -one can fall back on the more manual `llvm_cast_pointer` instead. - - -In the experimental Java verification implementation, the following -functions can be used to state the equivalent of a combination of -`llvm_points_to` and either `llvm_elem` or `llvm_field`. - -* `jvm_elem_is : JVMValue -> Int -> JVMValue -> JVMSetup ()` specifies -the value of an array element. - -* `jvm_field_is : JVMValue -> String -> JVMValue -> JVMSetup ()` -specifies the name of an object field. - -In the experimental MIR verification implementation, the following functions -construct compound values: - -* `mir_array_value : MIRType -> [MIRValue] -> MIRValue` constructs an array - of the given type whose elements consist of the given values. Supplying the - element type is necessary to support length-0 arrays. -* `mir_enum_value : MIRAdt -> String -> [MIRValue] -> MIRValue` constructs an - enum using a particular enum variant. The `MIRAdt` arguments determines what - enum type to create, the `String` value determines the name of the variant to - use, and the `[MIRValue]` list are the values to use as elements in the - variant. - - See the "Finding MIR algebraic data types" section (as well as the "Enums" - subsection) for more information on how to compute a `MIRAdt` value to pass - to `mir_enum_value`. -* `mir_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section below. -* `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the - "MIR slices" section below. -* `mir_str_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section - below. -* `mir_str_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the - "MIR slices" section below. -* `mir_struct_value : MIRAdt -> [MIRValue] -> MIRValue` construct a struct - with the given list of values as elements. The `MIRAdt` argument determines - what struct type to create. - - See the "Finding MIR algebraic data types" section for more information on how - to compute a `MIRAdt` value to pass to `mir_struct_value`. -* `mir_tuple_value : [MIRValue] -> MIRValue` construct a tuple with the given - list of values as elements. - -To specify a compound value in which each element or field is symbolic, it -would be possible, but tedious, to use a large number of `mir_fresh_var` -invocations in conjunction with the commands above. However, the following -function can simplify the common case where you want every element or field to -have a fresh value: - -* `mir_fresh_expanded_value : String -> MIRType -> MIRSetup MIRValue` - -The `String` argument denotes a prefix to use when generating the names of -fresh symbolic variables. The `MIRType` can be any type, with the exception of -reference types (or compound types that contain references as elements or -fields), which are not currently supported. - -### MIR slices - -Slices are a unique form of compound type that is currently only used during -MIR verification. Unlike other forms of compound values, such as arrays, it is -not possible to directly construct a slice. Instead, one must take a slice of -an existing reference value that points to the thing being sliced. - -SAW currently supports taking slices of arrays and strings. - -#### Array slices - -The following commands are used to construct slices of arrays: - -* `mir_slice_value : MIRValue -> MIRValue`: the SAWScript expression - `mir_slice_value base` is equivalent to the Rust expression `&base[..]`, - i.e., a slice of the entirety of `base`. `base` must be a reference to an - array value (`&[T; N]` or `&mut [T; N]`), not an array itself. The type of - `mir_slice_value base` will be `&[T]` (if `base` is an immutable reference) - or `&mut [T]` (if `base` is a mutable reference). -* `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: the SAWScript - expression `mir_slice_range_value base start end` is equivalent to the Rust - expression `&base[start..end]`, i.e., a slice over a part of `base` which - ranges from `start` to `end`. `base` must be a reference to an array value - (`&[T; N]` or `&mut [T; N]`), not an array itself. The type of - `mir_slice_value base` will be `&[T]` (if `base` is an immutable reference) - or `&mut [T]` (if `base` is a mutable reference). - - `start` and `end` are assumed to be zero-indexed. `start` must not exceed - `end`, and `end` must not exceed the length of the array that `base` points - to. - -As an example of how to use these functions, consider this Rust function, which -accepts an arbitrary slice as an argument: - -~~~~ rust -pub fn f(s: &[u32]) -> u32 { - s[0] + s[1] -} -~~~~ - -We can write a specification that passes a slice to the array `[1, 2, 3, 4, 5]` -as an argument to `f`: - -~~~~ -let f_spec_1 = do { - a <- mir_alloc (mir_array 5 mir_u32); - mir_points_to a (mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}); - - mir_execute_func [mir_slice_value a]; - - mir_return (mir_term {{ 3 : [32] }}); -}; -~~~~ - -Alternatively, we can write a specification that passes a part of this array -over the range `[1..3]`, i.e., ranging from second element to the fourth. -Because this is a half-open range, the resulting slice has length 2: - -~~~~ -let f_spec_2 = do { - a <- mir_alloc (mir_array 5 mir_u32); - mir_points_to a (mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}); - - mir_execute_func [mir_slice_range_value a 1 3]; - - mir_return (mir_term {{ 5 : [32] }}); -}; -~~~~ - -Note that we are passing _references_ of arrays to `mir_slice_value` and -`mir_slice_range_value`. It would be an error to pass a bare array to these -functions, so the following specification would be invalid: - -~~~~ -let f_fail_spec_ = do { - let arr = mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}; - - mir_execute_func [mir_slice_value arr]; // BAD: `arr` is not a reference - - mir_return (mir_term {{ 3 : [32] }}); -}; -~~~~ - -Note that The `mir_slice_range_value` function must accept bare `Int` arguments -to specify the lower and upper bounds of the range. A consequence of this -design is that it is not possible to create a slice with a symbolic length. If -this limitation prevents you from using SAW, please file an issue [on -GitHub](https://github.com/GaloisInc/saw-script/issues). - -#### String slices - -In addition to slices of arrays (i.e., of type `&[T]`), SAW also supports -slices of strings (i.e., of type `&str`) through the following commands: - -* `mir_str_slice_value : MIRValue -> MIRValue`: the SAWScript expression - `mir_str_slice_value base` is equivalent to the Rust expression `&base[..]`, - i.e., a slice of the entirety of `base`. `base` must be a reference to an - array of bytes (`&[u8; N]` or `&mut [u8; N]`), not an array itself. The type - of `mir_str_slice_value base` will be `&str` (if `base` is an immutable - reference) or `&mut str` (if `base` is a mutable reference). -* `mir_str_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: the - SAWScript expression `mir_slice_range_value base start end` is equivalent to - the Rust expression `&base[start..end]`, i.e., a slice over a part of `base` - which ranges from `start` to `end`. `base` must be a reference to an array of - bytes (`&[u8; N]` or `&mut [u8; N]`), not an array itself. The type of - `mir_slice_value base` will be `&str` (if `base` is an immutable reference) - or `&mut str` (if `base` is a mutable reference). - - `start` and `end` are assumed to be zero-indexed. `start` must not exceed - `end`, and `end` must not exceed the length of the array that `base` points - to. - -One unusual requirement about `mir_str_slice_value` and -`mir_str_slice_range_value` is that they require the argument to be of type -`&[u8; N]`, i.e., a reference to an array of bytes. This is an artifact of the -way that strings are encoded in Cryptol. The following Cryptol expressions: - -* `"A"` -* `"123"` -* `"Hello World"` - -Have the following types: - -* `[1][8]` -* `[3][8]` -* `[11][8]` - -This is because Cryptol strings are syntactic shorthand for sequences of bytes. -The following Cryptol expressions are wholly equivalent: - -* `[0x41]` -* `[0x31, 0x32, 0x33]` -* `[0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64]` - -These represent the strings in the extended ASCII character encoding. The -Cryptol sequence type `[N][8]` is equivalent to the Rust type `[u8; N]`, so the -requirement to have something of type `&[u8; N]` as an argument reflects this -design choice. - -Note that `mir_str_slice_value ` is _not_ the same thing as -`mir_slice_value `, as the two commands represent different types -of Rust values. While both commands take a `` as an argument, -`mir_str_slice_value` will return a value of Rust type `&str` (or `&mut str`), -whereas `mir_slice_value` will return a value of Rust type `&[u8]` (or `&mut -[u8]`). These Rust types are checked when you pass these values as arguments to -Rust functions (using `mir_execute_func`) or when you return these values -(using `mir_return`), and it is an error to supply a `&str` value in a place -where a `&[u8]` value is expected (and vice versa). - -As an example of how to write specifications involving string slices, -consider this Rust function: - -~~~ rust -pub fn my_len(s: &str) -> usize { - s.len() -} -~~~ - -We can use `mir_str_slice_value` to write a specification for `my_len` when it -is given the string `"hello"` as an argument: - -~~~ -let my_len_spec = do { - s <- mir_alloc (mir_array 5 mir_u8); - mir_points_to s (mir_term {{ "hello" }}); - - mir_execute_func [mir_str_slice_value s]; - - mir_return (mir_term {{ 5 : [32] }}); -}; -~~~ - -Currently, Cryptol only supports characters that can be encoded in a single -byte. As a result, it is not currently possible to take slices of strings with -certain characters. For example, the string `"roșu"` cannot be used as a -Cryptol expression, as the character `'ș'` would require 10 bits to represent -instead of 8. The alternative is to use UTF-8 to encode such characters. For -instance, the UTF-8 encoding of the string `"roșu"` is `"ro\200\153u"`, where -`"\200\153"` is a sequence of two bytes that represents the `'ș'` character. - -SAW makes no attempt to ensure that string slices over a particular range -aligns with UTF-8 character boundaries. For example, the following Rust code -would panic: - -~~~ rust - let rosu: &str = "roșu"; - let s: &str = &rosu[0..3]; - println!("{:?}", s); -~~~ -~~~ -thread 'main' panicked at 'byte index 3 is not a char boundary; it is inside 'ș' (bytes 2..4) of `roșu`' -~~~ - -On the other hand, SAW will allow you define a slice of the form -`mir_str_slice_range r 0 3`, where `r` is a reference to `"ro\200\153u"`. It is -the responsibility of the SAW user to ensure that `mir_str_slice_range` indices -align with character boundaries. - -### Finding MIR algebraic data types - -We collectively refer to MIR `struct`s and `enum`s together as _algebraic data -types_, or ADTs for short. ADTs have identifiers to tell them apart, and a -single ADT declaration can give rise to multiple identifiers depending on how -the declaration is used. For example: - -~~~~ rust -pub struct S { - pub x: A, - pub y: B, -} - -pub fn f() -> S { - S { - x: 1, - y: 2, - } -} - -pub fn g() -> S { - S { - x: 3, - y: 4, - } -} -~~~~ - -This program as a single `struct` declaration `S`, which is used in the -functions `f` and `g`. Note that `S`'s declaration is _polymorphic_, as it uses -type parameters, but the uses of `S` in `f` and `g` are _monomorphic_, as `S`'s -type parameters are fully instantiated. Each unique, monomorphic instantiation -of an ADT gives rise to its own identifier. In the example above, this might -mean that the following identifiers are created when this code is compiled with -`mir-json`: - -* `S` gives rise to `example/abcd123::S::_adt456` -* `S` gives rise to `example/abcd123::S::_adt789` - -The suffix `_adt` is autogenerated by `mir-json` and is typically -difficult for humans to guess. For this reason, we offer a command to look up -an ADT more easily: - -* `mir_find_adt : MIRModule -> String -> [MIRType] -> MIRAdt` consults the - given `MIRModule` to find an algebraic data type (`MIRAdt`). It uses the given - `String` as an identifier and the given MIRTypes as the types to instantiate - the type parameters of the ADT. If such a `MIRAdt` cannot be found in the - `MIRModule`, this will raise an error. - -Note that the `String` argument to `mir_find_adt` does not need to include the -`_adt` suffix, as `mir_find_adt` will discover this for you. The `String` -is expected to adhere to the identifier conventions described in the "Running a -MIR-based verification" section. For instance, the following two lines will -look up `S` and `S` from the example above as `MIRAdt`s: - -~~~~ -m <- mir_load_module "example.linked-mir.json"; - -let s_8_16 = mir_find_adt m "example::S" [mir_u8, mir_u16]; -let s_32_64 = mir_find_adt m "example::S" [mir_u32, mir_u64]; -~~~~ - -The `mir_adt` command (for constructing a struct type), `mir_struct_value` (for -constructing a struct value), and `mir_enum_value` (for constructing an enum -value) commands in turn take a `MIRAdt` as an argument. - -#### Enums - -In addition to taking a `MIRAdt` as an argument, `mir_enum_value` also takes a -`String` representing the name of the variant to construct. The variant name -should be a short name such as `"None"` or `"Some"`, and not a full identifier -such as `"core::option::Option::None"` or `"core::option::Option::Some"`. This -is because the `MIRAdt` already contains the full identifiers for all of an -enum's variants, so SAW will use this information to look up a variant's -identifier from a short name. Here is an example of using `mir_enum_value` in -practice: - -~~~~ rust -pub fn n() -> Option { - None -} - -pub fn s(x: u32) -> Option { - Some(x) -} -~~~~ -~~~~ -m <- mir_load_module "example.linked-mir.json"; - -let option_u32 = mir_find_adt m "core::option::Option" [mir_u32]; - -let n_spec = do { - mir_execute_func []; - - mir_return (mir_enum_value option_u32 "None" []); -}; - -let s_spec = do { - x <- mir_fresh_var "x" mir_u32; - - mir_execute_func [mir_term x]; - - mir_return (mir_enum_value option_u32 "Some" [mir_term x]); -}; -~~~~ - -Note that `mir_enum_value` can only be used to construct a specific variant. If -you need to construct a symbolic enum value that can range over many potential -variants, use `mir_fresh_expanded_value` instead. - -#### Lifetimes - -Rust ADTs can have both type parameters as well as _lifetime_ parameters. The -following Rust code declares a lifetime parameter `'a` on the struct `S`, as -well on the function `f` that computes an `S` value: - -~~~~ rust -pub struct S<'a> { - pub x: &'a u32, -} - -pub fn f<'a>(y: &'a u32) -> S<'a> { - S { x: y } -} -~~~~ - -When `mir-json` compiles a piece of Rust code that contains lifetime -parameters, it will instantiate all of the lifetime parameters with a -placeholder MIR type that is simply called `lifetime`. This is important to -keep in mind when looking up ADTs with `mir_find_adt`, as you will also need to -indicate to SAW that the lifetime parameter is instantiated with `lifetime`. In -order to do so, use `mir_lifetime`. For example, here is how to look up `S` -with `'a` instantiated to `lifetime`: - -~~~~ -s_adt = mir_find_adt m "example::S" [mir_lifetime] -~~~~ - -Note that this part of SAW's design is subject to change in the future. -Ideally, users would not have to care about lifetimes at all at the MIR level; -see [this issue](https://github.com/GaloisInc/mir-json/issues/58) for further -discussion on this point. If that issue is fixed, then we will likely remove -`mir_lifetime`, as it will no longer be necessary. - -### Bitfields - -SAW has experimental support for specifying `struct`s with bitfields, such as -in the following example: - -~~~~ c -struct s { - uint8_t x:1; - uint8_t y:1; -}; -~~~~ - -Normally, a `struct` with two `uint8_t` fields would have an overall size of -two bytes. However, because the `x` and `y` fields are declared with bitfield -syntax, they are instead packed together into a single byte. - -Because bitfields have somewhat unusual memory representations in LLVM, some -special care is required to write SAW specifications involving bitfields. For -this reason, there is a dedicated `llvm_points_to_bitfield` function for this -purpose: - -* `llvm_points_to_bitfield : SetupValue -> String -> SetupValue -> LLVMSetup ()` - -The type of `llvm_points_to_bitfield` is similar that of `llvm_points_to`, -except that it takes the name of a field within a bitfield as an additional -argument. For example, here is how to assert that the `y` field in the `struct` -example above should be `0`: - -~~~~ -ss <- llvm_alloc (llvm_alias "struct.s"); -llvm_points_to_bitfield ss "y" (llvm_term {{ 0 : [1] }}); -~~~~ - -Note that the type of the right-hand side value (`0`, in this example) must -be a bitvector whose length is equal to the size of the field within the -bitfield. In this example, the `y` field was declared as `y:1`, so `y`'s value -must be of type `[1]`. - -Note that the following specification is _not_ equivalent to the one above: - -~~~~ -ss <- llvm_alloc (llvm_alias "struct.s"); -llvm_points_to (llvm_field ss "y") (llvm_term {{ 0 : [1] }}); -~~~~ - -`llvm_points_to` works quite differently from `llvm_points_to_bitfield` under -the hood, so using `llvm_points_to` on bitfields will almost certainly not work -as expected. - -In order to use `llvm_points_to_bitfield`, one must also use the -`enable_lax_loads_and_stores` command: - -* `enable_lax_loads_and_stores: TopLevel ()` - -Both `llvm_points_to_bitfield` and `enable_lax_loads_and_stores` are -experimental commands, so these also require using `enable_experimental` before -they can be used. - -The `enable_lax_loads_and_stores` command relaxes some -of SAW's assumptions about uninitialized memory, which is necessary to make -`llvm_points_to_bitfield` work under the hood. For example, reading from -uninitialized memory normally results in an error in SAW, but with -`enable_lax_loads_and_stores`, such a read will instead return a symbolic -value. At present, `enable_lax_loads_and_stores` only works with What4-based -tactics (e.g., `w4_unint_z3`); using it with SBV-based tactics -(e.g., `sbv_unint_z3`) will result in an error. - -Note that SAW relies on LLVM debug metadata in order to determine which struct -fields reside within a bitfield. As a result, you must pass `-g` to `clang` when -compiling code involving bitfields in order for SAW to be able to reason about -them. - -## Global variables - -SAW supports verifying LLVM and MIR specifications involving global variables. - -### LLVM global variables - -Mutable global variables that are accessed in a function must first be allocated -by calling `llvm_alloc_global` on the name of the global. - -* `llvm_alloc_global : String -> LLVMSetup ()` - -This ensures that all global variables that might influence the function are -accounted for explicitly in the specification: if `llvm_alloc_global` is -used in the precondition, there must be a corresponding `llvm_points_to` -in the postcondition describing the new state of that global. Otherwise, a -specification might not fully capture the behavior of the function, potentially -leading to unsoundness in the presence of compositional verification. (For more -details on this point, see the [Compositional Verification and Mutable Global -Variables](#compositional-verification-and-mutable-global-variables) section.) - -Immutable (i.e. `const`) global variables are allocated implicitly, and do not -require a call to `llvm_alloc_global`. - -Pointers to global variables or functions can be accessed with -`llvm_global`: - -* `llvm_global : String -> SetupValue` - -Like the pointers returned by `llvm_alloc`, however, these aren't -initialized at the beginning of symbolic -- setting global variables may -be unsound in the presence of [compositional -verification](#compositional-verification). - -To understand the issues surrounding global variables, consider the following C -code: - - -~~~ -int x = 0; - -int f(int y) { - x = x + 1; - return x + y; -} - -int g(int z) { - x = x + 2; - return x + z; -} -~~~ - -One might initially write the following specifications for `f` and `g`: - - -~~~ -m <- llvm_load_module "./test.bc"; - -f_spec <- llvm_verify m "f" [] true (do { - y <- llvm_fresh_var "y" (llvm_int 32); - llvm_execute_func [llvm_term y]; - llvm_return (llvm_term {{ 1 + y : [32] }}); -}) abc; - -g_spec <- llvm_llvm_verify m "g" [] true (do { - z <- llvm_fresh_var "z" (llvm_int 32); - llvm_execute_func [llvm_term z]; - llvm_return (llvm_term {{ 2 + z : [32] }}); -}) abc; -~~~ - -If globals were always initialized at the beginning of verification, -both of these specs would be provable. However, the results wouldn't -truly be compositional. For instance, it's not the case that `f(g(z)) == -z + 3` for all `z`, because both `f` and `g` modify the global variable -`x` in a way that crosses function boundaries. - -To deal with this, we can use the following function: - -* `llvm_global_initializer : String -> SetupValue` returns the value - of the constant global initializer for the named global variable. - -Given this function, the specifications for `f` and `g` can make this -reliance on the initial value of `x` explicit: - - -~~~ -m <- llvm_load_module "./test.bc"; - - -let init_global name = do { - llvm_alloc_global name; - llvm_points_to (llvm_global name) - (llvm_global_initializer name); -}; - -f_spec <- llvm_verify m "f" [] true (do { - y <- llvm_fresh_var "y" (llvm_int 32); - init_global "x"; - llvm_precond {{ y < 2^^31 - 1 }}; - llvm_execute_func [llvm_term y]; - llvm_return (llvm_term {{ 1 + y : [32] }}); -}) abc; -~~~ - -which initializes `x` to whatever it is initialized to in the C code at -the beginning of verification. This specification is now safe for -compositional verification: SAW won't use the specification `f_spec` -unless it can determine that `x` still has its initial value at the -point of a call to `f`. This specification also constrains `y` to prevent -signed integer overflow resulting from the `x + y` expression in `f`, -which is undefined behavior in C. - -### MIR static items - -Rust's static items are the MIR version of global variables. A reference to a -static item can be accessed with the `mir_static` function. This function takes -a `String` representing a static item's identifier, and this identifier is -expected to adhere to the naming conventions outlined in the "Running a -MIR-based verification" section: - -* `mir_static : String -> MIRValue` - -References to static values can be initialized with the `mir_points_to` -command, just like with other forms of references. Immutable static items -(e.g., `static X: u8 = 42`) are initialized implicitly in every SAW -specification, so there is no need for users to do so manually. Mutable static -items (e.g., `static mut Y: u8 = 27`), on the other hand, are *not* initialized -implicitly, and users must explicitly pick a value to initialize them with. - -The `mir_static_initializer` function can be used to access the initial value -of a static item in a MIR program. Like with `mir_static`, the `String` -supplied as an argument must be a valid identifier: - -* `mir_static_initializer : String -> MIRValue`. - -As an example of how to use these functions, here is a Rust program involving -static items: - -~~~ rust -// statics.rs -static S1: u8 = 1; -static mut S2: u8 = 2; - -pub fn f() -> u8 { - // Reading a mutable static item requires an `unsafe` block due to - // concurrency-related concerns. We are only concerned about the behavior - // of this program in a single-threaded context, so this is fine. - let s2 = unsafe { S2 }; - S1 + s2 -} -~~~ - -We can write a specification for `f` like so: - -~~~ -// statics.saw -enable_experimental; - -let f_spec = do { - mir_points_to (mir_static "statics::S2") - (mir_static_initializer "statics::S2"); - // Note that we do not initialize S1, as immutable static items are implicitly - // initialized in every specification. - - mir_execute_func []; - - mir_return (mir_term {{ 3 : [8] }}); -}; - -m <- mir_load_module "statics.linked-mir.json"; - -mir_verify m "statics::f" [] false f_spec z3; -~~~ - -In order to use a specification involving mutable static items for -compositional verification, it is required to specify the value of all mutable -static items using the `mir_points_to` command in the specification's -postconditions. For more details on this point, see the [Compositional -Verification and Mutable Global -Variables](#compositional-verification-and-mutable-global-variables) section. - -## Preconditions and Postconditions - -Sometimes a function is only well-defined under certain conditions, or -sometimes you may be interested in certain initial conditions that give -rise to specific final conditions. For these cases, you can specify an -arbitrary predicate as a precondition or post-condition, using any -values in scope at the time. - -* `llvm_precond : Term -> LLVMSetup ()` -* `llvm_postcond : Term -> LLVMSetup ()` -* `llvm_assert : Term -> LLVMSetup ()` -* `jvm_precond : Term -> JVMSetup ()` -* `jvm_postcond : Term -> JVMSetup ()` -* `jvm_assert : Term -> JVMSetup ()` -* `mir_precond : Term -> MIRSetup ()` -* `mir_postcond : Term -> MIRSetup ()` -* `mir_assert : Term -> MIRSetup ()` - -These commands take `Term` arguments, and therefore cannot describe the values -of pointers. The "assert" variants will work in either pre- or post-conditions, -and are useful when defining helper functions that, e.g., provide datastructure -invariants that make sense in both phases. The `{llvm,jvm,mir}_equal` commands -state that two values should be equal, and can be used in either the initial or -the final state. - -* `llvm_equal : SetupValue -> SetupValue -> LLVMSetup ()` -* `jvm_equal : JVMValue -> JVMValue -> JVMSetup ()` -* `mir_equal : MIRValue -> MIRValue -> MIRSetup ()` - -The use of `{llvm,jvm,mir}_equal` can also sometimes lead to more efficient -symbolic execution when the predicate of interest is an equality. - -## Assuming specifications - -Normally, a `MethodSpec` is the result of both simulation and proof of -the target code. However, in some cases, it can be useful to use a -`MethodSpec` to specify some code that either doesn't exist or is hard -to prove. The previously-mentioned [`assume_unsat` -tactic](#finishing-proofs-without-external-solvers) omits proof but does not prevent -simulation of the function. To skip simulation altogether, one can use -one of the following commands: - -~~~ -llvm_unsafe_assume_spec : - LLVMModule -> String -> LLVMSetup () -> TopLevel CrucibleMethodSpec - -jvm_unsafe_assume_spec : - JavaClass -> String -> JVMSetup () -> TopLevel JVMMethodSpec - -mir_unsafe_assume_spec : - MIRModule -> String -> MIRSetup () -> TopLevel MIRSpec -~~~ - -## A Heap-Based Example - -To tie all of the command descriptions from the previous sections -together, consider the case of verifying the correctness of a C program -that computes the dot product of two vectors, where the length and value -of each vector are encapsulated together in a `struct`. - -The dot product can be concisely specified in Cryptol as follows: - -~~~~ -dotprod : {n, a} (fin n, fin a) => [n][a] -> [n][a] -> [a] -dotprod xs ys = sum (zip (*) xs ys) -~~~~ - -To implement this in C, let's first consider the type of vectors: - -~~~~ c -typedef struct { - uint32_t *elts; - uint32_t size; -} vec_t; -~~~~ - -This struct contains a pointer to an array of 32-bit elements, and a -32-bit value indicating how many elements that array has. - -We can compute the dot product of two of these vectors with the -following C code (which uses the size of the shorter vector if they -differ in size). - -~~~~ c -uint32_t dotprod_struct(vec_t *x, vec_t *y) { - uint32_t size = MIN(x->size, y->size); - uint32_t res = 0; - for(size_t i = 0; i < size; i++) { - res += x->elts[i] * y->elts[i]; - } - return res; -} -~~~~ - -The entirety of this implementation can be found in the -`examples/llvm/dotprod_struct.c` file in the `saw-script` repository. - -To verify this program in SAW, it will be convenient to define a couple -of utility functions (which are generally useful for many -heap-manipulating programs). First, combining allocation and -initialization to a specific value can make many scripts more concise: - -~~~~ -let alloc_init ty v = do { - p <- llvm_alloc ty; - llvm_points_to p v; - return p; -}; -~~~~ - -This creates a pointer `p` pointing to enough space to store type `ty`, -and then indicates that the pointer points to value `v` (which should be -of that same type). - -A common case for allocation and initialization together is when the -initial value should be entirely symbolic. - -~~~~ -let ptr_to_fresh n ty = do { - x <- llvm_fresh_var n ty; - p <- alloc_init ty (llvm_term x); - return (x, p); -}; -~~~~ - -This function returns the pointer just allocated along with the fresh -symbolic value it points to. - -Given these two utility functions, the `dotprod_struct` function can be -specified as follows: - -~~~~ -let dotprod_spec n = do { - let nt = llvm_term {{ `n : [32] }}; - (xs, xsp) <- ptr_to_fresh "xs" (llvm_array n (llvm_int 32)); - (ys, ysp) <- ptr_to_fresh "ys" (llvm_array n (llvm_int 32)); - let xval = llvm_struct_value [ xsp, nt ]; - let yval = llvm_struct_value [ ysp, nt ]; - xp <- alloc_init (llvm_alias "struct.vec_t") xval; - yp <- alloc_init (llvm_alias "struct.vec_t") yval; - llvm_execute_func [xp, yp]; - llvm_return (llvm_term {{ dotprod xs ys }}); -}; -~~~~ - -Any instantiation of this specification is for a specific vector length -`n`, and assumes that both input vectors have that length. That length -`n` automatically becomes a type variable in the subsequent Cryptol -expressions, and the backtick operator is used to reify that type as a -bit vector of length 32. - -The entire script can be found in the `dotprod_struct-crucible.saw` file -alongside `dotprod_struct.c`. - -Running this script results in the following: - -~~~~ -Loading file "dotprod_struct.saw" -Proof succeeded! dotprod_struct -Registering override for `dotprod_struct` - variant `dotprod_struct` -Symbolic simulation completed with side conditions. -Proof succeeded! dotprod_wrap -~~~~ - -## Using Ghost State - -In some cases, information relevant to verification is not directly -present in the concrete state of the program being verified. This can -happen for at least two reasons: - -* When providing specifications for external functions, for which source - code is not present. The external code may read and write global state - that is not directly accessible from the code being verified. - -* When the abstract specification of the program naturally uses a - different representation for some data than the concrete - implementation in the code being verified does. - -One solution to these problems is the use of _ghost_ state. This can be -thought of as additional global state that is visible only to the -verifier. Ghost state with a given name can be declared at the top level -with the following function: - -* `declare_ghost_state : String -> TopLevel Ghost` - -Ghost state variables do not initially have any particluar type, and can -store data of any type. Given an existing ghost variable the following -functions can be used to specify its value: - -* `llvm_ghost_value : Ghost -> Term -> LLVMSetup ()` -* `jvm_ghost_value : Ghost -> Term -> JVMSetup ()` -* `mir_ghost_value : Ghost -> Term -> MIRSetup ()` - -These can be used in either the pre state or the post state, to specify the -value of ghost state either before or after the execution of the function, -respectively. - -## An Extended Example - -To tie together many of the concepts in this manual, we now present a -non-trivial verification task in its entirety. All of the code for this example -can be found in the `examples/salsa20` directory of -[the SAWScript repository](https://github.com/GaloisInc/saw-script). - -### Salsa20 Overview - -Salsa20 is a stream cipher developed in 2005 by Daniel J. Bernstein, built on a -pseudorandom function utilizing add-rotate-XOR (ARX) operations on 32-bit -words[^4]. Bernstein himself has provided several public domain -implementations of the cipher, optimized for common machine architectures. -For the mathematically inclined, his specification for the cipher can be -found [here](http://cr.yp.to/snuffle/spec.pdf). - -The repository referenced above contains three implementations of the Salsa20 -cipher: A reference Cryptol implementation (which we take as correct in this -example), and two C implementations, one of which is from Bernstein himself. -For this example, we focus on the second of these C -implementations, which more closely matches the Cryptol implementation. Full -verification of Bernstein's implementation is available in -`examples/salsa20/djb`, for the interested. The code for this verification task -can be found in the files named according to the pattern -`examples/salsa20/(s|S)alsa20.*`. - -### Specifications - -We now take on the actual verification task. This will be done in two stages: -We first define some useful utility functions for constructing common patterns -in the specifications for this type of program (i.e. one where the arguments to -functions are modified in-place.) We then demonstrate how one might construct a -specification for each of the functions in the Salsa20 implementation described -above. - -#### Utility Functions - -We first define the function -`alloc_init : LLVMType -> Term -> LLVMSetup SetupValue`. - -`alloc_init ty v` returns a `SetupValue` consisting of a pointer to memory -allocated and initialized to a value `v` of type `ty`. `alloc_init_readonly` -does the same, except the memory allocated cannot be written to. - -~~~~ -import "Salsa20.cry"; - -let alloc_init ty v = do { - p <- llvm_alloc ty; - llvm_points_to p (llvm_term v); - return p; -}; - -let alloc_init_readonly ty v = do { - p <- llvm_alloc_readonly ty; - llvm_points_to p (llvm_term v); - return p; -}; -~~~~ - -We now define -`ptr_to_fresh : String -> LLVMType -> LLVMSetup (Term, SetupValue)`. - -`ptr_to_fresh n ty` returns a pair `(x, p)` consisting of a fresh symbolic -variable `x` of type `ty` and a pointer `p` to it. `n` specifies the -name that SAW should use when printing `x`. `ptr_to_fresh_readonly` does the -same, but returns a pointer to space that cannot be written to. - -~~~~ -let ptr_to_fresh n ty = do { - x <- llvm_fresh_var n ty; - p <- alloc_init ty x; - return (x, p); -}; - -let ptr_to_fresh_readonly n ty = do { - x <- llvm_fresh_var n ty; - p <- alloc_init_readonly ty x; - return (x, p); -}; -~~~~ - -Finally, we define -`oneptr_update_func : String -> LLVMType -> Term -> LLVMSetup ()`. - -`oneptr_update_func n ty f` specifies the behavior of a function that takes -a single pointer (with a printable name given by `n`) to memory containing a -value of type `ty` and mutates the contents of that memory. The specification -asserts that the contents of this memory after execution are equal to the value -given by the application of `f` to the value in that memory before execution. - -~~~~ -let oneptr_update_func n ty f = do { - (x, p) <- ptr_to_fresh n ty; - llvm_execute_func [p]; - llvm_points_to p (llvm_term {{ f x }}); -}; -~~~~ - -#### The `quarterround` operation - -The C function we wish to verify has type -`void s20_quarterround(uint32_t *y0, uint32_t *y1, uint32_t *y2, uint32_t *y3)`. - -The function's specification generates four symbolic variables and pointers to -them in the precondition/setup stage. The pointers are passed to the function -during symbolic execution via `llvm_execute_func`. Finally, in the -postcondition/return stage, the expected values are computed using the trusted -Cryptol implementation and it is asserted that the pointers do in fact point to -these expected values. - -~~~~ -let quarterround_setup : LLVMSetup () = do { - (y0, p0) <- ptr_to_fresh "y0" (llvm_int 32); - (y1, p1) <- ptr_to_fresh "y1" (llvm_int 32); - (y2, p2) <- ptr_to_fresh "y2" (llvm_int 32); - (y3, p3) <- ptr_to_fresh "y3" (llvm_int 32); - - llvm_execute_func [p0, p1, p2, p3]; - - let zs = {{ quarterround [y0,y1,y2,y3] }}; // from Salsa20.cry - llvm_points_to p0 (llvm_term {{ zs@0 }}); - llvm_points_to p1 (llvm_term {{ zs@1 }}); - llvm_points_to p2 (llvm_term {{ zs@2 }}); - llvm_points_to p3 (llvm_term {{ zs@3 }}); -}; -~~~~ - -#### Simple Updating Functions - -The following functions can all have their specifications given by the utility -function `oneptr_update_func` implemented above, so there isn't much to say -about them. - -~~~~ -let rowround_setup = - oneptr_update_func "y" (llvm_array 16 (llvm_int 32)) {{ rowround }}; - -let columnround_setup = - oneptr_update_func "x" (llvm_array 16 (llvm_int 32)) {{ columnround }}; - -let doubleround_setup = - oneptr_update_func "x" (llvm_array 16 (llvm_int 32)) {{ doubleround }}; - -let salsa20_setup = - oneptr_update_func "seq" (llvm_array 64 (llvm_int 8)) {{ Salsa20 }}; -~~~~ - -#### 32-Bit Key Expansion - -The next function of substantial behavior that we wish to verify has the -following prototype: - -~~~~c -void s20_expand32( uint8_t *k - , uint8_t n[static 16] - , uint8_t keystream[static 64] - ) -~~~~ - -This function's specification follows a similar pattern to that of -`s20_quarterround`, though for extra assurance we can make sure that the -function does not write to the memory pointed to by `k` or `n` using the -utility `ptr_to_fresh_readonly`, as this function should only modify -`keystream`. Besides this, we see the call to the trusted Cryptol -implementation specialized to `a=2`, which does 32-bit key expansion (since the -Cryptol implementation can also specialize to `a=1` for 16-bit keys). This -specification can easily be changed to work with 16-bit keys. - -~~~~ -let salsa20_expansion_32 = do { - (k, pk) <- ptr_to_fresh_readonly "k" (llvm_array 32 (llvm_int 8)); - (n, pn) <- ptr_to_fresh_readonly "n" (llvm_array 16 (llvm_int 8)); - - pks <- llvm_alloc (llvm_array 64 (llvm_int 8)); - - llvm_execute_func [pk, pn, pks]; - - let rks = {{ Salsa20_expansion`{a=2}(k, n) }}; - llvm_points_to pks (llvm_term rks); -}; -~~~~ - -#### 32-bit Key Encryption - -Finally, we write a specification for the encryption function itself, which has -type - -~~~~c -enum s20_status_t s20_crypt32( uint8_t *key - , uint8_t nonce[static 8] - , uint32_t si - , uint8_t *buf - , uint32_t buflen - ) -~~~~ - -As before, we can ensure this function does not modify the memory pointed to by -`key` or `nonce`. We take `si`, the stream index, to be 0. The specification is -parameterized on a number `n`, which corresponds to `buflen`. Finally, to deal -with the fact that this function returns a status code, we simply specify that -we expect a success (status code 0) as the return value in the postcondition -stage of the specification. - -~~~~ -let s20_encrypt32 n = do { - (key, pkey) <- ptr_to_fresh_readonly "key" (llvm_array 32 (llvm_int 8)); - (v, pv) <- ptr_to_fresh_readonly "nonce" (llvm_array 8 (llvm_int 8)); - (m, pm) <- ptr_to_fresh "buf" (llvm_array n (llvm_int 8)); - - llvm_execute_func [ pkey - , pv - , llvm_term {{ 0 : [32] }} - , pm - , llvm_term {{ `n : [32] }} - ]; - - llvm_points_to pm (llvm_term {{ Salsa20_encrypt (key, v, m) }}); - llvm_return (llvm_term {{ 0 : [32] }}); -}; -~~~~ - -### Verifying Everything - -Finally, we can verify all of the functions. Notice the use of compositional -verification and that path satisfiability checking is enabled for those -functions with loops not bounded by explicit constants. Notice that we prove -the top-level function for several sizes; this is due to the limitation that -SAW can only operate on finite programs (while Salsa20 can operate on any input -size.) - -~~~~ -let main : TopLevel () = do { - m <- llvm_load_module "salsa20.bc"; - qr <- llvm_verify m "s20_quarterround" [] false quarterround_setup abc; - rr <- llvm_verify m "s20_rowround" [qr] false rowround_setup abc; - cr <- llvm_verify m "s20_columnround" [qr] false columnround_setup abc; - dr <- llvm_verify m "s20_doubleround" [cr,rr] false doubleround_setup abc; - s20 <- llvm_verify m "s20_hash" [dr] false salsa20_setup abc; - s20e32 <- llvm_verify m "s20_expand32" [s20] true salsa20_expansion_32 abc; - s20encrypt_63 <- llvm_verify m "s20_crypt32" [s20e32] true (s20_encrypt32 63) abc; - s20encrypt_64 <- llvm_verify m "s20_crypt32" [s20e32] true (s20_encrypt32 64) abc; - s20encrypt_65 <- llvm_verify m "s20_crypt32" [s20e32] true (s20_encrypt32 65) abc; - - print "Done!"; -}; -~~~~ - -[^4]: https://en.wikipedia.org/wiki/Salsa20 - -## Verifying Cryptol FFI functions - -SAW has special support for verifying the correctness of Cryptol's -[`foreign` -functions](https://galoisinc.github.io/cryptol/master/FFI.html), -implemented in a language such as C which compiles to LLVM, provided -that there exists a [reference Cryptol -implementation](https://galoisinc.github.io/cryptol/master/FFI.html#cryptol-implementation-of-foreign-functions) -of the function as well. Since the way in which `foreign` functions are -called is precisely specified by the Cryptol FFI, SAW is able to -generate a `LLVMSetup ()` spec directly from the type of a Cryptol -`foreign` function. This is done with the `llvm_ffi_setup` command, -which is experimental and requires `enable_experimental;` to be run -beforehand. -``` -llvm_ffi_setup : Term -> LLVMSetup () -``` - -For instance, for the simple imported Cryptol foreign function `foreign -add : [32] -> [32] -> [32]` we can obtain a `LLVMSetup` spec simply by -writing -``` -let add_setup = llvm_ffi_setup {{ add }}; -``` -which behind the scenes expands to something like -``` -let add_setup = do { - in0 <- llvm_fresh_var "in0" (llvm_int 32); - in1 <- llvm_fresh_var "in1" (llvm_int 32); - llvm_execute_func [llvm_term in0, llvm_term in1]; - llvm_return (llvm_term {{ add in0 in1 }}); -}; -``` - -### Polymorphism - -In general, Cryptol `foreign` functions can be polymorphic, with type -parameters of kind `#`, representing e.g. the sizes of input sequences. -However, any individual `LLVMSetup ()` spec only specifies the behavior -of the LLVM function on inputs of concrete sizes. We handle this by -allowing the argument term of `llvm_ffi_setup` to contain any necessary -type arguments in addition to the Cryptol function name, so that the -resulting term is monomorphic. The user can then define a parameterized -specification simply as a SAWScript function in the usual way. For -example, for a function `foreign f : {n, m} (fin n, fin m) => [n][32] -> -[m][32]`, we can obtain a parameterized `LLVMSetup` spec by -``` -let f_setup (n : Int) (m : Int) = llvm_ffi_setup {{ f`{n, m} }}; -``` -Note that the `Term` parameter that `llvm_ffi_setup` takes is restricted -syntactically to the format described above (``{{ fun`{tyArg0, tyArg1, -..., tyArgN} }}``), and cannot be any arbitrary term. - -### Supported types - -`llvm_ffi_setup` supports all Cryptol types that are supported by the -Cryptol FFI, with the exception of `Integer`, `Rational`, `Z`, and -`Float`. `Integer`, `Rational`, and `Z` are not supported since they are -translated to `gmp` arbitrary-precision types which are hard for SAW to -handle without additional overrides. There is no fundamental obstacle to -supporting `Float`, and in fact `llvm_ffi_setup` itself does work with -Cryptol floating point types, but the underlying functions such as -`llvm_fresh_var` do not, so until that is implemented `llvm_ffi_setup` -can generate a spec involving floating point types but it cannot -actually be run. - -### Performing the verification - -The resulting `LLVMSetup ()` spec can be used with the existing -`llvm_verify` function to perform the actual verification. And the -`LLVMSpec` output from that can be used as an override as usual for -further compositional verification. -``` -f_ov <- llvm_verify mod "f" [] true (f_setup 3 5) z3; -``` - -As with the Cryptol FFI itself, SAW does not manage the compilation of -the C source implementations of `foreign` functions to LLVM bitcode. For -the verification to be meaningful, is expected that the LLVM module -passed to `llvm_verify` matches the compiled dynamic library actually -used with the Cryptol interpreter. Alternatively, on x86_64 Linux, SAW -can perform verification directly on the `.so` ELF file with the -experimental `llvm_verify_x86` command. - -# Extraction to the Coq theorem prover - -In addition to the (semi-)automatic and compositional proof modes -already discussed above, SAW has experimental support for exporting -Cryptol and SAWCore values as terms to the Coq proof assistant[^5]. -This is intended to support more manual proof efforts for properties -that go beyond what SAW can support (for example, proofs requiring -induction) or for connecting to preexisting formalizations in Coq -of useful algorithms (e.g. the fiat crypto library[^6]). - -This support consists of two related pieces. The first piece is a library of -formalizations of the primitives underlying Cryptol and SAWCore and -various supporting concepts that help bridge the conceptual gap -between SAW and Coq. The second piece is a term translation -that maps the syntactic forms of SAWCore onto corresponding -concepts in Coq syntax, designed to dovetail with the concepts -defined in the support library. SAWCore is a quite similar language -to the core calculus underlying Coq, so much of this translation is -quite straightforward; however, the languages are not exactly -equivalent, and there are some tricky cases that mostly arise from -Cryptol code that can only be partially supported. We will note -these restrictions later in the manual. - -We expect this extraction process to work with a fairly wide range of Coq -versions, as we are not using bleeding-edge Coq features. It has been -most fully tested with Coq version 8.13.2. - -## Support Library - -In order to make use of SAW's extraction capabilities, one must first -compile the support library using Coq so that the included definitions -and theorems can be referenced by the extracted code. From the top -directory of the SAW source tree, the source code for this support -library can be found in the `saw-core-coq/coq` subdirectory. -In this subdirectory you will find a `_CoqProject` and a `Makefile`. -A simple `make` invocation should be enough to compile -all the necessary files, assuming Coq is installed and `coqc` is -available in the user's `PATH`. HTML documentation for the support -library can also be generated by `make html` from the same directory. - -Once the library is compiled, the recommended way to import -it into your subsequent development is by adding the following -lines to your `_CoqProject` file: - -``` --Q /saw-core-coq/coq/generated/CryptolToCoq CryptolToCoq --Q /saw-core-coq/coq/handwritten/CryptolToCoq CryptolToCoq -``` - -Here `` refers to the location on your system where the -SAWScript source tree is checked out. This will add the relevant -library files to the `CryptolToCoq` namespace, where the extraction -process will expect to find them. - -The support library for extraction is broken into two parts: those -files which are handwritten, versus those that are automatically -generated. The handwritten files are generally fairly readable and -are reasonable for human inspection; they define most of the -interesting pipe-fitting that allows Cryptol and SAWCore definitions -to connect to corresponding Coq concepts. In particular the -file `SAWCoreScaffolding.v` file defines most of the bindings of base -types to Coq types, and the `SAWCoreVectorsAsCoqVectors.v` defines the -core bitvector operations. The automatically generated files are direct -translations of the SAWCore source files -(`saw-core/prelude/Prelude.sawcore` and -`cryptol-saw-core/saw/Cryptol.sawcore`) that correspond to the -standard libraries for SAWCore and Cryptol, respectively. - -The autogenerated files are intended to be kept up-to-date with -changes in the corresponding `sawcore` files, and end users should -not need to generate them. Nonetheless, if they are out of sync for some -reason, these files may be regenerated using the `saw` executable -by running `(cd saw-core-coq; saw saw/generate_scaffolding.saw)` -from the top-level of the SAW source directory before compiling them -with Coq as described above. - -You may also note some additional files and concepts in the standard -library, such as `CompM.v`, and a variety of lemmas and definitions -related to it. These definitions are related to the "heapster" system, -which form a separate use-case for the SAWCore to Coq translation. -These definitions will not be used for code extracted from Cryptol. - -## Cryptol module extraction - -There are several modes of use for the SAW to Coq term extraction -facility, but the easiest to use is whole Cryptol module extraction. -This will extract all the definitions in the given Cryptol module, -together with it's transitive dependencies, into a single Coq module -which can then be compiled and pulled into subsequence developments. - -Suppose we have a Cryptol source file named `source.cry` and we want -to generate a Coq file named `output.v`. We can accomplish this by -running the following commands in saw (either directly from the `saw` -command prompt, or via a script file) - -``` -enable_experimental; -write_coq_cryptol_module "source.cry" "output.v" [] []; -``` - -In this default mode, identifiers in the Cryptol source will be -directly translated into identifiers in Coq. This may occasionally -cause problems if source identifiers clash with Coq keywords or -preexisting definitions. The third argument to -`write_coq_cryptol_module` can be used to remap such names if -necessary by giving a list of `(in,out)` pairs of names. The fourth -argument is a list of source identifiers to skip translating, if -desired. Authoritative online documentation for this command can be -obtained directly from the `saw` executable via `:help -write_coq_cryptol_module` after `enable_experimental`. - -The resulting "output.v" file will have some of the usual hallmarks of -computer-generated code; it will have poor formatting and, explicit -parenthesis and fully-qualified names. Thankfully, once loaded into -Coq, the Coq pretty-printer will do a much better job of rendering -these terms in a somewhat human-readable way. - -## Proofs involving uninterpreted functions - -It is possible to write a Cryptol module that references uninterpreted -functions by using the `primitive` keyword to declare them in your -Cryptol source. Primitive Cryptol declarations will be translated into -Coq section variables; as usual in Coq, uses of these section -variables will be translated into additional parameters to the -definitions from outside the section. In this way, consumers of -the translated module can instantiate the declared Cryptol functions -with corresponding terms in subsequent Coq developments. - -Although the Cryptol interpreter itself will not be able to compute -with declared but undefined functions of this sort, they can be used -both to provide specifications for functions to be verified with -`llvm_verify` or `jvm_verify` and also for Coq extraction. - -For example, if I write the following Cryptol source file: - -``` -primitive f : Integer -> Integer - -g : Integer -> Bool -g x = f (f x) > 0 -``` - -After extraction, the generated term `g` will have Coq type: - -``` -(Integer -> Integer) -> Integer -> Bool -``` - -## Translation limitations and caveats - -Translation from Cryptol to Coq has a number of fundamental -limitations that must be addressed. The most severe of these is that -Cryptol is a fully general-recursive language, and may exhibit runtime -errors directly via calls to the `error` primitive, or via partial -operations (such as indexing a sequence out-of-bounds). The internal -language of Coq, by contrast, is a strongly-normalizing language of -total functions. As such, our translation is unable to extract all -Cryptol programs. - -### Recursive programs - -The most severe of the currently limitations for our system -is that the translation is unable to translate any recursive Cryptol -program. Doing this would require us to attempt to find some -termination argument for the recursive function sufficient to satisfy -Coq; for now, no attempt is made to do so. if you attempt to -extract a recursive function, SAW will produce an error -about a "malformed term" with `Prelude.fix` as the head symbol. - -Certain limited kinds of recursion are available via the -`foldl` Cryptol primitive operation, which is translated directly -into a fold operation in Coq. This is sufficient for many basic -iterative algorithms. - -### Type coercions - -Another limitation of the translation system is that Cryptol uses SMT -solvers during its typechecking process and uses the results of solver -proofs to justify some of its typing judgments. When extracting these -terms to Coq, type equality coercions must be generated. Currently, we -do not have a good way to transport the reasoning done inside -Cryptol's typechecker into Coq, so we just supply a very simple `Ltac` -tactic to discharge these coercions (see `solveUnsafeAssert` in -`CryptolPrimitivesForSAWCoreExtra.v`). This tactic is able to -discover simple coercions, but for anything nontrivial it may -fail. The result will be a typechecking failure when compiling the -generated code in Coq when the tactic fails. If you encounter this -problem, it may be possible to enhance the `solveUnsafeAssert` tactic -to cover your use case. - -### Error terms - -A final caveat that is worth mentioning is that Cryptol can sometimes -produce runtime errors. These can arise from explicit calls to the -`error` primitive, or from partially defined operations (e.g., -division by zero or sequence access out of bounds). Such instances -are translated to occurrences of an unrealized Coq axiom named `error`. -In order to avoid introducing an inconsistent environment, the `error` -axiom is restricted to apply only to inhabited types. All the types -arising from Cryptol programs are inhabited, so this is no problem -in principle. However, collecting and passing this information around -on the Coq side is a little tricky. - -The main technical device we use here is the `Inhabited` type class; -it simply asserts that a type has some distinguished inhabitant. We -provide instances for the base types and type constructors arising -from Cryptol, so the necessary instances ought to be automatically -constructed when needed. However, polymorphic Cryptol functions add -some complications, as type arguments must also come together with -evidence that they are inhabited. The translation process takes care -to add the necessary `Inhabited` arguments, so everything ought to -work out. However, if Coq typechecking of generated code fails with -errors about `Inhabited` class instances, it likely represents some -problem with this aspect of the translation. - - -[^5]: https://coq.inria.fr -[^6]: https://github.com/mit-plv/fiat-crypto - -# Analyzing Hardware Circuits using Yosys -SAW has experimental support for analysis of hardware descriptions written in VHDL ([via GHDL](https://github.com/ghdl/ghdl-yosys-plugin)) through an intermediate representation produced by [Yosys](https://yosyshq.net/yosys/). -This generally follows the same conventions and idioms used in the rest of SAWScript. - -## Processing VHDL With Yosys -Given a VHDL file `test.vhd` containing an entity `test`, one can generate an intermediate representation `test.json` suitable for loading into SAW: - -~~~~ -$ ghdl -a test.vhd -$ yosys -... -Yosys 0.10+1 (git sha1 7a7df9a3b4, gcc 10.3.0 -fPIC -Os) -yosys> ghdl test - -1. Executing GHDL. -Importing module test. - -yosys> write_json test.json - -2. Executing JSON backend. -~~~~ - -It can sometimes be helpful to invoke additional Yosys passes between the `ghdl` and `write_json` commands. -For example, at present SAW does not support the `$pmux` cell type. -Yosys is able to convert `$pmux` cells into trees of `$mux` cells using the `pmuxtree` command. -We expect there are many other situations where Yosys' considerable library of commands is valuable for pre-processing. - -## Example: Ripple-Carry Adder -Consider three VHDL entities. -First, a half-adder: - -~~~~vhdl -library ieee; -use ieee.std_logic_1164.all; - -entity half is - port ( - a : in std_logic; - b : in std_logic; - c : out std_logic; - s : out std_logic - ); -end half; - -architecture halfarch of half is -begin - c <= a and b; - s <= a xor b; -end halfarch; -~~~~ - -Next, a one-bit adder built atop that half-adder: - -~~~~vhdl -library ieee; -use ieee.std_logic_1164.all; - -entity full is - port ( - a : in std_logic; - b : in std_logic; - cin : in std_logic; - cout : out std_logic; - s : out std_logic - ); -end full; - -architecture fullarch of full is - signal half0c : std_logic; - signal half0s : std_logic; - signal half1c : std_logic; -begin - half0 : entity work.half port map (a => a, b => b, c => half0c, s => half0s); - half1 : entity work.half port map (a => half0s, b => cin, c => half1c, s => s); - cout <= half0c or half1c; -end fullarch; -~~~~ - -Finally, a four-bit adder: - -~~~~vhdl -library ieee; -use ieee.std_logic_1164.all; - -entity add4 is - port ( - a : in std_logic_vector(0 to 3); - b : in std_logic_vector(0 to 3); - res : out std_logic_vector(0 to 3) - ); -end add4; - -architecture add4arch of add4 is - signal full0cout : std_logic; - signal full1cout : std_logic; - signal full2cout : std_logic; - signal ignore : std_logic; -begin - full0 : entity work.full port map (a => a(0), b => b(0), cin => '0', cout => full0cout, s => res(0)); - full1 : entity work.full port map (a => a(1), b => b(1), cin => full0cout, cout => full1cout, s => res(1)); - full2 : entity work.full port map (a => a(2), b => b(2), cin => full1cout, cout => full2cout, s => res(2)); - full3 : entity work.full port map (a => a(3), b => b(3), cin => full2cout, cout => ignore, s => res(3)); -end add4arch; -~~~~ - -Using GHDL and Yosys, we can convert the VHDL source above into a format that SAW can import. -If all of the code above is in a file `adder.vhd`, we can run the following commands: - -~~~~ -$ ghdl -a adder.vhd -$ yosys -p 'ghdl add4; write_json adder.json' -~~~~ - -The produced file `adder.json` can then be loaded into SAW with `yosys_import`: - -~~~~ -$ saw -... -sawscript> enable_experimental -sawscript> m <- yosys_import "adder.json" -sawscript> :type m -Term -sawscript> type m -[23:57:14.492] {add4 : {a : [4], b : [4]} -> {res : [4]}, - full : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]}, - half : {a : [1], b : [1]} -> {c : [1], s : [1]}} -~~~~ - -`yosys_import` returns a `Term` with a Cryptol record type, where the fields correspond to each VHDL module. -We can access the fields of this record like we would any Cryptol record, and call the functions within like any Cryptol function. - -~~~~ -sawscript> type {{ m.add4 }} -[00:00:25.255] {a : [4], b : [4]} -> {res : [4]} -sawscript> eval_int {{ (m.add4 { a = 1, b = 2 }).res }} -[00:02:07.329] 3 -~~~~ - -We can also use all of SAW's infrastructure for asking solvers about `Term`s, such as the `sat` and `prove` commands. -For example: - -~~~~ -sawscript> sat w4 {{ m.add4 === \_ -> { res = 5 } }} -[00:04:41.993] Sat: [_ = (5, 0)] -sawscript> prove z3 {{ m.add4 === \inp -> { res = inp.a + inp.b } }} -[00:05:43.659] Valid -sawscript> prove yices {{ m.add4 === \inp -> { res = inp.a - inp.b } }} -[00:05:56.171] Invalid: [_ = (8, 13)] -~~~~ - -The full library of `ProofScript` tactics is available in this setting. -If necessary, proof tactics like `simplify` can be used to rewrite goals before querying a solver. - -Special support is provided for the common case of equivalence proofs between HDL modules and other `Term`s (e.g. Cryptol functions, other HDL modules, or "extracted" imperative LLVM or JVM code). -The command `yosys_verify` has an interface similar to `llvm_verify`: given a specification, some lemmas, and a proof tactic, it produces evidence of a proven equivalence that may be passed as a lemma to future calls of `yosys_verify`. -For example, consider the following Cryptol specifications for one-bit and four-bit adders: - -~~~~cryptol -cryfull : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} -cryfull inp = { cout = [cout], s = [s] } - where [cout, s] = zext inp.a + zext inp.b + zext inp.cin - -cryadd4 : {a : [4], b : [4]} -> {res : [4]} -cryadd4 inp = { res = inp.a + inp.b } -~~~~ - -We can prove equivalence between `cryfull` and the VHDL `full` module: - -~~~~ -sawscript> full_spec <- yosys_verify {{ m.full }} [] {{ cryfull }} [] w4; -~~~~ - -The result `full_spec` can then be used as an "override" when proving equivalence between `cryadd4` and the VHDL `add4` module: - -~~~~ -sawscript> add4_spec <- yosys_verify {{ m.add4 }} [] {{ cryadd4 }} [full_spec] w4; -~~~~ - -The above could also be accomplished through the use of `prove_print` and term rewriting, but it is much more verbose. - -`yosys_verify` may also be given a list of preconditions under which the equivalence holds. -For example, consider the following Cryptol specification for `full` that ignores the `cin` bit: - -~~~~cryptol -cryfullnocarry : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} -cryfullnocarry inp = { cout = [cout], s = [s] } - where [cout, s] = zext inp.a + zext inp.b -~~~~ - -This is not equivalent to `full` in general, but it is if constrained to inputs where `cin = 0`. -We may express that precondition like so: - -~~~~ -sawscript> full_nocarry_spec <- yosys_verify {{ adderm.full }} [{{\(inp : {a : [1], b : [1], cin : [1]}) -> inp.cin == 0}}] {{ cryfullnocarry }} [] w4; -~~~~ - -The resulting override `full_nocarry_spec` may still be used in the proof for `add4` (this is accomplished by rewriting to a conditional expression). - -## API Reference -N.B: The following commands must first be enabled using `enable_experimental`. - -* `yosys_import : String -> TopLevel Term` produces a `Term` given the path to a JSON file produced by the Yosys `write_json` command. - The resulting term is a Cryptol record, where each field corresponds to one HDL module exported by Yosys. - Each HDL module is in turn represented by a function from a record of input port values to a record of output port values. - For example, consider a Yosys JSON file derived from the following VHDL entities: - ~~~~vhdl - entity half is - port ( - a : in std_logic; - b : in std_logic; - c : out std_logic; - s : out std_logic - ); - end half; - - entity full is - port ( - a : in std_logic; - b : in std_logic; - cin : in std_logic; - cout : out std_logic; - s : out std_logic - ); - end full; - ~~~~ - The resulting `Term` will have the type: - ~~~~ - { half : {a : [1], b : [1]} -> {c : [1], s : [1]} - , full : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} - } - ~~~~ -* `yosys_verify : Term -> [Term] -> Term -> [YosysTheorem] -> ProofScript () -> TopLevel YosysTheorem` proves equality between an HDL module and a specification. - The first parameter is the HDL module - given a record `m` from `yosys_import`, this will typically look something like `{{ m.foo }}`. - The second parameter is a list of preconditions for the equality. - The third parameter is the specification, a term of the same type as the HDL module, which will typically be some Cryptol function or another HDL module. - The fourth parameter is a list of "overrides", which witness the results of previous `yosys_verify` proofs. - These overrides can be used to simplify terms by replacing use sites of submodules with their specifications. - - Note that `Term`s derived from HDL modules are "first class", and are not restricted to `yosys_verify`: they may also be used with SAW's typical `Term` infrastructure like `sat`, `prove_print`, term rewriting, etc. - `yosys_verify` simply provides a convenient and familiar interface, similar to `llvm_verify` or `jvm_verify`. - -# Bisimulation Prover - -SAW contains a bisimulation prover to prove that two terms simulate each other. -This prover allows users to prove that two terms executing in lockstep satisfy -some relations over the state of each circuit and their outputs. This type of -proof is useful in demonstrating the eventual equivalence of two circuits, or -of a circuit and a functional specification. SAW enables these proofs with the -experimental `prove_bisim` command: - -~~~~ -prove_bisim : ProofScript () -> [BisimTheorem] -> Term -> Term -> Term -> Term -> TopLevel BisimTheorem -~~~~ - -When invoking `prove_bisim strat theorems srel orel lhs rhs`, the arguments -represent the following: - -1. `strat`: A proof strategy to use during verification. -2. `theorems`: A list of already proven bisimulation theorems. -3. `srel`: A state relation between `lhs` and `rhs`. This relation must have - the type `lhsState -> rhsState -> Bit`. The relation's first argument is - `lhs`'s state prior to execution. The relation's second argument is `rhs`'s - state prior to execution. `srel` then returns a `Bit` indicating whether - the two arguments satisfy the bisimulation's state relation. -4. `orel`: An output relation between `lhs` and `rhs`. This relation must have - the type `(lhsState, output) -> (rhsState, output) -> Bit`. The relation's - first argument is a pair consisting of `lhs`'s state and output following - execution. The relation's second argument is a pair consisting of `rhs`'s - state and output following execution. `orel` then returns a `Bit` indicating - whether the two arguments satisfy the bisimulation's output relation. -5. `lhs`: A term that simulates `rhs`. `lhs` must have the type - `(lhsState, input) -> (lhsState, output)`. The first argument to `lhs` is a - tuple containing the internal state of `lhs`, as well as the input to `lhs`. - `lhs` returns a tuple containing its internal state after execution, as well - as its output. -6. `rhs`: A term that simulates `lhs`. `rhs` must have the type - `(rhsState, input) -> (rhsState, output)`. The first argument to `rhs` is a - tuple containing the internal state of `rhs`, as well as the input to `rhs`. - `rhs` returns a tuple containing its internal state after execution, as well - as its output. - -On success, `prove_bisim` returns a `BisimTheorem` that can be used in future -bisimulation proofs to enable compositional bisimulation proofs. On failure, -`prove_bisim` will abort. - -## Bisimulation Example - -This section walks through an example proving that the Cryptol implementation -of an AND gate that makes use of internal state and takes two cycles to -complete is equivalent to a pure function that computes the logical AND of its -inputs in one cycle. First, we define the implementation's state type: - -~~~~ -type andState = { loaded : Bit, origX : Bit, origY : Bit } -~~~~ - -`andState` is a record type with three fields: - -1. `loaded`: A `Bit` indicating whether the input to the AND gate has been - loaded into the state record. -2. `origX`: A `Bit` storing the first input to the AND gate. -3. `origY`: A `Bit` storing the second input to the AND gate. - -Now, we define the AND gate's implementation: - -~~~~ -andImp : (andState, (Bit, Bit)) -> (andState, (Bit, Bit)) -andImp (s, (x, y)) = - if s.loaded /\ x == s.origX /\ y == s.origY - then (s, (True, s.origX && s.origY)) - else ({ loaded = True, origX = x, origY = y }, (False, 0)) -~~~~ - -`andImp` takes a tuple as input where the first field is an `andState` holding -the gate's internal state, and second field is a tuple containing the inputs to -the AND gate. `andImp` returns a tuple consisting of the updated `andState` and -the gate's output. The output is a tuple where the first field is a ready bit -that is `1` when the second field is ready to be read, and the second field -is the result of gate's computation. - -`andImp` takes two cycles to complete: - -1. The first cycle loads the inputs into its state's `origX` and `origY` fields - and sets `loaded` to `True`. It sets both of its output bits to `0`. -2. The second cycle uses the stored input values to compute the logical AND. - It sets its ready bit to `1` and its second output to the logical AND - result. - -So long as the inputs remain fixed after the second cycle, `andImp`'s output -remains unchanged. If the inputs change, then `andImp` restarts the -computation (even if the inputs change between the first and second cycles). - -Next, we define the pure function we'd like to prove `andImp` bisimilar to: - -~~~~ -andSpec : ((), (Bit, Bit)) -> ((), (Bit, Bit)) -andSpec (_, (x, y)) = ((), (True, x && y)) -~~~~ - -`andSpec` takes a tuple as input where the first field is `()`, indicating that -`andSpec` is a pure function without internal state, and the second field is a -tuple containing the inputs to the AND function. `andSpec` returns a tuple -consisting of `()` (again, because `andSpec` is stateless) and the function's -output. Like `andImp`, the output is a tuple where the first field is a ready -bit that is `1` when the second field is ready to be read, and the second field -is the result of the function's computation. - -`andSpec` completes in a single cycle, and as such its ready bit is always `1`. -It computes the logical AND directly on the function's inputs using Cryptol's -`(&&)` operator. - -Next, we define a state relation over `andImp` and `andSpec`: - -~~~~ -andStateRel : andState -> () -> Bit -andStateRel _ () = True -~~~~ - -`andStateRel` takes two arguments: - -1. An `andState` for `andImp`. -2. An empty state (`()`) for `andSpec`. - -`andStateRel` returns a `Bit` indicating whether the relation is satisified. In -this case, `andStateRel` always returns `True` because `andSpec` is stateless -and therefore the state relation permits `andImp` to accept any state. - -Lastly, we define a relation over `andImp` and `andSpec`: - -~~~~ -andOutputRel : (andState, (Bit, Bit)) -> ((), (Bit, Bit)) -> Bit -andOutputRel (s, (impReady, impO)) ((), (_, specO)) = - if impReady then impO == specO else True -~~~~ - -`andOutputRel` takes two arguments: - -1. A return value from `andImp`. Specifically, a pair consisting of an - `andState` and a pair containing a ready bit and result of the logical AND. -2. A return value from `andSpec`. Specifically, a pair consisting of an empty - state `()` and a pair containing a ready bit and result of the logical AND. - -`andOutputRel` returns a `Bit` indicating whether the relation is satisfied. It -considers the relation satisfied in two ways: - -1. If `andImp`'s ready bit is set, the relation is satisfied if the output - values `impO` and `specO` from `andImp` and `andSpec` respectively are - equivalent. -2. If `andImp`'s ready bit is not set, the relation is satisfied. - -Put another way, the relation is satisfied if the end result of `andImp` and -`andSpec` are equivalent. The relation permits intermediate outputs to differ. - -We can verify that this relation is always satisfied--and therefore the two -terms are bisimilar--by using `prove_bisim`: - -~~~~ -import "And.cry"; -enable_experimental; - -and_bisim <- prove_bisim z3 [] {{ andStateRel }} {{ andOutputRel }} {{ andImp }} {{ andSpec }}; -~~~~ - -Upon running this script, SAW prints: - -~~~~ -Successfully proved bisimulation between andImp and andSpec -~~~~ - -### Building a NAND gate - -We can make the example more interesting by reusing components to build a NAND -gate. We first define a state type for the NAND gate implementation that -contains `andImp`'s state. This NAND gate will not need any additional state, -so we will define a type `nandState` that is equal to `andState`: - -~~~~ -type nandState = andState -~~~~ - -Now, we define an implementation `nandImp` that calls `andImp` and negates the -result: - -~~~~ -nandImp : (nandState, (Bit, Bit)) -> (nandState, (Bit, Bit)) -nandImp x = (s, (andReady, ~andRes)) - where - (s, (andReady, andRes)) = andImp x -~~~~ - -Note that `nandImp` is careful to preserve the ready status of `andImp`. -Because `nandImp` relies on `andImp`, it also takes two cycles to compute the -logical NAND of its inputs. - -Next, we define a specification `nandSpec` in terms of `andSpec`: - -~~~~ -nandSpec : ((), (Bit, Bit)) -> ((), (Bit, Bit)) -nandSpec (_, (x, y)) = ((), (True, ~ (andSpec ((), (x, y))).1.1)) -~~~~ - -As with `andSpec`, `nandSpec` is pure and computes its result in a single -cycle. - -Next, we define a state relation over `nandImp` and `nandSpec`: - -~~~~ -nandStateRel : andState -> () -> Bit -nandStateRel _ () = True -~~~~ - -As with `andStateRel`, this state relation is always `True` because `nandSpec` -is stateless. - -Lastly, we define an output relation indicating that `nandImp` and `nandSpec` -produce equivalent results once `nandImp`'s ready bit is `1`: - -~~~~ -nandOutputRel : (nandState, (Bit, Bit)) -> ((), (Bit, Bit)) -> Bit -nandOutputRel (s, (impReady, impO)) ((), (_, specO)) = - if impReady then impO == specO else True -~~~~ - -To prove that `nandImp` and `nandSpec` are bisimilar, we again use -`prove_bisim`. This time however, we can reuse the bisimulation proof for the -AND gate by including it in the `theorems` paramter for `prove_bisim`: - -~~~~ -prove_bisim z3 [and_bisim] {{ nandStateRel }} {{ nandOutputRel }} {{ nandImp }} {{ nandSpec }}; -~~~~ - -Upon running this script, SAW prints: - -~~~~ -Successfully proved bisimulation between nandImp and nandSpec -~~~~ - -## Understanding the proof goals - -While not necessary for simple proofs, more advanced proofs may require -inspecting proof goals. `prove_bisim` generates and attempts to solve the -following proof goals: - -~~~~ -OUTPUT RELATION THEOREM: - forall s1 s2 in. - srel s1 s2 -> orel (lhs (s1, in)) (rhs (s2, in)) - -STATE RELATION THEOREM: - forall s1 s2 out1 out2. - orel (s1, out1) (s2, out2) -> srel s1 s2 -~~~~ - -where the variables in the `forall`s are: - -* `s1`: Initial state for `lhs` -* `s2`: Initial state for `rhs` -* `in`: Input value to `lhs` and `rhs` -* `out1`: Initial output value for `lhs` -* `out2`: Initial output value for `rhs` - -The `STATE RELATION THEOREM` verifies that the output relation properly captures -the guarantees of the state relation. The `OUTPUT RELATION THEOREM` verifies -that if `lhs` and `rhs` are executed with related states, then the result of -that execution is also related. These two theorems together guarantee that the -terms simulate each other. - -When using composition, `prove_bisim` also generates and attempts to solve -the proof goal below for any successfully applied `BisimTheorem` in the -`theorems` list: - -~~~~ -COMPOSITION SIDE CONDITION: - forall g_lhs_s g_rhs_s. - g_srel g_lhs_s g_rhs_s -> f_srel f_lhs_s f_rhs_s - where - f_lhs_s = extract_inner_state g_lhs g_lhs_s f_lhs - f_rhs_s = extract_inner_state g_rhs g_rhs_s f_rhs -~~~~ - -where `g_lhs` is an outer term containing a call to an inner term `f_lhs` -represented by a `BisimTheorem` and `g_rhs` is an outer term containing a call -to an inner term `f_rhs` represented by the same `BisimTheorem`. The variables -in `COMPOSITION SIDE CONDITION` are: - -* `extract_inner_state x x_s y`: A helper function that takes an outer term `x`, an - outer state `x_s`, and an inner term `y`, and returns the inner state of `x_s` - that `x` passes to `y`. -* `g_lhs_s`: The state for `g_lhs` -* `g_rhs_s`: The state for `g_rhs` -* `g_srel`: The state relation for `g_lhs` and `g_rhs` -* `f_srel`: The state relation for `f_lhs` and `f_rhs` -* `f_lhs_s`: The state for `f_lhs`, as represented in `g_lhs_s` (extracted using - `extract_inner_state`). -* `f_rhs_s`: The state for `f_rhs`, as represented in `g_rhs_s` (extracted using - `extract_inner_state`). - -The `COMPOSITION SIDE CONDITION` exists to verify that the terms in the -bisimulation relation properly set up valid states for subterms they contain. - -## Limitations - -For now, the `prove_bisim` command has a couple limitations: - -* `lhs` and `rhs` must be named functions. This is because `prove_bisim` uses - these names to perform substitution when making use of compositionality. -* Each subterm present in the list of bisimulation theorems already - proven may be invoked at most once in `lhs` or `rhs`. That is, if some - function `g_lhs` calls `f_lhs`, and `prove_bisim` is invoked with a - `BisimTheorem` proving that `f_lhs` is bisimilar to `f_rhs`, then `g_lhs` may - call `f_lhs` at most once. - -# Formal Deprecation Process - -SAW primitives, and thus their associated SAWScript built-ins, sometimes -become obsolete or are found inadequate and replaced. -The process by which that happens has three steps, as follows: - -1. The decision is made to deprecate and eventually remove the objects -in question. -This can happen at the level of individual built-in elements (for example, -when replacing a function with an awkward interface or unfortunate name) or -at the level of internal units of functionality with possibly multiple -built-ins affected. -At this step the built-ins in question are marked for a deprecation warning. -They remain available by default, but referring to them will trigger a -warning. - -2. The objects in question are made invisible by default. -Now, referring to the affected built-ins will fail unless the -`enable_deprecated` command is used. -In that case referring to them will still produce a warning. - -3. The objects in question are removed entirely and are no longer -available. - -In general any object or group of objects will move only one step per -release; that is, something first marked deprecated (so it warns) in -saw-script 1.2 will not disappear by default before saw-script 1.3 and -not be removed entirely before saw-script 1.4. -The time frame may be longer depending on the needs of downstream -users, the complexity of migration, and the cost/impact of keeping the -deprecated code in the system. - -We may move faster if circumstances dictate, but hope not to need to. - -Objects that have never appeared in a release, or that have never -moved past experimental may be removed without first being deprecated. -However, we aim to avoid this in cases where the objects in question -have gotten substantial use despite their formal status. diff --git a/doc/manual/manual.pdf b/doc/manual/manual.pdf deleted file mode 100644 index 671ec3048745fe40ac70da07aeb9d8d759b3184c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 612835 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

dQ*AOC-)yyCoe>!)>^Mj)e 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
  • 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 )j=&0T>ikA*PQRgiJ;%HdPab12Ifya)}t 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�S$h}qX%!E=*O(+ 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"sB3>Tt4knk5`QzAPf$!<#S{5uU}t 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 Term -> TopLevel Theorem` +takes a proof script (which we'll describe next) and a `Term`. The +`Term` should be of function type with a return value of `Bool` (`Bit` +at the Cryptol level). It will then use the proof script to attempt to +show that the `Term` returns `True` for all possible inputs. If it is +successful, it will print `Valid` and return a `Theorem`. If not, it +will abort. + +* `sat_print : ProofScript () -> Term -> TopLevel ()` is similar +except that it looks for a *single* value for which the `Term` evaluates +to `True` and prints out that value, returning nothing. + +* `prove_core : ProofScript () -> String -> TopLevel Theorem` +proves and returns a `Theorem` from a string in SAWCore syntax. + +## Automated Tactics + +The simplest proof scripts just specify the automated prover to use. +The `ProofScript` values `abc` and `z3` select the ABC and Z3 theorem +provers, respectively, and are typically good choices. + +For example, combining `prove_print` with `abc`: + +~~~~ +sawscript> t <- prove_print abc {{ \(x:[8]) -> x+x == x*2 }} +Valid +sawscript> t +Theorem (let { x@1 = Prelude.Vec 8 Prelude.Bool + x@2 = Cryptol.TCNum 8 + x@3 = Cryptol.PArithSeqBool x@2 + } + in (x : x@1) +-> Prelude.EqTrue + (Cryptol.ecEq x@1 (Cryptol.PCmpSeqBool x@2) + (Cryptol.ecPlus x@1 x@3 x x) + (Cryptol.ecMul x@1 x@3 x + (Cryptol.ecNumber (Cryptol.TCNum 2) x@1 + (Cryptol.PLiteralSeqBool x@2))))) +~~~~ + +Similarly, `sat_print` will show that the function returns `True` for +one specific input (which it should, since we already know it returns +`True` for all inputs): + +~~~~ +sawscript> sat_print abc {{ \(x:[8]) -> x+x == x*2 }} +Sat: [x = 0] +~~~~ + +In addition to these, the `bitwuzla`, `boolector`, `cvc4`, `cvc5`, `mathsat`, +and `yices` provers are available. The internal decision procedure `rme`, short +for Reed-Muller Expansion, is an automated prover that works particularly well +on the Galois field operations that show up, for example, in AES. + +In more complex cases, some pre-processing can be helpful or necessary +before handing the problem off to an automated prover. The +pre-processing can involve rewriting, beta reduction, unfolding, the use +of provers that require slightly more configuration, or the use of +provers that do very little real work. + +## Proof Script Diagnostics + +During development of a proof, it can be useful to print various +information about the current goal. The following tactics are useful in +that context. + +* `print_goal : ProofScript ()` prints the entire goal in SAWCore +syntax. + +* `print_goal_consts : ProofScript ()` prints a list of unfoldable constants +in the current goal. + +* `print_goal_depth : Int -> ProofScript ()` takes an integer argument, `n`, +and prints the goal up to depth `n`. Any elided subterms are printed +with a `...` notation. + +* `print_goal_size : ProofScript ()` prints the number of nodes in the +DAG representation of the goal. + +## Rewriting in Proof Scripts + +One of the key techniques available for completing proofs in SAWScript +is the use of rewriting or transformation. The following commands +support this approach. + +* `simplify : Simpset -> ProofScript ()` works just like `rewrite`, +except that it works in a `ProofScript` context and implicitly +transforms the current (unnamed) goal rather than taking a `Term` as a +parameter. + +* `goal_eval : ProofScript ()` will evaluate the current proof goal to a +first-order combination of primitives. + +* `goal_eval_unint : [String] -> ProofScript ()` works like `goal_eval` +but avoids expanding or simplifying the given names. + +## Other Transformations + +Some useful transformations are not easily specified using equality +statements, and instead have special tactics. + +* `beta_reduce_goal : ProofScript ()` works like `beta_reduce_term` but +on the current goal. It takes any sub-expression of the form `(\x -> t) +v` and replaces it with a transformed version of `t` in which all +instances of `x` are replaced by `v`. + +* `unfolding : [String] -> ProofScript ()` works like `unfold_term` but +on the current goal. + +Using `unfolding` is mostly valuable for proofs +based entirely on rewriting, since the default behavior for automated +provers is to unfold everything before sending a goal to a prover. +However, with some provers it is possible to indicate that specific +named subterms should be represented as uninterpreted functions. + +* `unint_bitwuzla : [String] -> ProofScript ()` + +* `unint_cvc4 : [String] -> ProofScript ()` + +* `unint_cvc5 : [String] -> ProofScript ()` + +* `unint_yices : [String] -> ProofScript ()` + +* `unint_z3 : [String] -> ProofScript ()` + +The list of `String` arguments in these cases indicates the names of the +subterms to leave folded, and therefore present as uninterpreted +functions to the prover. To determine which folded constants appear in a +goal, use the `print_goal_consts` function described above. + +Ultimately, we plan to implement a more generic tactic that leaves +certain constants uninterpreted in whatever prover is ultimately used +(provided that uninterpreted functions are expressible in the prover). + +Note that each of the `unint_*` tactics have variants that are prefixed +with `sbv_` and `w4_`. The `sbv_`-prefixed tactics make use of the SBV +library to represent and solve SMT queries: + +* `sbv_unint_bitwuzla : [String] -> ProofScript ()` + +* `sbv_unint_cvc4 : [String] -> ProofScript ()` + +* `sbv_unint_cvc5 : [String] -> ProofScript ()` + +* `sbv_unint_yices : [String] -> ProofScript ()` + +* `sbv_unint_z3 : [String] -> ProofScript ()` + +The `w4_`-prefixed tactics make use of the What4 library instead of SBV: + +* `w4_unint_bitwuzla : [String] -> ProofScript ()` + +* `w4_unint_cvc4 : [String] -> ProofScript ()` + +* `w4_unint_cvc5 : [String] -> ProofScript ()` + +* `w4_unint_yices : [String] -> ProofScript ()` + +* `w4_unint_z3 : [String] -> ProofScript ()` + +In most specifications, the choice of SBV versus What4 is not important, as +both libraries are broadly compatible in terms of functionality. There are some +situations where one library may outpeform the other, however, due to +differences in how each library represents certain SMT queries. There are also +some experimental features that are only supported with What4 at the moment, +such as `enable_lax_loads_and_stores`. + +## Caching Solver Results + +SAW has the capability to cache the results of tactics which call out to +automated provers. This can save a considerable amount of time in cases such as +proof development and CI, where the same proof scripts are often run repeatedly +without changes. + +This caching is available for all tactics which call out to automated provers +at runtime: `abc`, `boolector`, `cvc4`, `cvc5`, `mathsat`, `yices`, `z3`, +`rme`, and the family of `unint` tactics described in the previous section. + +When solver caching is enabled and one of the tactics mentioned above is +encountered, if there is already an entry in the cache corresponding to the +call then the cached result is used, otherwise the appropriate solver is +queried, and the result saved to the cache. Entries are indexed by a SHA256 +hash of the exact query to the solver (ignoring variable names), any options +passed to the solver, and the names and full version strings of all the solver +backends involved (e.g. ABC and SBV for the `abc` tactic). This ensures cached +results are only used when they would be identical to the result of actually +running the tactic. + +The simplest way to enable solver caching is to set the environment variable +`SAW_SOLVER_CACHE_PATH`. With this environment variable set, `saw` and +`saw-remote-api` will automatically keep an [LMDB](http://www.lmdb.tech/doc/) +database at the given path containing the solver result cache. Setting this +environment variable globally therefore creates a global, concurrency-safe +solver result cache used by all newly created `saw` or `saw-remote-api` +processes. Note that when this environment variable is set, SAW does not create +a cache at the specified path until it is actually needed. + +There are also a number of SAW commands related to solver caching. + +* `set_solver_cache_path` is like setting `SAW_SOLVER_CACHE_PATH` for the + remainder of the current session, but opens an LMDB database at the specified + path immediately. If a cache is already in use in the current session + (i.e. through a prior call to `set_solver_cache_path` or through + `SAW_SOLVER_CACHE_PATH` being set and the cache being used at least once) + then all entries in the cache already in use will be copied to the new cache + being opened. + +* `clean_mismatched_versions_solver_cache` will remove all entries in the + solver result cache which were created using solver backend versions which do + not match the versions in the current environment. This can be run after an + update to clear out any old, unusable entries from the solver cache. This + command can also be run directly from the command line through the + `--clean-mismatched-versions-solver-cache` command-line option. + +* `print_solver_cache` prints to the console all entries in the cache whose + SHA256 hash keys start with the given hex string. Providing an empty string + results in all entries in the cache being printed. + +* `print_solver_cache_stats` prints to the console statistics including the + size of the solver cache, where on disk it is stored, and some counts of how + often it has been used during the current session. + +For performing more complicated database operations on the set of cached +results, the file `solver_cache.py` is provided with the Python bindings of the +SAW Remote API. This file implements a general-purpose Python interface for +interacting with the LMDB databases kept by SAW for solver caching. + +Below is an example of using solver caching with `saw -v Debug`. Only the +relevant output is shown, the rest abbreviated with "...". + +~~~~ +sawscript> set_solver_cache_path "example.cache" +sawscript> prove_print z3 {{ \(x:[8]) -> x+x == x*2 }} +[22:13:00.832] Caching result: d1f5a76e7a0b7c01 (SBV 9.2, Z3 4.8.7 - 64 bit) +... +sawscript> prove_print z3 {{ \(new:[8]) -> new+new == new*2 }} +[22:13:04.122] Using cached result: d1f5a76e7a0b7c01 (SBV 9.2, Z3 4.8.7 - 64 bit) +... +sawscript> prove_print (w4_unint_z3_using "qfnia" []) \ + {{ \(x:[8]) -> x+x == x*2 }} +[22:13:09.484] Caching result: 4ee451f8429c2dfe (What4 v1.3-29-g6c462cd using qfnia, Z3 4.8.7 - 64 bit) +... +sawscript> print_solver_cache "d1f5a76e7a0b7c01" +[22:13:13.250] SHA: d1f5a76e7a0b7c01bdfe7d0e1be82b4f233a805ae85a287d45933ed12a54d3eb +[22:13:13.250] - Result: unsat +[22:13:13.250] - Solver: "SBV->Z3" +[22:13:13.250] - Versions: SBV 9.2, Z3 4.8.7 - 64 bit +[22:13:13.250] - Last used: 2023-07-25 22:13:04.120351 UTC + +sawscript> print_solver_cache "4ee451f8429c2dfe" +[22:13:16.727] SHA: 4ee451f8429c2dfefecb6216162bd33cf053f8e66a3b41833193529449ef5752 +[22:13:16.727] - Result: unsat +[22:13:16.727] - Solver: "W4 ->z3" +[22:13:16.727] - Versions: What4 v1.3-29-g6c462cd using qfnia, Z3 4.8.7 - 64 bit +[22:13:16.727] - Last used: 2023-07-25 22:13:09.484464 UTC + +sawscript> print_solver_cache_stats +[22:13:20.585] == Solver result cache statistics == +[22:13:20.585] - 2 results cached in example.cache +[22:13:20.585] - 2 insertions into the cache so far this run (0 failed attempts) +[22:13:20.585] - 1 usage of cached results so far this run (0 failed attempts) +~~~~ + +## Other External Provers + +In addition to the built-in automated provers already discussed, SAW +supports more generic interfaces to other arbitrary theorem provers +supporting specific interfaces. + +* `external_aig_solver : String -> [String] -> ProofScript ()` +supports theorem provers that can take input as a single-output AIGER +file. The first argument is the name of the executable to run. The +second argument is the list of command-line parameters to pass to that +executable. Any element of this list equal to `"%f"` will be replaced +with the name of the temporary AIGER file generated for the proof goal. +The output from the solver is expected to be in DIMACS solution format. + +* `external_cnf_solver : String -> [String] -> ProofScript ()` +works similarly but for SAT solvers that take input in DIMACS CNF format +and produce output in DIMACS solution format. + +## Offline Provers + +For provers that must be invoked in more complex ways, or to defer proof +until a later time, there are functions to write the current goal to a +file in various formats, and then assume that the goal is valid through +the rest of the script. + +* `offline_aig : String -> ProofScript ()` + +* `offline_cnf : String -> ProofScript ()` + +* `offline_extcore : String -> ProofScript ()` + +* `offline_smtlib2 : String -> ProofScript ()` + +* `offline_unint_smtlib2 : [String] -> String -> ProofScript ()` + +These support the AIGER, DIMACS CNF, shared SAWCore, and SMT-Lib v2 +formats, respectively. The shared representation for SAWCore is +described [in the `saw-script` +repository](https://github.com/GaloisInc/saw-script/blob/master/doc/extcore.md). +The `offline_unint_smtlib2` command represents the folded subterms +listed in its first argument as uninterpreted functions. + +## Finishing Proofs without External Solvers + +Some proofs can be completed using unsound placeholders, or using +techniques that do not require significant computation. + +* `assume_unsat : ProofScript ()` indicates that the current goal +should be assumed to be unsatisfiable. This is an alias for +`assume_valid`. Users should prefer to use `admit` instead. + +* `assume_valid : ProofScript ()` indicates that the current +goal should be assumed to be valid. Users should prefer to +use `admit` instead + +* `admit : String -> ProofScript ()` indicates that the current +goal should be assumed to be valid without proof. The given +string should be used to record why the user has decided to +assume this proof goal. + +* `quickcheck : Int -> ProofScript ()` runs the goal on the given +number of random inputs, and succeeds if the result of evaluation is +always `True`. This is unsound, but can be helpful during proof +development, or as a way to provide some evidence for the validity of a +specification believed to be true but difficult or infeasible to prove. + +* `trivial : ProofScript ()` states that the current goal should +be trivially true. This tactic recognizes instances of equality +that can be demonstrated by conversion alone. In particular +it is able to prove `EqTrue x` goals where `x` reduces to +the constant value `True`. It fails if this is not the case. + +## Multiple Goals + +The proof scripts shown so far all have a single implicit goal. As in +many other interactive provers, however, SAWScript proofs can have +multiple goals. The following commands can introduce or work with +multiple goals. These are experimental and can be used only after +`enable_experimental` has been called. + +* `goal_apply : Theorem -> ProofScript ()` will apply a given +introduction rule to the current goal. This will result in zero or more +new subgoals. + +* `goal_assume : ProofScript Theorem` will convert the first hypothesis +in the current proof goal into a local `Theorem` + +* `goal_insert : Theorem -> ProofScript ()` will insert a given +`Theorem` as a new hypothesis in the current proof goal. + +* `goal_intro : String -> ProofScript Term` will introduce a quantified +variable in the current proof goal, returning the variable as a `Term`. + +* `goal_when : String -> ProofScript () -> ProofScript ()` will run the +given proof script only when the goal name contains the given string. + +* `goal_exact : Term -> ProofScript ()` will attempt to use the given +term as an exact proof for the current goal. This tactic will succeed +whever the type of the given term exactly matches the current goal, +and will fail otherwise. + +* `split_goal : ProofScript ()` will split a goal of the form +`Prelude.and prop1 prop2` into two separate goals `prop1` and `prop2`. + +## Proof Failure and Satisfying Assignments + +The `prove_print` and `sat_print` commands print out their essential +results (potentially returning a `Theorem` in the case of +`prove_print`). In some cases, though, one may want to act +programmatically on the result of a proof rather than displaying it. + +The `prove` and `sat` commands allow this sort of programmatic analysis +of proof results. To allow this, they use two types we haven't mentioned +yet: `ProofResult` and `SatResult`. These are different from the other +types in SAWScript because they encode the possibility of two outcomes. +In the case of `ProofResult`, a statement may be valid or there may be a +counter-example. In the case of `SatResult`, there may be a satisfying +assignment or the statement may be unsatisfiable. + +* `prove : ProofScript SatResult -> Term -> TopLevel ProofResult` + +* `sat : ProofScript SatResult -> Term -> TopLevel SatResult` + +To operate on these new types, SAWScript includes a pair of functions: + +* `caseProofResult : {b} ProofResult -> b -> (Term -> b) -> b` takes a +`ProofResult`, a value to return in the case that the statement is +valid, and a function to run on the counter-example, if there is one. + +* `caseSatResult : {b} SatResult -> b -> (Term -> b) -> b` has the same +shape: it returns its first argument if the result represents an +unsatisfiable statement, or its second argument applied to a satisfying +assignment if it finds one. + +## AIG Values and Proofs + +Most SAWScript programs operate on `Term` values, and in most cases this +is the appropriate representation. It is possible, however, to represent +the same function that a `Term` may represent using a different data +structure: an And-Inverter-Graph (AIG). An AIG is a representation of a +Boolean function as a circuit composed entirely of AND gates and +inverters. Hardware synthesis and verification tools, including the ABC +tool that SAW has built in, can do efficient verification and +particularly equivalence checking on AIGs. + +To take advantage of this capability, a handful of built-in commands can +operate on AIGs. + +* `bitblast : Term -> TopLevel AIG` represents a `Term` as an `AIG` by +"blasting" all of its primitive operations (things like bit-vector +addition) down to the level of individual bits. + +* `load_aig : String -> TopLevel AIG` loads an `AIG` from an external +AIGER file. + +* `save_aig : String -> AIG -> TopLevel ()` saves an `AIG` to an +external AIGER file. + +* `save_aig_as_cnf : String -> AIG -> TopLevel ()` writes an `AIG` out +in CNF format for input into a standard SAT solver. diff --git a/doc/manual/specification-based-verification.md b/doc/manual/specification-based-verification.md new file mode 100644 index 0000000000..dc7f09da38 --- /dev/null +++ b/doc/manual/specification-based-verification.md @@ -0,0 +1,2125 @@ +# Specification-Based Verification + +The built-in functions described so far work by extracting models of +code that can then be used for a variety of purposes, including proofs +about the properties of the code. + +When the goal is to prove equivalence between some LLVM, Java, or MIR code and +a specification, however, a more declarative approach is sometimes +convenient. The following sections describe an approach that combines +model extraction and verification with respect to a specification. A +verified specification can then be used as input to future +verifications, allowing the proof process to be decomposed. + +## Running a Verification + +Verification of LLVM is controlled by the `llvm_verify` command. + +~~~~ +llvm_verify : + LLVMModule -> + String -> + [CrucibleMethodSpec] -> + Bool -> + LLVMSetup () -> + ProofScript SatResult -> + TopLevel CrucibleMethodSpec +~~~~ + +The first two arguments specify the module and function name to verify, +as with `llvm_verify`. The third argument specifies the list of +already-verified specifications to use for compositional verification +(described later; use `[]` for now). The fourth argument specifies +whether to do path satisfiability checking, and the fifth gives the +specification of the function to be verified. Finally, the last argument +gives the proof script to use for verification. The result is a proved +specification that can be used to simplify verification of functions +that call this one. + +Similar commands are available for JVM programs: + +~~~~ +jvm_verify : + JavaClass -> + String -> + [JVMMethodSpec] -> + Bool -> + JVMSetup () -> + ProofScript SatResult -> + TopLevel JVMMethodSpec +~~~~ + +And for MIR programs: + +~~~~ +mir_verify : + MIRModule -> + String -> + [MIRSpec] -> + Bool -> + MIRSetup () -> + ProofScript () -> + TopLevel MIRSpec +~~~~ + +### Running a MIR-based verification + +(Note: API functions involving MIR verification require `enable_experimental` +in order to be used. As such, some parts of this API may change before being +finalized.) + +The `String` supplied as an argument to `mir_verify` is expected to be a +function _identifier_. An identifier is expected adhere to one of the following +conventions: + +* `/::` +* `::` + +Where: + +* `` is the name of the crate in which the function is defined. (If + you produced your MIR JSON file by compiling a single `.rs` file with + `saw-rustc`, then the crate name is the same as the name of the file, but + without the `.rs` file extension.) +* `` is a hash of the crate and its dependencies. In extreme + cases, it is possible for two different crates to have identical crate names, + in which case the disambiguator must be used to distinguish between the two + crates. In the common case, however, most crate names will correspond to + exactly one disambiguator, and you are allowed to leave out the + `/` part of the `String` in this case. If you supply an + identifier with an ambiguous crate name and omit the disambiguator, then SAW + will raise an error. +* `` is the path to the function within the crate. Sometimes, + this is as simple as the function name itself. In other cases, a function + path may involve multiple _segments_, depending on the module hierarchy for + the program being verified. For instance, a `read` function located in + `core/src/ptr/mod.rs` will have the identifier: + + ``` + core::ptr::read + ``` + + Where `core` is the crate name and `ptr::read` is the function path, which + has two segments `ptr` and `read`. There are also some special forms of + segments that appear for functions defined in certain language constructs. + For instance, if a function is defined in an `impl` block, then it will have + `{impl}` as one of its segments, e.g., + + ``` + core::ptr::const_ptr::{impl}::offset + ``` + + If you are in doubt about what the full identifier for a given function is, + consult the MIR JSON file for your program. + +----- + +Now we describe how to construct a value of type `LLVMSetup ()`, `JVMSetup ()`, +or `MIRSetup ()`. + +## Structure of a Specification + +A specifications for Crucible consists of three logical components: + +* A specification of the initial state before execution of the function. + +* A description of how to call the function within that state. + +* A specification of the expected final value of the program state. + +These three portions of the specification are written in sequence within a `do` +block of type `{LLVM,JVM,MIR}Setup`. The command `{llvm,jvm,mir}_execute_func` +separates the specification of the initial state from the specification of the +final state, and specifies the arguments to the function in terms of the +initial state. Most of the commands available for state description will work +either before or after `{llvm,jvm,mir}_execute_func`, though with slightly +different meaning, as described below. + +## Creating Fresh Variables + +In any case where you want to prove a property of a function for an entire +class of inputs (perhaps all inputs) rather than concrete values, the initial +values of at least some elements of the program state must contain fresh +variables. These are created in a specification with the +`{llvm,jvm,mir}_fresh_var` commands rather than `fresh_symbolic`. + +* `llvm_fresh_var : String -> LLVMType -> LLVMSetup Term` + +* `jvm_fresh_var : String -> JavaType -> JVMSetup Term` + +* `mir_fresh_var : String -> MIRType -> MIRSetup Term` + +The first parameter to both functions is a name, used only for +presentation. It's possible (though not recommended) to create multiple +variables with the same name, but SAW will distinguish between them +internally. The second parameter is the LLVM, Java, or MIR type of the +variable. The resulting `Term` can be used in various subsequent +commands. + +Note that the second parameter to `{llvm,jvm,mir}_fresh_var` must be a type +that has a counterpart in Cryptol. (For more information on this, refer to the +"Cryptol type correspondence" section.) If the type does not have a Cryptol +counterpart, the function will raise an error. If you do need to create a fresh +value of a type that cannot be represented in Cryptol, consider using a +function such as `llvm_fresh_expanded_val` (for LLVM verification) or +`mir_fresh_expanded_value` (for MIR verification). + +LLVM types are built with this set of functions: + +* `llvm_int : Int -> LLVMType` +* `llvm_alias : String -> LLVMType` +* `llvm_array : Int -> LLVMType -> LLVMType` +* `llvm_float : LLVMType` +* `llvm_double : LLVMType` +* `llvm_packed_struct : [LLVMType] -> LLVMType` +* `llvm_struct_type : [LLVMType] -> LLVMType` + +Java types are built up using the following functions: + +* `java_bool : JavaType` +* `java_byte : JavaType` +* `java_char : JavaType` +* `java_short : JavaType` +* `java_int : JavaType` +* `java_long : JavaType` +* `java_float : JavaType` +* `java_double : JavaType` +* `java_class : String -> JavaType` +* `java_array : Int -> JavaType -> JavaType` + +MIR types are built up using the following functions: + +* `mir_adt : MIRAdt -> MIRType` +* `mir_array : Int -> MIRType -> MIRType` +* `mir_bool : MIRType` +* `mir_char : MIRType` +* `mir_i8 : MIRType` +* `mir_i6 : MIRType` +* `mir_i32 : MIRType` +* `mir_i64 : MIRType` +* `mir_i128 : MIRType` +* `mir_isize : MIRType` +* `mir_f32 : MIRType` +* `mir_f64 : MIRType` +* `mir_lifetime : MIRType` +* `mir_ref : MIRType -> MIRType` +* `mir_ref_mut : MIRType -> MIRType` +* `mir_slice : MIRType -> MIRType` +* `mir_str : MIRType` +* `mir_tuple : [MIRType] -> MIRType` +* `mir_u8 : MIRType` +* `mir_u6 : MIRType` +* `mir_u32 : MIRType` +* `mir_u64 : MIRType` +* `mir_u128 : MIRType` +* `mir_usize : MIRType` + +Most of these types are straightforward mappings to the standard LLVM +and Java types. The one key difference is that arrays must have a fixed, +concrete size. Therefore, all analysis results are valid only under the +assumption that any arrays have the specific size indicated, and may not +hold for other sizes. + +The `llvm_int` function takes an `Int` parameter indicating the variable's bit +width. For example, the C `uint16_t` and `int16_t` types correspond to +`llvm_int 16`. The C `bool` type is slightly trickier. A bare `bool` type +typically corresponds to `llvm_int 1`, but if a `bool` is a member of a +composite type such as a pointer, array, or struct, then it corresponds to +`llvm_int 8`. This is due to a peculiarity in the way Clang compiles `bool` +down to LLVM. When in doubt about how a `bool` is represented, check the LLVM +bitcode by compiling your code with `clang -S -emit-llvm`. + +LLVM types can also be specified in LLVM syntax directly by using the +`llvm_type` function. + +* `llvm_type : String -> LLVMType` + +For example, `llvm_type "i32"` yields the same result as `llvm_int 32`. + +The most common use for creating fresh variables is to state that a +particular function should have the specified behaviour for arbitrary +initial values of the variables in question. Sometimes, however, it can +be useful to specify that a function returns (or stores, more about this +later) an arbitrary value, without specifying what that value should be. +To express such a pattern, you can also run `llvm_fresh_var` from +the post state (i.e., after `llvm_execute_func`). + +## The SetupValue and JVMValue Types + +Many specifications require reasoning about both pure values and about +the configuration of the heap. The `SetupValue` type corresponds to +values that can occur during symbolic execution, which includes both +`Term` values, pointers, and composite types consisting of either of +these (both structures and arrays). + +The `llvm_term`, `jvm_term`, and `mir_term` functions create a `SetupValue`, +`JVMValue`, or `MIRValue`, respectively, from a `Term`: + +* `llvm_term : Term -> SetupValue` +* `jvm_term : Term -> JVMValue` +* `mir_term : Term -> MIRValue` + +The value that these functions return will have an LLVM, JVM, or MIR type +corresponding to the Cryptol type of the `Term` argument. (For more information +on this, refer to the "Cryptol type correspondence" section.) If the type does +not have a Cryptol counterpart, the function will raise an error. + +### Cryptol type correspondence + +The `{llvm,jvm,mir}_fresh_var` functions take an LLVM, JVM, or MIR type as an +argument and produces a `Term` variable of the corresponding Cryptol type as +output. Similarly, the `{llvm,jvm,mir}_term` functions take a Cryptol `Term` as +input and produce a value of the corresponding LLVM, JVM, or MIR type as +output. This section describes precisely which types can be converted to +Cryptol types (and vice versa) in this way. + +#### LLVM verification + +The following LLVM types correspond to Cryptol types: + +* `llvm_alias `: Corresponds to the same Cryptol type as the type used + in the definition of ``. +* `llvm_array `: Corresponds to the Cryptol sequence `[][]`, + where `` is the Cryptol type corresponding to ``. +* `llvm_int `: Corresponds to the Cryptol word `[]`. +* `llvm_struct_type [, ..., ]` and `llvm_packed_struct [, ..., ]`: + Corresponds to the Cryptol tuple `(, ..., )`, where `` + is the Cryptol type corresponding to `` for each `i` ranging from `1` + to `n`. + +The following LLVM types do _not_ correspond to Cryptol types: + +* `llvm_double` +* `llvm_float` +* `llvm_pointer` + +#### JVM verification + +The following Java types correspond to Cryptol types: + +* `java_array `: Corresponds to the Cryptol sequence `[][]`, + where `` is the Cryptol type corresponding to ``. +* `java_bool`: Corresponds to the Cryptol `Bit` type. +* `java_byte`: Corresponds to the Cryptol `[8]` type. +* `java_char`: Corresponds to the Cryptol `[16]` type. +* `java_int`: Corresponds to the Cryptol `[32]` type. +* `java_long`: Corresponds to the Cryptol `[64]` type. +* `java_short`: Corresponds to the Cryptol `[16]` type. + +The following Java types do _not_ correspond to Cryptol types: + +* `java_class` +* `java_double` +* `java_float` + +#### MIR verification + +The following MIR types correspond to Cryptol types: + +* `mir_array `: Corresponds to the Cryptol sequence `[][]`, + where `` is the Cryptol type corresponding to ``. +* `mir_bool`: Corresponds to the Cryptol `Bit` type. +* `mir_char`: Corresponds to the Cryptol `[32]` type. +* `mir_i8` and `mir_u8`: Corresponds to the Cryptol `[8]` type. +* `mir_i16` and `mir_u16`: Corresponds to the Cryptol `[16]` type. +* `mir_i32` and `mir_u32`: Corresponds to the Cryptol `[32]` type. +* `mir_i64` and `mir_u64`: Corresponds to the Cryptol `[64]` type. +* `mir_i128` and `mir_u128`: Corresponds to the Cryptol `[128]` type. +* `mir_isize` and `mir_usize`: Corresponds to the Cryptol `[32]` type. +* `mir_tuple [, ..., ]`: Corresponds to the Cryptol tuple + `(, ..., )`, where `` is the Cryptol type corresponding + to `` for each `i` ranging from `1` to `n`. + +The following MIR types do _not_ correspond to Cryptol types: + +* `mir_adt` +* `mir_f32` +* `mir_f64` +* `mir_ref` and `mir_ref_mut` +* `mir_slice` +* `mir_str` + +## Executing + +Once the initial state has been configured, the `{llvm,jvm,mir}_execute_func` +command specifies the parameters of the function being analyzed in terms +of the state elements already configured. + +* `llvm_execute_func : [SetupValue] -> LLVMSetup ()` +* `jvm_execute_func : [JVMValue] -> JVMSetup ()` +* `mir_execute_func : [MIRValue] -> MIRSetup ()` + +## Return Values + +To specify the value that should be returned by the function being +verified use the `{llvm,jvm,mir}_return` command. + +* `llvm_return : SetupValue -> LLVMSetup ()` +* `jvm_return : JVMValue -> JVMSetup ()` +* `mir_return : MIRValue -> MIRSetup ()` + +## A First Simple Example + +The commands introuduced so far are sufficient to verify simple programs +that do not use pointers (or that use them only internally). Consider, +for instance the C program that adds its two arguments together: + +~~~~ +#include +uint32_t add(uint32_t x, uint32_t y) { + return x + y; +} +~~~~ + +We can specify this function's expected behavior as follows: + +~~~~ +let add_setup = do { + x <- llvm_fresh_var "x" (llvm_int 32); + y <- llvm_fresh_var "y" (llvm_int 32); + llvm_execute_func [llvm_term x, llvm_term y]; + llvm_return (llvm_term {{ x + y : [32] }}); +}; +~~~~ + +We can then compile the C file `add.c` into the bitcode file `add.bc` +and verify it with ABC: + +~~~~ +m <- llvm_load_module "add.bc"; +add_ms <- llvm_verify m "add" [] false add_setup abc; +~~~~ + +## Compositional Verification + +The primary advantage of the specification-based approach to +verification is that it allows for compositional reasoning. That is, +when proving properties of a given method or function, we can make use +of properties we have already proved about its callees rather than +analyzing them anew. This enables us to reason about much larger +and more complex systems than otherwise possible. + +The `llvm_verify`, `jvm_verify`, and `mir_verify` functions return values of +type `CrucibleMethodSpec`, `JVMMethodSpec`, and `MIRMethodSpec`, respectively. +These values are opaque objects that internally contain both the information +provided in the associated `LLVMSetup`, `JVMSetup`, or `MIRSetup` blocks, +respectively, and the results of the verification process. + +Any of these `MethodSpec` objects can be passed in via the third +argument of the `..._verify` functions. For any function or method +specified by one of these parameters, the simulator will not follow +calls to the associated target. Instead, it will perform the following +steps: + +* Check that all `llvm_points_to` and `llvm_precond` statements + (or the corresponding JVM or MIR statements) in the specification are + satisfied. + +* Update the simulator state and optionally construct a return value as + described in the specification. + +More concretely, building on the previous example, say we have a +doubling function written in terms of `add`: + +~~~~ +uint32_t dbl(uint32_t x) { + return add(x, x); +} +~~~~ + +It has a similar specification to `add`: + +~~~~ +let dbl_setup = do { + x <- llvm_fresh_var "x" (llvm_int 32); + llvm_execute_func [llvm_term x]; + llvm_return (llvm_term {{ x + x : [32] }}); +}; +~~~~ + +And we can verify it using what we've already proved about `add`: + +~~~~ +llvm_verify m "dbl" [add_ms] false dbl_setup abc; +~~~~ + +In this case, doing the verification compositionally doesn't save +computational effort, since the functions are so simple, but it +illustrates the approach. + +### Compositional Verification and Mutable Allocations + +A common pitfall when using compositional verification is to reuse a +specification that underspecifies the value of a mutable allocation. In +general, doing so can lead to unsound verification, so SAW goes through great +lengths to check for this. + +Here is an example of this pitfall in an LLVM verification. Given this C code: + +~~~ c +void side_effect(uint32_t *a) { + *a = 0; +} + +uint32_t foo(uint32_t x) { + uint32_t b = x; + side_effect(&b); + return b; +} +~~~ + +And the following SAW specifications: + +~~~ +let side_effect_spec = do { + a_ptr <- llvm_alloc (llvm_int 32); + a_val <- llvm_fresh_var "a_val" (llvm_int 32); + llvm_points_to a_ptr (llvm_term a_val); + + llvm_execute_func [a_ptr]; +}; + +let foo_spec = do { + x <- llvm_fresh_var "x" (llvm_int 32); + + llvm_execute_func [llvm_term x]; + + llvm_return (llvm_term x); +}; +~~~ + +Should SAW be able to verify the `foo` function against `foo_spec` using +compositional verification? That is, should the following be expected to work? + +~~~ +side_effect_ov <- llvm_verify m "side_effect" [] false side_effect_spec z3; +llvm_verify m "foo" [side_effect_ov] false foo_spec z3; +~~~ + +A literal reading of `side_effect_spec` would suggest that the `side_effect` +function allocates `a_ptr` but then does nothing with it, implying that `foo` +returns its argument unchanged. This is incorrect, however, as the +`side_effect` function actually changes its argument to point to `0`, so the +`foo` function ought to return `0` as a result. SAW should not verify `foo` +against `foo_spec`, and indeed it does not. + +The problem is that `side_effect_spec` underspecifies the value of `a_ptr` in +its postconditions, which can lead to the potential unsoundness seen above when +`side_effect_spec` is used in compositional verification. To prevent this +source of unsoundness, SAW will _invalidate_ the underlying memory of any +mutable pointers (i.e., those declared with `llvm_alloc`, not +`llvm_alloc_global`) allocated in the preconditions of compositional override +that do not have a corresponding `llvm_points_to` statement in the +postconditions. Attempting to read from invalidated memory constitutes an +error, as can be seen in this portion of the error message when attempting to +verify `foo` against `foo_spec`: + +~~~ +invalidate (state of memory allocated in precondition (at side.saw:3:12) not described in postcondition) +~~~ + +To fix this particular issue, add an `llvm_points_to` statement to +`side_effect_spec`: + +~~~ +let side_effect_spec = do { + a_ptr <- llvm_alloc (llvm_int 32); + a_val <- llvm_fresh_var "a_val" (llvm_int 32); + llvm_points_to a_ptr (llvm_term a_val); + + llvm_execute_func [a_ptr]; + + // This is new + llvm_points_to a_ptr (llvm_term {{ 0 : [32] }}); +}; +~~~ + +After making this change, SAW will reject `foo_spec` for a different reason, as +it claims that `foo` returns its argument unchanged when it actually returns +`0`. + +Note that invalidating memory itself does not constitute an error, so if the +`foo` function never read the value of `b` after calling `side_effect(&b)`, +then there would be no issue. It is only when a function attempts to _read_ +from invalidated memory that an error is thrown. In general, it can be +difficult to predict when a function will or will not read from invalidated +memory, however. For this reason, it is recommended to always specify the +values of mutable allocations in the postconditions of your specs, as it can +avoid pitfalls like the one above. + +The same pitfalls apply to compositional MIR verification, with a couple of key +differences. In MIR verification, mutable references are allocated using +`mir_alloc_mut`. Here is a Rust version of the pitfall program above: + +~~~ rust +pub fn side_effect(a: &mut u32) { + *a = 0; +} + +pub fn foo(x: u32) -> u32 { + let mut b: u32 = x; + side_effect(&mut b); + b +} +~~~ + +~~~ +let side_effect_spec = do { + a_ref <- mir_alloc_mut mir_u32; + a_val <- mir_fresh_var "a_val" mir_u32; + mir_points_to a_ref (mir_term a_val); + + mir_execute_func [a_ref]; +}; + +let foo_spec = do { + x <- mir_fresh_var "x" mir_u32; + + mir_execute_func [mir_term x]; + + mir_return (mir_term {{ x }}); +}; +~~~ + +Just like above, if you attempted to prove `foo` against `foo_spec` using +compositional verification: + +~~~ +side_effect_ov <- mir_verify m "test::side_effect" [] false side_effect_spec z3; +mir_verify m "test::foo" [side_effect_ov] false foo_spec z3; +~~~ + +Then SAW would throw an error, as `side_effect_spec` underspecifies the value +of `a_ref` in its postconditions. `side_effect_spec` can similarly be repaired +by adding a `mir_points_to` statement involving `a_ref` in `side_effect_spec`'s +postconditions. + +MIR verification differs slightly from LLVM verification in how it catches +underspecified mutable allocations when using compositional overrides. The LLVM +memory model achieves this by invalidating the underlying memory in +underspecified allocations. The MIR memory model, on the other hand, does not +have a direct counterpart to memory invalidation. As a result, any MIR overrides +must specify the values of all mutable allocations in their postconditions, +_even if the function that calls the override never uses the allocations_. + +To illustrate this point more finely, suppose that the `foo` function had +instead been defined like this: + +~~~ rust +pub fn foo(x: u32) -> u32 { + let mut b: u32 = x; + side_effect(&mut b); + 42 +} +~~~ + +Here, it does not particularly matter what effects the `side_effect` function +has on its argument, as `foo` will now return `42` regardless. Still, if you +attempt to prove `foo` by using `side_effect` as a compositional override, then +it is strictly required that you specify the value of `side_effect`'s argument +in its postconditions, even though the answer that `foo` returns is unaffected +by this. This is in contrast with LLVM verification, where one could get away +without specifying `side_effect`'s argument in this example, as the invalidated +memory in `b` would never be read. + +### Compositional Verification and Mutable Global Variables + +Just like with local mutable allocations (see the previous section), +specifications used in compositional overrides must specify the values of +mutable global variables in their postconditions. To illustrate this using LLVM +verification, here is a variant of the C program from the previous example that +uses a mutable global variable `a`: + +~~~ c + +uint32_t a = 42; + +void side_effect(void) { + a = 0; +} + +uint32_t foo(void) { + side_effect(); + return a; +} +~~~ + +If we attempted to verify `foo` against this `foo_spec` specification using +compositional verification: + +~~~ +let side_effect_spec = do { + llvm_alloc_global "a"; + llvm_points_to (llvm_global "a") (llvm_global_initializer "a"); + + llvm_execute_func []; +}; + +let foo_spec = do { + llvm_alloc_global "a"; + llvm_points_to (llvm_global "a") (llvm_global_initializer "a"); + + llvm_execute_func []; + + llvm_return (llvm_global_initializer "a"); +}; + +side_effect_ov <- llvm_verify m "side_effect" [] false side_effect_spec z3; +llvm_verify m "foo" [side_effect_ov] false foo_spec z3; +~~~ + +Then SAW would reject it, as `side_effect_spec` does not specify what `a`'s +value should be in its postconditions. Just as with local mutable allocations, +SAW will invalidate the underlying memory in `a`, and subsequently reading from +`a` in the `foo` function will throw an error. The solution is to add an +`llvm_points_to` statement in the postconditions that declares that `a`'s value +is set to `0`. + +The same concerns apply to MIR verification, where mutable global variables are +referred to as `static mut` items. (See the [MIR static +items](#mir-static-items) section for more information). Here is a Rust version +of the program above: + +~~~ rust +static mut A: u32 = 42; + +pub fn side_effect() { + unsafe { + A = 0; + } +} + +pub fn foo() -> u32 { + side_effect(); + unsafe { A } +} +~~~ + +~~~ +let side_effect_spec = do { + mir_points_to (mir_static "test::A") (mir_static_initializer "test::A"); + + mir_execute_func []; +}; + +let foo_spec = do { + mir_points_to (mir_static "test::A") (mir_static_initializer "test::A"); + + mir_execute_func []; + + mir_return (mir_static_initializer "test::A"); +}; + +side_effect_ov <- mir_verify m "side_effect" [] false side_effect_spec z3; +mir_verify m "foo" [side_effect_ov] false foo_spec z3; +~~~ + +Just as above, we can repair this by adding a `mir_points_to` statement in +`side_effect_spec`'s postconditions that specifies that `A` is set to `0`. + +Recall from the previous section that MIR verification is stricter than LLVM +verification when it comes to specifying mutable allocations in the +postconditions of compositional overrides. This is especially true for mutable +static items. In MIR verification, any compositional overrides must specify the +values of all mutable static items in the entire program in their +postconditions, _even if the function that calls the override never uses the +static items_. For example, if the `foo` function were instead defined like +this: + +~~~ rust +pub fn foo() -> u32 { + side_effect(); + 42 +} +~~~ + +Then it is still required for `side_effect_spec` to specify what `A`'s value +will be in its postconditions, despite the fact that this has no effect on the +value that `foo` will return. + +## Specifying Heap Layout + +Most functions that operate on pointers expect that certain pointers +point to allocated memory before they are called. The `llvm_alloc` +command allows you to specify that a function expects a particular +pointer to refer to an allocated region appropriate for a specific type. + +* `llvm_alloc : LLVMType -> LLVMSetup SetupValue` + +This command returns a `SetupValue` consisting of a pointer to the +allocated space, which can be used wherever a pointer-valued +`SetupValue` can be used. + +In the initial state, `llvm_alloc` specifies that the function +expects a pointer to allocated space to exist. In the final state, it +specifies that the function itself performs an allocation. + +When using the experimental Java implementation, separate functions +exist for specifying that arrays or objects are allocated: + +* `jvm_alloc_array : Int -> JavaType -> JVMSetup JVMValue` specifies an +array of the given concrete size, with elements of the given type. + +* `jvm_alloc_object : String -> JVMSetup JVMValue` specifies an object +of the given class name. + +The experimental MIR implementation also has a `mir_alloc` function, which +behaves similarly to `llvm_alloc`. `mir_alloc` creates an immutable reference, +but there is also a `mir_alloc_mut` function for creating a mutable reference: + +* `mir_alloc : MIRType -> MIRSetup MIRValue` + +* `mir_alloc_mut : MIRType -> MIRSetup MIRValue` + +MIR tracks whether references are mutable or immutable at the type level, so it +is important to use the right allocation command for a given reference type. + +In LLVM, it's also possible to construct fresh pointers that do not +point to allocated memory (which can be useful for functions that +manipulate pointers but not the values they point to): + +* `llvm_fresh_pointer : LLVMType -> LLVMSetup SetupValue` + +The NULL pointer is called `llvm_null` in LLVM and `jvm_null` in +JVM: + +* `llvm_null : SetupValue` +* `jvm_null : JVMValue` + +One final, slightly more obscure command is the following: + +* `llvm_alloc_readonly : LLVMType -> LLVMSetup SetupValue` + +This works like `llvm_alloc` except that writes to the space +allocated are forbidden. This can be useful for specifying that a +function should take as an argument a pointer to allocated space that it +will not modify. Unlike `llvm_alloc`, regions allocated with +`llvm_alloc_readonly` are allowed to alias other read-only regions. + +## Specifying Heap Values + +Pointers returned by `llvm_alloc`, `jvm_alloc_{array,object}`, or +`mir_alloc{,_mut}` don't initially point to anything. So if you pass such a +pointer directly into a function that tried to dereference it, symbolic +execution will fail with a message about an invalid load. For some functions, +such as those that are intended to initialize data structures (writing to the +memory pointed to, but never reading from it), this sort of uninitialized +memory is appropriate. In most cases, however, it's more useful to state that a +pointer points to some specific (usually symbolic) value, which you can do with +the *points-to* family of commands. + +### LLVM heap values + +LLVM verification primarily uses the `llvm_points_to` command: + +* `llvm_points_to : SetupValue -> SetupValue -> LLVMSetup ()` +takes two `SetupValue` arguments, the first of which must be a pointer, +and states that the memory specified by that pointer should contain the +value given in the second argument (which may be any type of +`SetupValue`). + +When used in the final state, `llvm_points_to` specifies that the +given pointer *should* point to the given value when the function +finishes. + +Occasionally, because C programs frequently reinterpret memory of one +type as another through casts, it can be useful to specify that a +pointer points to a value that does not agree with its static type. + +* `llvm_points_to_untyped : SetupValue -> SetupValue -> +LLVMSetup ()` works like `llvm_points_to` but omits type +checking. Rather than omitting type checking across the board, we +introduced this additional function to make it clear when a type +reinterpretation is intentional. As an alternative, one +may instead use `llvm_cast_pointer` to line up the static types. + +### JVM heap values + +JVM verification has two categories of commands for specifying heap values. +One category consists of the `jvm_*_is` commands, which allow users to directly +specify what value a heap object points to. There are specific commands for +each type of JVM heap object: + +* `jvm_array_is : JVMValue -> Term -> JVMSetup ()` declares that an array (the + first argument) contains a sequence of values (the second argument). +* `jvm_elem_is : JVMValue -> Int -> JVMValue -> JVMSetup ()` declares that an + array (the first argument) has an element at the given index (the second + argument) containing the given value (the third argument). +* `jvm_field_is : JVMValue -> String -> JVMValue -> JVMSetup ()` declares that + an object (the first argument) has a field (the second argument) containing + the given value (the third argument). +* `jvm_static_field_is : String -> JVMValue -> JVMSetup ()` declares that a + named static field (the first argument) contains the given value (the second + argument). By default, the field name is assumed to belong to the same class + as the method being specified. Static fields belonging to other classes can + be selected using the `.` syntax in the first argument. + +Another category consists of the `jvm_modifies_*` commands. Like the `jvm_*_is` +commands, these specify that a JVM heap object points to valid memory, but +unlike the `jvm_*_is` commands, they leave the exact value being pointed to as +unspecified. These are useful for writing partial specifications for methods +that modify some heap value, but without saying anything specific about the new +value. + +* `jvm_modifies_array : JVMValue -> JVMSetup ()` +* `jvm_modifies_elem : JVMValue -> Int -> JVMSetup ()` +* `jvm_modifies_field : JVMValue -> String -> JVMSetup ()` +* `jvm_modifies_static_field : String -> JVMSetup ()` + +### MIR heap values + +MIR verification has a single `mir_points_to` command: + +* `mir_points_to : MIRValue -> MIRValue -> MIRSetup ()` +takes two `SetupValue` arguments, the first of which must be a reference, +and states that the memory specified by that reference should contain the +value given in the second argument (which may be any type of +`SetupValue`). + +## Working with Compound Types + +The commands mentioned so far give us no way to specify the values of +compound types (arrays or `struct`s). Compound values can be dealt with +either piecewise or in their entirety. + +* `llvm_elem : SetupValue -> Int -> SetupValue` yields a pointer to +an internal element of a compound value. For arrays, the `Int` parameter +is the array index. For `struct` values, it is the field index. + +* `llvm_field : SetupValue -> String -> SetupValue` yields a pointer +to a particular named `struct` field, if debugging information is +available in the bitcode. + +Either of these functions can be used with `llvm_points_to` to +specify the value of a particular array element or `struct` field. +Sometimes, however, it is more convenient to specify all array elements +or field values at once. The `llvm_array_value` and `llvm_struct_value` +functions construct compound values from lists of element values. + +* `llvm_array_value : [SetupValue] -> SetupValue` +* `llvm_struct_value : [SetupValue] -> SetupValue` + +To specify an array or struct in which each element or field is +symbolic, it would be possible, but tedious, to use a large combination +of `llvm_fresh_var` and `llvm_elem` or `llvm_field` commands. +However, the following function can simplify the common case +where you want every element or field to have a fresh value. + +* `llvm_fresh_expanded_val : LLVMType -> LLVMSetup SetupValue` + +The `llvm_struct_value` function normally creates a `struct` whose layout +obeys the alignment rules of the platform specified in the LLVM file +being analyzed. Structs in LLVM can explicitly be "packed", however, so +that every field immediately follows the previous in memory. The +following command will create values of such types: + +* `llvm_packed_struct_value : [SetupValue] -> SetupValue` + +C programs will sometimes make use of pointer casting to implement +various kinds of polymorphic behaviors, either via direct pointer +casts, or by using `union` types to codify the pattern. To reason +about such cases, the following operation is useful. + +* `llvm_cast_pointer : SetupValue -> LLVMType -> SetupValue` + +This function function casts the type of the input value (which must be a +pointer) so that it points to values of the given type. This mainly +affects the results of subsequent `llvm_field` and `llvm_elem` calls, +and any eventual `points_to` statements that the resulting pointer +flows into. This is especially useful for dealing with C `union` +types, as the type information provided by LLVM is imprecise in these +cases. + +We can automate the process of applying pointer casts if we have debug +information avaliable: + +* `llvm_union : SetupValue -> String -> SetupValue` + +Given a pointer setup value, this attempts to select the named union +branch and cast the type of the pointer. For this to work, debug +symbols must be included; moreover, the process of correlating LLVM +type information with information contained in debug symbols is a bit +heuristic. If `llvm_union` cannot figure out how to cast a pointer, +one can fall back on the more manual `llvm_cast_pointer` instead. + + +In the experimental Java verification implementation, the following +functions can be used to state the equivalent of a combination of +`llvm_points_to` and either `llvm_elem` or `llvm_field`. + +* `jvm_elem_is : JVMValue -> Int -> JVMValue -> JVMSetup ()` specifies +the value of an array element. + +* `jvm_field_is : JVMValue -> String -> JVMValue -> JVMSetup ()` +specifies the name of an object field. + +In the experimental MIR verification implementation, the following functions +construct compound values: + +* `mir_array_value : MIRType -> [MIRValue] -> MIRValue` constructs an array + of the given type whose elements consist of the given values. Supplying the + element type is necessary to support length-0 arrays. +* `mir_enum_value : MIRAdt -> String -> [MIRValue] -> MIRValue` constructs an + enum using a particular enum variant. The `MIRAdt` arguments determines what + enum type to create, the `String` value determines the name of the variant to + use, and the `[MIRValue]` list are the values to use as elements in the + variant. + + See the "Finding MIR algebraic data types" section (as well as the "Enums" + subsection) for more information on how to compute a `MIRAdt` value to pass + to `mir_enum_value`. +* `mir_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section below. +* `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the + "MIR slices" section below. +* `mir_str_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section + below. +* `mir_str_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the + "MIR slices" section below. +* `mir_struct_value : MIRAdt -> [MIRValue] -> MIRValue` construct a struct + with the given list of values as elements. The `MIRAdt` argument determines + what struct type to create. + + See the "Finding MIR algebraic data types" section for more information on how + to compute a `MIRAdt` value to pass to `mir_struct_value`. +* `mir_tuple_value : [MIRValue] -> MIRValue` construct a tuple with the given + list of values as elements. + +To specify a compound value in which each element or field is symbolic, it +would be possible, but tedious, to use a large number of `mir_fresh_var` +invocations in conjunction with the commands above. However, the following +function can simplify the common case where you want every element or field to +have a fresh value: + +* `mir_fresh_expanded_value : String -> MIRType -> MIRSetup MIRValue` + +The `String` argument denotes a prefix to use when generating the names of +fresh symbolic variables. The `MIRType` can be any type, with the exception of +reference types (or compound types that contain references as elements or +fields), which are not currently supported. + +### MIR slices + +Slices are a unique form of compound type that is currently only used during +MIR verification. Unlike other forms of compound values, such as arrays, it is +not possible to directly construct a slice. Instead, one must take a slice of +an existing reference value that points to the thing being sliced. + +SAW currently supports taking slices of arrays and strings. + +#### Array slices + +The following commands are used to construct slices of arrays: + +* `mir_slice_value : MIRValue -> MIRValue`: the SAWScript expression + `mir_slice_value base` is equivalent to the Rust expression `&base[..]`, + i.e., a slice of the entirety of `base`. `base` must be a reference to an + array value (`&[T; N]` or `&mut [T; N]`), not an array itself. The type of + `mir_slice_value base` will be `&[T]` (if `base` is an immutable reference) + or `&mut [T]` (if `base` is a mutable reference). +* `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: the SAWScript + expression `mir_slice_range_value base start end` is equivalent to the Rust + expression `&base[start..end]`, i.e., a slice over a part of `base` which + ranges from `start` to `end`. `base` must be a reference to an array value + (`&[T; N]` or `&mut [T; N]`), not an array itself. The type of + `mir_slice_value base` will be `&[T]` (if `base` is an immutable reference) + or `&mut [T]` (if `base` is a mutable reference). + + `start` and `end` are assumed to be zero-indexed. `start` must not exceed + `end`, and `end` must not exceed the length of the array that `base` points + to. + +As an example of how to use these functions, consider this Rust function, which +accepts an arbitrary slice as an argument: + +~~~~ rust +pub fn f(s: &[u32]) -> u32 { + s[0] + s[1] +} +~~~~ + +We can write a specification that passes a slice to the array `[1, 2, 3, 4, 5]` +as an argument to `f`: + +~~~~ +let f_spec_1 = do { + a <- mir_alloc (mir_array 5 mir_u32); + mir_points_to a (mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}); + + mir_execute_func [mir_slice_value a]; + + mir_return (mir_term {{ 3 : [32] }}); +}; +~~~~ + +Alternatively, we can write a specification that passes a part of this array +over the range `[1..3]`, i.e., ranging from second element to the fourth. +Because this is a half-open range, the resulting slice has length 2: + +~~~~ +let f_spec_2 = do { + a <- mir_alloc (mir_array 5 mir_u32); + mir_points_to a (mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}); + + mir_execute_func [mir_slice_range_value a 1 3]; + + mir_return (mir_term {{ 5 : [32] }}); +}; +~~~~ + +Note that we are passing _references_ of arrays to `mir_slice_value` and +`mir_slice_range_value`. It would be an error to pass a bare array to these +functions, so the following specification would be invalid: + +~~~~ +let f_fail_spec_ = do { + let arr = mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}; + + mir_execute_func [mir_slice_value arr]; // BAD: `arr` is not a reference + + mir_return (mir_term {{ 3 : [32] }}); +}; +~~~~ + +Note that The `mir_slice_range_value` function must accept bare `Int` arguments +to specify the lower and upper bounds of the range. A consequence of this +design is that it is not possible to create a slice with a symbolic length. If +this limitation prevents you from using SAW, please file an issue [on +GitHub](https://github.com/GaloisInc/saw-script/issues). + +#### String slices + +In addition to slices of arrays (i.e., of type `&[T]`), SAW also supports +slices of strings (i.e., of type `&str`) through the following commands: + +* `mir_str_slice_value : MIRValue -> MIRValue`: the SAWScript expression + `mir_str_slice_value base` is equivalent to the Rust expression `&base[..]`, + i.e., a slice of the entirety of `base`. `base` must be a reference to an + array of bytes (`&[u8; N]` or `&mut [u8; N]`), not an array itself. The type + of `mir_str_slice_value base` will be `&str` (if `base` is an immutable + reference) or `&mut str` (if `base` is a mutable reference). +* `mir_str_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: the + SAWScript expression `mir_slice_range_value base start end` is equivalent to + the Rust expression `&base[start..end]`, i.e., a slice over a part of `base` + which ranges from `start` to `end`. `base` must be a reference to an array of + bytes (`&[u8; N]` or `&mut [u8; N]`), not an array itself. The type of + `mir_slice_value base` will be `&str` (if `base` is an immutable reference) + or `&mut str` (if `base` is a mutable reference). + + `start` and `end` are assumed to be zero-indexed. `start` must not exceed + `end`, and `end` must not exceed the length of the array that `base` points + to. + +One unusual requirement about `mir_str_slice_value` and +`mir_str_slice_range_value` is that they require the argument to be of type +`&[u8; N]`, i.e., a reference to an array of bytes. This is an artifact of the +way that strings are encoded in Cryptol. The following Cryptol expressions: + +* `"A"` +* `"123"` +* `"Hello World"` + +Have the following types: + +* `[1][8]` +* `[3][8]` +* `[11][8]` + +This is because Cryptol strings are syntactic shorthand for sequences of bytes. +The following Cryptol expressions are wholly equivalent: + +* `[0x41]` +* `[0x31, 0x32, 0x33]` +* `[0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64]` + +These represent the strings in the extended ASCII character encoding. The +Cryptol sequence type `[N][8]` is equivalent to the Rust type `[u8; N]`, so the +requirement to have something of type `&[u8; N]` as an argument reflects this +design choice. + +Note that `mir_str_slice_value ` is _not_ the same thing as +`mir_slice_value `, as the two commands represent different types +of Rust values. While both commands take a `` as an argument, +`mir_str_slice_value` will return a value of Rust type `&str` (or `&mut str`), +whereas `mir_slice_value` will return a value of Rust type `&[u8]` (or `&mut +[u8]`). These Rust types are checked when you pass these values as arguments to +Rust functions (using `mir_execute_func`) or when you return these values +(using `mir_return`), and it is an error to supply a `&str` value in a place +where a `&[u8]` value is expected (and vice versa). + +As an example of how to write specifications involving string slices, +consider this Rust function: + +~~~ rust +pub fn my_len(s: &str) -> usize { + s.len() +} +~~~ + +We can use `mir_str_slice_value` to write a specification for `my_len` when it +is given the string `"hello"` as an argument: + +~~~ +let my_len_spec = do { + s <- mir_alloc (mir_array 5 mir_u8); + mir_points_to s (mir_term {{ "hello" }}); + + mir_execute_func [mir_str_slice_value s]; + + mir_return (mir_term {{ 5 : [32] }}); +}; +~~~ + +Currently, Cryptol only supports characters that can be encoded in a single +byte. As a result, it is not currently possible to take slices of strings with +certain characters. For example, the string `"roșu"` cannot be used as a +Cryptol expression, as the character `'ș'` would require 10 bits to represent +instead of 8. The alternative is to use UTF-8 to encode such characters. For +instance, the UTF-8 encoding of the string `"roșu"` is `"ro\200\153u"`, where +`"\200\153"` is a sequence of two bytes that represents the `'ș'` character. + +SAW makes no attempt to ensure that string slices over a particular range +aligns with UTF-8 character boundaries. For example, the following Rust code +would panic: + +~~~ rust + let rosu: &str = "roșu"; + let s: &str = &rosu[0..3]; + println!("{:?}", s); +~~~ +~~~ +thread 'main' panicked at 'byte index 3 is not a char boundary; it is inside 'ș' (bytes 2..4) of `roșu`' +~~~ + +On the other hand, SAW will allow you define a slice of the form +`mir_str_slice_range r 0 3`, where `r` is a reference to `"ro\200\153u"`. It is +the responsibility of the SAW user to ensure that `mir_str_slice_range` indices +align with character boundaries. + +### Finding MIR algebraic data types + +We collectively refer to MIR `struct`s and `enum`s together as _algebraic data +types_, or ADTs for short. ADTs have identifiers to tell them apart, and a +single ADT declaration can give rise to multiple identifiers depending on how +the declaration is used. For example: + +~~~~ rust +pub struct S { + pub x: A, + pub y: B, +} + +pub fn f() -> S { + S { + x: 1, + y: 2, + } +} + +pub fn g() -> S { + S { + x: 3, + y: 4, + } +} +~~~~ + +This program as a single `struct` declaration `S`, which is used in the +functions `f` and `g`. Note that `S`'s declaration is _polymorphic_, as it uses +type parameters, but the uses of `S` in `f` and `g` are _monomorphic_, as `S`'s +type parameters are fully instantiated. Each unique, monomorphic instantiation +of an ADT gives rise to its own identifier. In the example above, this might +mean that the following identifiers are created when this code is compiled with +`mir-json`: + +* `S` gives rise to `example/abcd123::S::_adt456` +* `S` gives rise to `example/abcd123::S::_adt789` + +The suffix `_adt` is autogenerated by `mir-json` and is typically +difficult for humans to guess. For this reason, we offer a command to look up +an ADT more easily: + +* `mir_find_adt : MIRModule -> String -> [MIRType] -> MIRAdt` consults the + given `MIRModule` to find an algebraic data type (`MIRAdt`). It uses the given + `String` as an identifier and the given MIRTypes as the types to instantiate + the type parameters of the ADT. If such a `MIRAdt` cannot be found in the + `MIRModule`, this will raise an error. + +Note that the `String` argument to `mir_find_adt` does not need to include the +`_adt` suffix, as `mir_find_adt` will discover this for you. The `String` +is expected to adhere to the identifier conventions described in the "Running a +MIR-based verification" section. For instance, the following two lines will +look up `S` and `S` from the example above as `MIRAdt`s: + +~~~~ +m <- mir_load_module "example.linked-mir.json"; + +let s_8_16 = mir_find_adt m "example::S" [mir_u8, mir_u16]; +let s_32_64 = mir_find_adt m "example::S" [mir_u32, mir_u64]; +~~~~ + +The `mir_adt` command (for constructing a struct type), `mir_struct_value` (for +constructing a struct value), and `mir_enum_value` (for constructing an enum +value) commands in turn take a `MIRAdt` as an argument. + +#### Enums + +In addition to taking a `MIRAdt` as an argument, `mir_enum_value` also takes a +`String` representing the name of the variant to construct. The variant name +should be a short name such as `"None"` or `"Some"`, and not a full identifier +such as `"core::option::Option::None"` or `"core::option::Option::Some"`. This +is because the `MIRAdt` already contains the full identifiers for all of an +enum's variants, so SAW will use this information to look up a variant's +identifier from a short name. Here is an example of using `mir_enum_value` in +practice: + +~~~~ rust +pub fn n() -> Option { + None +} + +pub fn s(x: u32) -> Option { + Some(x) +} +~~~~ +~~~~ +m <- mir_load_module "example.linked-mir.json"; + +let option_u32 = mir_find_adt m "core::option::Option" [mir_u32]; + +let n_spec = do { + mir_execute_func []; + + mir_return (mir_enum_value option_u32 "None" []); +}; + +let s_spec = do { + x <- mir_fresh_var "x" mir_u32; + + mir_execute_func [mir_term x]; + + mir_return (mir_enum_value option_u32 "Some" [mir_term x]); +}; +~~~~ + +Note that `mir_enum_value` can only be used to construct a specific variant. If +you need to construct a symbolic enum value that can range over many potential +variants, use `mir_fresh_expanded_value` instead. + +#### Lifetimes + +Rust ADTs can have both type parameters as well as _lifetime_ parameters. The +following Rust code declares a lifetime parameter `'a` on the struct `S`, as +well on the function `f` that computes an `S` value: + +~~~~ rust +pub struct S<'a> { + pub x: &'a u32, +} + +pub fn f<'a>(y: &'a u32) -> S<'a> { + S { x: y } +} +~~~~ + +When `mir-json` compiles a piece of Rust code that contains lifetime +parameters, it will instantiate all of the lifetime parameters with a +placeholder MIR type that is simply called `lifetime`. This is important to +keep in mind when looking up ADTs with `mir_find_adt`, as you will also need to +indicate to SAW that the lifetime parameter is instantiated with `lifetime`. In +order to do so, use `mir_lifetime`. For example, here is how to look up `S` +with `'a` instantiated to `lifetime`: + +~~~~ +s_adt = mir_find_adt m "example::S" [mir_lifetime] +~~~~ + +Note that this part of SAW's design is subject to change in the future. +Ideally, users would not have to care about lifetimes at all at the MIR level; +see [this issue](https://github.com/GaloisInc/mir-json/issues/58) for further +discussion on this point. If that issue is fixed, then we will likely remove +`mir_lifetime`, as it will no longer be necessary. + +### Bitfields + +SAW has experimental support for specifying `struct`s with bitfields, such as +in the following example: + +~~~~ c +struct s { + uint8_t x:1; + uint8_t y:1; +}; +~~~~ + +Normally, a `struct` with two `uint8_t` fields would have an overall size of +two bytes. However, because the `x` and `y` fields are declared with bitfield +syntax, they are instead packed together into a single byte. + +Because bitfields have somewhat unusual memory representations in LLVM, some +special care is required to write SAW specifications involving bitfields. For +this reason, there is a dedicated `llvm_points_to_bitfield` function for this +purpose: + +* `llvm_points_to_bitfield : SetupValue -> String -> SetupValue -> LLVMSetup ()` + +The type of `llvm_points_to_bitfield` is similar that of `llvm_points_to`, +except that it takes the name of a field within a bitfield as an additional +argument. For example, here is how to assert that the `y` field in the `struct` +example above should be `0`: + +~~~~ +ss <- llvm_alloc (llvm_alias "struct.s"); +llvm_points_to_bitfield ss "y" (llvm_term {{ 0 : [1] }}); +~~~~ + +Note that the type of the right-hand side value (`0`, in this example) must +be a bitvector whose length is equal to the size of the field within the +bitfield. In this example, the `y` field was declared as `y:1`, so `y`'s value +must be of type `[1]`. + +Note that the following specification is _not_ equivalent to the one above: + +~~~~ +ss <- llvm_alloc (llvm_alias "struct.s"); +llvm_points_to (llvm_field ss "y") (llvm_term {{ 0 : [1] }}); +~~~~ + +`llvm_points_to` works quite differently from `llvm_points_to_bitfield` under +the hood, so using `llvm_points_to` on bitfields will almost certainly not work +as expected. + +In order to use `llvm_points_to_bitfield`, one must also use the +`enable_lax_loads_and_stores` command: + +* `enable_lax_loads_and_stores: TopLevel ()` + +Both `llvm_points_to_bitfield` and `enable_lax_loads_and_stores` are +experimental commands, so these also require using `enable_experimental` before +they can be used. + +The `enable_lax_loads_and_stores` command relaxes some +of SAW's assumptions about uninitialized memory, which is necessary to make +`llvm_points_to_bitfield` work under the hood. For example, reading from +uninitialized memory normally results in an error in SAW, but with +`enable_lax_loads_and_stores`, such a read will instead return a symbolic +value. At present, `enable_lax_loads_and_stores` only works with What4-based +tactics (e.g., `w4_unint_z3`); using it with SBV-based tactics +(e.g., `sbv_unint_z3`) will result in an error. + +Note that SAW relies on LLVM debug metadata in order to determine which struct +fields reside within a bitfield. As a result, you must pass `-g` to `clang` when +compiling code involving bitfields in order for SAW to be able to reason about +them. + +## Global variables + +SAW supports verifying LLVM and MIR specifications involving global variables. + +### LLVM global variables + +Mutable global variables that are accessed in a function must first be allocated +by calling `llvm_alloc_global` on the name of the global. + +* `llvm_alloc_global : String -> LLVMSetup ()` + +This ensures that all global variables that might influence the function are +accounted for explicitly in the specification: if `llvm_alloc_global` is +used in the precondition, there must be a corresponding `llvm_points_to` +in the postcondition describing the new state of that global. Otherwise, a +specification might not fully capture the behavior of the function, potentially +leading to unsoundness in the presence of compositional verification. (For more +details on this point, see the [Compositional Verification and Mutable Global +Variables](#compositional-verification-and-mutable-global-variables) section.) + +Immutable (i.e. `const`) global variables are allocated implicitly, and do not +require a call to `llvm_alloc_global`. + +Pointers to global variables or functions can be accessed with +`llvm_global`: + +* `llvm_global : String -> SetupValue` + +Like the pointers returned by `llvm_alloc`, however, these aren't +initialized at the beginning of symbolic -- setting global variables may +be unsound in the presence of [compositional +verification](#compositional-verification). + +To understand the issues surrounding global variables, consider the following C +code: + + +~~~ +int x = 0; + +int f(int y) { + x = x + 1; + return x + y; +} + +int g(int z) { + x = x + 2; + return x + z; +} +~~~ + +One might initially write the following specifications for `f` and `g`: + + +~~~ +m <- llvm_load_module "./test.bc"; + +f_spec <- llvm_verify m "f" [] true (do { + y <- llvm_fresh_var "y" (llvm_int 32); + llvm_execute_func [llvm_term y]; + llvm_return (llvm_term {{ 1 + y : [32] }}); +}) abc; + +g_spec <- llvm_llvm_verify m "g" [] true (do { + z <- llvm_fresh_var "z" (llvm_int 32); + llvm_execute_func [llvm_term z]; + llvm_return (llvm_term {{ 2 + z : [32] }}); +}) abc; +~~~ + +If globals were always initialized at the beginning of verification, +both of these specs would be provable. However, the results wouldn't +truly be compositional. For instance, it's not the case that `f(g(z)) == +z + 3` for all `z`, because both `f` and `g` modify the global variable +`x` in a way that crosses function boundaries. + +To deal with this, we can use the following function: + +* `llvm_global_initializer : String -> SetupValue` returns the value + of the constant global initializer for the named global variable. + +Given this function, the specifications for `f` and `g` can make this +reliance on the initial value of `x` explicit: + + +~~~ +m <- llvm_load_module "./test.bc"; + + +let init_global name = do { + llvm_alloc_global name; + llvm_points_to (llvm_global name) + (llvm_global_initializer name); +}; + +f_spec <- llvm_verify m "f" [] true (do { + y <- llvm_fresh_var "y" (llvm_int 32); + init_global "x"; + llvm_precond {{ y < 2^^31 - 1 }}; + llvm_execute_func [llvm_term y]; + llvm_return (llvm_term {{ 1 + y : [32] }}); +}) abc; +~~~ + +which initializes `x` to whatever it is initialized to in the C code at +the beginning of verification. This specification is now safe for +compositional verification: SAW won't use the specification `f_spec` +unless it can determine that `x` still has its initial value at the +point of a call to `f`. This specification also constrains `y` to prevent +signed integer overflow resulting from the `x + y` expression in `f`, +which is undefined behavior in C. + +### MIR static items + +Rust's static items are the MIR version of global variables. A reference to a +static item can be accessed with the `mir_static` function. This function takes +a `String` representing a static item's identifier, and this identifier is +expected to adhere to the naming conventions outlined in the "Running a +MIR-based verification" section: + +* `mir_static : String -> MIRValue` + +References to static values can be initialized with the `mir_points_to` +command, just like with other forms of references. Immutable static items +(e.g., `static X: u8 = 42`) are initialized implicitly in every SAW +specification, so there is no need for users to do so manually. Mutable static +items (e.g., `static mut Y: u8 = 27`), on the other hand, are *not* initialized +implicitly, and users must explicitly pick a value to initialize them with. + +The `mir_static_initializer` function can be used to access the initial value +of a static item in a MIR program. Like with `mir_static`, the `String` +supplied as an argument must be a valid identifier: + +* `mir_static_initializer : String -> MIRValue`. + +As an example of how to use these functions, here is a Rust program involving +static items: + +~~~ rust +// statics.rs +static S1: u8 = 1; +static mut S2: u8 = 2; + +pub fn f() -> u8 { + // Reading a mutable static item requires an `unsafe` block due to + // concurrency-related concerns. We are only concerned about the behavior + // of this program in a single-threaded context, so this is fine. + let s2 = unsafe { S2 }; + S1 + s2 +} +~~~ + +We can write a specification for `f` like so: + +~~~ +// statics.saw +enable_experimental; + +let f_spec = do { + mir_points_to (mir_static "statics::S2") + (mir_static_initializer "statics::S2"); + // Note that we do not initialize S1, as immutable static items are implicitly + // initialized in every specification. + + mir_execute_func []; + + mir_return (mir_term {{ 3 : [8] }}); +}; + +m <- mir_load_module "statics.linked-mir.json"; + +mir_verify m "statics::f" [] false f_spec z3; +~~~ + +In order to use a specification involving mutable static items for +compositional verification, it is required to specify the value of all mutable +static items using the `mir_points_to` command in the specification's +postconditions. For more details on this point, see the [Compositional +Verification and Mutable Global +Variables](#compositional-verification-and-mutable-global-variables) section. + +## Preconditions and Postconditions + +Sometimes a function is only well-defined under certain conditions, or +sometimes you may be interested in certain initial conditions that give +rise to specific final conditions. For these cases, you can specify an +arbitrary predicate as a precondition or post-condition, using any +values in scope at the time. + +* `llvm_precond : Term -> LLVMSetup ()` +* `llvm_postcond : Term -> LLVMSetup ()` +* `llvm_assert : Term -> LLVMSetup ()` +* `jvm_precond : Term -> JVMSetup ()` +* `jvm_postcond : Term -> JVMSetup ()` +* `jvm_assert : Term -> JVMSetup ()` +* `mir_precond : Term -> MIRSetup ()` +* `mir_postcond : Term -> MIRSetup ()` +* `mir_assert : Term -> MIRSetup ()` + +These commands take `Term` arguments, and therefore cannot describe the values +of pointers. The "assert" variants will work in either pre- or post-conditions, +and are useful when defining helper functions that, e.g., provide datastructure +invariants that make sense in both phases. The `{llvm,jvm,mir}_equal` commands +state that two values should be equal, and can be used in either the initial or +the final state. + +* `llvm_equal : SetupValue -> SetupValue -> LLVMSetup ()` +* `jvm_equal : JVMValue -> JVMValue -> JVMSetup ()` +* `mir_equal : MIRValue -> MIRValue -> MIRSetup ()` + +The use of `{llvm,jvm,mir}_equal` can also sometimes lead to more efficient +symbolic execution when the predicate of interest is an equality. + +## Assuming specifications + +Normally, a `MethodSpec` is the result of both simulation and proof of +the target code. However, in some cases, it can be useful to use a +`MethodSpec` to specify some code that either doesn't exist or is hard +to prove. The previously-mentioned [`assume_unsat` +tactic](proofs-about-terms.md#finishing-proofs-without-external-solvers) omits proof but does not prevent +simulation of the function. To skip simulation altogether, one can use +one of the following commands: + +~~~ +llvm_unsafe_assume_spec : + LLVMModule -> String -> LLVMSetup () -> TopLevel CrucibleMethodSpec + +jvm_unsafe_assume_spec : + JavaClass -> String -> JVMSetup () -> TopLevel JVMMethodSpec + +mir_unsafe_assume_spec : + MIRModule -> String -> MIRSetup () -> TopLevel MIRSpec +~~~ + +## A Heap-Based Example + +To tie all of the command descriptions from the previous sections +together, consider the case of verifying the correctness of a C program +that computes the dot product of two vectors, where the length and value +of each vector are encapsulated together in a `struct`. + +The dot product can be concisely specified in Cryptol as follows: + +~~~~ +dotprod : {n, a} (fin n, fin a) => [n][a] -> [n][a] -> [a] +dotprod xs ys = sum (zip (*) xs ys) +~~~~ + +To implement this in C, let's first consider the type of vectors: + +~~~~ c +typedef struct { + uint32_t *elts; + uint32_t size; +} vec_t; +~~~~ + +This struct contains a pointer to an array of 32-bit elements, and a +32-bit value indicating how many elements that array has. + +We can compute the dot product of two of these vectors with the +following C code (which uses the size of the shorter vector if they +differ in size). + +~~~~ c +uint32_t dotprod_struct(vec_t *x, vec_t *y) { + uint32_t size = MIN(x->size, y->size); + uint32_t res = 0; + for(size_t i = 0; i < size; i++) { + res += x->elts[i] * y->elts[i]; + } + return res; +} +~~~~ + +The entirety of this implementation can be found in the +`examples/llvm/dotprod_struct.c` file in the `saw-script` repository. + +To verify this program in SAW, it will be convenient to define a couple +of utility functions (which are generally useful for many +heap-manipulating programs). First, combining allocation and +initialization to a specific value can make many scripts more concise: + +~~~~ +let alloc_init ty v = do { + p <- llvm_alloc ty; + llvm_points_to p v; + return p; +}; +~~~~ + +This creates a pointer `p` pointing to enough space to store type `ty`, +and then indicates that the pointer points to value `v` (which should be +of that same type). + +A common case for allocation and initialization together is when the +initial value should be entirely symbolic. + +~~~~ +let ptr_to_fresh n ty = do { + x <- llvm_fresh_var n ty; + p <- alloc_init ty (llvm_term x); + return (x, p); +}; +~~~~ + +This function returns the pointer just allocated along with the fresh +symbolic value it points to. + +Given these two utility functions, the `dotprod_struct` function can be +specified as follows: + +~~~~ +let dotprod_spec n = do { + let nt = llvm_term {{ `n : [32] }}; + (xs, xsp) <- ptr_to_fresh "xs" (llvm_array n (llvm_int 32)); + (ys, ysp) <- ptr_to_fresh "ys" (llvm_array n (llvm_int 32)); + let xval = llvm_struct_value [ xsp, nt ]; + let yval = llvm_struct_value [ ysp, nt ]; + xp <- alloc_init (llvm_alias "struct.vec_t") xval; + yp <- alloc_init (llvm_alias "struct.vec_t") yval; + llvm_execute_func [xp, yp]; + llvm_return (llvm_term {{ dotprod xs ys }}); +}; +~~~~ + +Any instantiation of this specification is for a specific vector length +`n`, and assumes that both input vectors have that length. That length +`n` automatically becomes a type variable in the subsequent Cryptol +expressions, and the backtick operator is used to reify that type as a +bit vector of length 32. + +The entire script can be found in the `dotprod_struct-crucible.saw` file +alongside `dotprod_struct.c`. + +Running this script results in the following: + +~~~~ +Loading file "dotprod_struct.saw" +Proof succeeded! dotprod_struct +Registering override for `dotprod_struct` + variant `dotprod_struct` +Symbolic simulation completed with side conditions. +Proof succeeded! dotprod_wrap +~~~~ + +## Using Ghost State + +In some cases, information relevant to verification is not directly +present in the concrete state of the program being verified. This can +happen for at least two reasons: + +* When providing specifications for external functions, for which source + code is not present. The external code may read and write global state + that is not directly accessible from the code being verified. + +* When the abstract specification of the program naturally uses a + different representation for some data than the concrete + implementation in the code being verified does. + +One solution to these problems is the use of _ghost_ state. This can be +thought of as additional global state that is visible only to the +verifier. Ghost state with a given name can be declared at the top level +with the following function: + +* `declare_ghost_state : String -> TopLevel Ghost` + +Ghost state variables do not initially have any particluar type, and can +store data of any type. Given an existing ghost variable the following +functions can be used to specify its value: + +* `llvm_ghost_value : Ghost -> Term -> LLVMSetup ()` +* `jvm_ghost_value : Ghost -> Term -> JVMSetup ()` +* `mir_ghost_value : Ghost -> Term -> MIRSetup ()` + +These can be used in either the pre state or the post state, to specify the +value of ghost state either before or after the execution of the function, +respectively. + +## An Extended Example + +To tie together many of the concepts in this manual, we now present a +non-trivial verification task in its entirety. All of the code for this example +can be found in the `examples/salsa20` directory of +[the SAWScript repository](https://github.com/GaloisInc/saw-script). + +### Salsa20 Overview + +Salsa20 is a stream cipher developed in 2005 by Daniel J. Bernstein, built on a +pseudorandom function utilizing add-rotate-XOR (ARX) operations on 32-bit +words[^4]. Bernstein himself has provided several public domain +implementations of the cipher, optimized for common machine architectures. +For the mathematically inclined, his specification for the cipher can be +found [here](http://cr.yp.to/snuffle/spec.pdf). + +The repository referenced above contains three implementations of the Salsa20 +cipher: A reference Cryptol implementation (which we take as correct in this +example), and two C implementations, one of which is from Bernstein himself. +For this example, we focus on the second of these C +implementations, which more closely matches the Cryptol implementation. Full +verification of Bernstein's implementation is available in +`examples/salsa20/djb`, for the interested. The code for this verification task +can be found in the files named according to the pattern +`examples/salsa20/(s|S)alsa20.*`. + +### Specifications + +We now take on the actual verification task. This will be done in two stages: +We first define some useful utility functions for constructing common patterns +in the specifications for this type of program (i.e. one where the arguments to +functions are modified in-place.) We then demonstrate how one might construct a +specification for each of the functions in the Salsa20 implementation described +above. + +#### Utility Functions + +We first define the function +`alloc_init : LLVMType -> Term -> LLVMSetup SetupValue`. + +`alloc_init ty v` returns a `SetupValue` consisting of a pointer to memory +allocated and initialized to a value `v` of type `ty`. `alloc_init_readonly` +does the same, except the memory allocated cannot be written to. + +~~~~ +import "Salsa20.cry"; + +let alloc_init ty v = do { + p <- llvm_alloc ty; + llvm_points_to p (llvm_term v); + return p; +}; + +let alloc_init_readonly ty v = do { + p <- llvm_alloc_readonly ty; + llvm_points_to p (llvm_term v); + return p; +}; +~~~~ + +We now define +`ptr_to_fresh : String -> LLVMType -> LLVMSetup (Term, SetupValue)`. + +`ptr_to_fresh n ty` returns a pair `(x, p)` consisting of a fresh symbolic +variable `x` of type `ty` and a pointer `p` to it. `n` specifies the +name that SAW should use when printing `x`. `ptr_to_fresh_readonly` does the +same, but returns a pointer to space that cannot be written to. + +~~~~ +let ptr_to_fresh n ty = do { + x <- llvm_fresh_var n ty; + p <- alloc_init ty x; + return (x, p); +}; + +let ptr_to_fresh_readonly n ty = do { + x <- llvm_fresh_var n ty; + p <- alloc_init_readonly ty x; + return (x, p); +}; +~~~~ + +Finally, we define +`oneptr_update_func : String -> LLVMType -> Term -> LLVMSetup ()`. + +`oneptr_update_func n ty f` specifies the behavior of a function that takes +a single pointer (with a printable name given by `n`) to memory containing a +value of type `ty` and mutates the contents of that memory. The specification +asserts that the contents of this memory after execution are equal to the value +given by the application of `f` to the value in that memory before execution. + +~~~~ +let oneptr_update_func n ty f = do { + (x, p) <- ptr_to_fresh n ty; + llvm_execute_func [p]; + llvm_points_to p (llvm_term {{ f x }}); +}; +~~~~ + +#### The `quarterround` operation + +The C function we wish to verify has type +`void s20_quarterround(uint32_t *y0, uint32_t *y1, uint32_t *y2, uint32_t *y3)`. + +The function's specification generates four symbolic variables and pointers to +them in the precondition/setup stage. The pointers are passed to the function +during symbolic execution via `llvm_execute_func`. Finally, in the +postcondition/return stage, the expected values are computed using the trusted +Cryptol implementation and it is asserted that the pointers do in fact point to +these expected values. + +~~~~ +let quarterround_setup : LLVMSetup () = do { + (y0, p0) <- ptr_to_fresh "y0" (llvm_int 32); + (y1, p1) <- ptr_to_fresh "y1" (llvm_int 32); + (y2, p2) <- ptr_to_fresh "y2" (llvm_int 32); + (y3, p3) <- ptr_to_fresh "y3" (llvm_int 32); + + llvm_execute_func [p0, p1, p2, p3]; + + let zs = {{ quarterround [y0,y1,y2,y3] }}; // from Salsa20.cry + llvm_points_to p0 (llvm_term {{ zs@0 }}); + llvm_points_to p1 (llvm_term {{ zs@1 }}); + llvm_points_to p2 (llvm_term {{ zs@2 }}); + llvm_points_to p3 (llvm_term {{ zs@3 }}); +}; +~~~~ + +#### Simple Updating Functions + +The following functions can all have their specifications given by the utility +function `oneptr_update_func` implemented above, so there isn't much to say +about them. + +~~~~ +let rowround_setup = + oneptr_update_func "y" (llvm_array 16 (llvm_int 32)) {{ rowround }}; + +let columnround_setup = + oneptr_update_func "x" (llvm_array 16 (llvm_int 32)) {{ columnround }}; + +let doubleround_setup = + oneptr_update_func "x" (llvm_array 16 (llvm_int 32)) {{ doubleround }}; + +let salsa20_setup = + oneptr_update_func "seq" (llvm_array 64 (llvm_int 8)) {{ Salsa20 }}; +~~~~ + +#### 32-Bit Key Expansion + +The next function of substantial behavior that we wish to verify has the +following prototype: + +~~~~c +void s20_expand32( uint8_t *k + , uint8_t n[static 16] + , uint8_t keystream[static 64] + ) +~~~~ + +This function's specification follows a similar pattern to that of +`s20_quarterround`, though for extra assurance we can make sure that the +function does not write to the memory pointed to by `k` or `n` using the +utility `ptr_to_fresh_readonly`, as this function should only modify +`keystream`. Besides this, we see the call to the trusted Cryptol +implementation specialized to `a=2`, which does 32-bit key expansion (since the +Cryptol implementation can also specialize to `a=1` for 16-bit keys). This +specification can easily be changed to work with 16-bit keys. + +~~~~ +let salsa20_expansion_32 = do { + (k, pk) <- ptr_to_fresh_readonly "k" (llvm_array 32 (llvm_int 8)); + (n, pn) <- ptr_to_fresh_readonly "n" (llvm_array 16 (llvm_int 8)); + + pks <- llvm_alloc (llvm_array 64 (llvm_int 8)); + + llvm_execute_func [pk, pn, pks]; + + let rks = {{ Salsa20_expansion`{a=2}(k, n) }}; + llvm_points_to pks (llvm_term rks); +}; +~~~~ + +#### 32-bit Key Encryption + +Finally, we write a specification for the encryption function itself, which has +type + +~~~~c +enum s20_status_t s20_crypt32( uint8_t *key + , uint8_t nonce[static 8] + , uint32_t si + , uint8_t *buf + , uint32_t buflen + ) +~~~~ + +As before, we can ensure this function does not modify the memory pointed to by +`key` or `nonce`. We take `si`, the stream index, to be 0. The specification is +parameterized on a number `n`, which corresponds to `buflen`. Finally, to deal +with the fact that this function returns a status code, we simply specify that +we expect a success (status code 0) as the return value in the postcondition +stage of the specification. + +~~~~ +let s20_encrypt32 n = do { + (key, pkey) <- ptr_to_fresh_readonly "key" (llvm_array 32 (llvm_int 8)); + (v, pv) <- ptr_to_fresh_readonly "nonce" (llvm_array 8 (llvm_int 8)); + (m, pm) <- ptr_to_fresh "buf" (llvm_array n (llvm_int 8)); + + llvm_execute_func [ pkey + , pv + , llvm_term {{ 0 : [32] }} + , pm + , llvm_term {{ `n : [32] }} + ]; + + llvm_points_to pm (llvm_term {{ Salsa20_encrypt (key, v, m) }}); + llvm_return (llvm_term {{ 0 : [32] }}); +}; +~~~~ + +### Verifying Everything + +Finally, we can verify all of the functions. Notice the use of compositional +verification and that path satisfiability checking is enabled for those +functions with loops not bounded by explicit constants. Notice that we prove +the top-level function for several sizes; this is due to the limitation that +SAW can only operate on finite programs (while Salsa20 can operate on any input +size.) + +~~~~ +let main : TopLevel () = do { + m <- llvm_load_module "salsa20.bc"; + qr <- llvm_verify m "s20_quarterround" [] false quarterround_setup abc; + rr <- llvm_verify m "s20_rowround" [qr] false rowround_setup abc; + cr <- llvm_verify m "s20_columnround" [qr] false columnround_setup abc; + dr <- llvm_verify m "s20_doubleround" [cr,rr] false doubleround_setup abc; + s20 <- llvm_verify m "s20_hash" [dr] false salsa20_setup abc; + s20e32 <- llvm_verify m "s20_expand32" [s20] true salsa20_expansion_32 abc; + s20encrypt_63 <- llvm_verify m "s20_crypt32" [s20e32] true (s20_encrypt32 63) abc; + s20encrypt_64 <- llvm_verify m "s20_crypt32" [s20e32] true (s20_encrypt32 64) abc; + s20encrypt_65 <- llvm_verify m "s20_crypt32" [s20e32] true (s20_encrypt32 65) abc; + + print "Done!"; +}; +~~~~ + +[^4]: https://en.wikipedia.org/wiki/Salsa20 + +## Verifying Cryptol FFI functions + +SAW has special support for verifying the correctness of Cryptol's +[`foreign` +functions](https://galoisinc.github.io/cryptol/master/FFI.html), +implemented in a language such as C which compiles to LLVM, provided +that there exists a [reference Cryptol +implementation](https://galoisinc.github.io/cryptol/master/FFI.html#cryptol-implementation-of-foreign-functions) +of the function as well. Since the way in which `foreign` functions are +called is precisely specified by the Cryptol FFI, SAW is able to +generate a `LLVMSetup ()` spec directly from the type of a Cryptol +`foreign` function. This is done with the `llvm_ffi_setup` command, +which is experimental and requires `enable_experimental;` to be run +beforehand. +``` +llvm_ffi_setup : Term -> LLVMSetup () +``` + +For instance, for the simple imported Cryptol foreign function `foreign +add : [32] -> [32] -> [32]` we can obtain a `LLVMSetup` spec simply by +writing +``` +let add_setup = llvm_ffi_setup {{ add }}; +``` +which behind the scenes expands to something like +``` +let add_setup = do { + in0 <- llvm_fresh_var "in0" (llvm_int 32); + in1 <- llvm_fresh_var "in1" (llvm_int 32); + llvm_execute_func [llvm_term in0, llvm_term in1]; + llvm_return (llvm_term {{ add in0 in1 }}); +}; +``` + +### Polymorphism + +In general, Cryptol `foreign` functions can be polymorphic, with type +parameters of kind `#`, representing e.g. the sizes of input sequences. +However, any individual `LLVMSetup ()` spec only specifies the behavior +of the LLVM function on inputs of concrete sizes. We handle this by +allowing the argument term of `llvm_ffi_setup` to contain any necessary +type arguments in addition to the Cryptol function name, so that the +resulting term is monomorphic. The user can then define a parameterized +specification simply as a SAWScript function in the usual way. For +example, for a function `foreign f : {n, m} (fin n, fin m) => [n][32] -> +[m][32]`, we can obtain a parameterized `LLVMSetup` spec by +``` +let f_setup (n : Int) (m : Int) = llvm_ffi_setup {{ f`{n, m} }}; +``` +Note that the `Term` parameter that `llvm_ffi_setup` takes is restricted +syntactically to the format described above (``{{ fun`{tyArg0, tyArg1, +..., tyArgN} }}``), and cannot be any arbitrary term. + +### Supported types + +`llvm_ffi_setup` supports all Cryptol types that are supported by the +Cryptol FFI, with the exception of `Integer`, `Rational`, `Z`, and +`Float`. `Integer`, `Rational`, and `Z` are not supported since they are +translated to `gmp` arbitrary-precision types which are hard for SAW to +handle without additional overrides. There is no fundamental obstacle to +supporting `Float`, and in fact `llvm_ffi_setup` itself does work with +Cryptol floating point types, but the underlying functions such as +`llvm_fresh_var` do not, so until that is implemented `llvm_ffi_setup` +can generate a spec involving floating point types but it cannot +actually be run. + +### Performing the verification + +The resulting `LLVMSetup ()` spec can be used with the existing +`llvm_verify` function to perform the actual verification. And the +`LLVMSpec` output from that can be used as an override as usual for +further compositional verification. +``` +f_ov <- llvm_verify mod "f" [] true (f_setup 3 5) z3; +``` + +As with the Cryptol FFI itself, SAW does not manage the compilation of +the C source implementations of `foreign` functions to LLVM bitcode. For +the verification to be meaningful, is expected that the LLVM module +passed to `llvm_verify` matches the compiled dynamic library actually +used with the Cryptol interpreter. Alternatively, on x86_64 Linux, SAW +can perform verification directly on the `.so` ELF file with the +experimental `llvm_verify_x86` command. diff --git a/doc/manual/structure-of-sawscript.md b/doc/manual/structure-of-sawscript.md new file mode 100644 index 0000000000..33bee7c8fe --- /dev/null +++ b/doc/manual/structure-of-sawscript.md @@ -0,0 +1,428 @@ +# Structure of SAWScript + +A SAWScript program consists, at the top level, of a sequence of +commands to be executed in order. Each command is terminated with a +semicolon. For example, the `print` command displays a textual +representation of its argument. Suppose the following text is stored in +the file `print.saw`: + +~~~~ +print 3; +~~~~ + +The command `saw print.saw` will then yield output similar to the +following: + +~~~~ +Loading module Cryptol +Loading file "print.saw" +3 +~~~~ + +The same code can be run from the interactive REPL: + +~~~~ +sawscript> print 3; +3 +~~~~ + +At the REPL, terminating semicolons can be omitted: + +~~~~ +sawscript> print 3 +3 +~~~~ + +To make common use cases simpler, bare values at the REPL are treated as +if they were arguments to `print`: + +~~~~ +sawscript> 3 +3 +~~~~ + +One SAWScript file can be included in another using the `include` +command, which takes the name of the file to be included as an argument. +For example: + +~~~~ +sawscript> include "print.saw" +Loading file "print.saw" +3 +~~~~ + +Typically, included files are used to import definitions, not perform +side effects like printing. However, as you can see, if any commands +with side effects occur at the top level of the imported file, those +side effects will occur during import. + +## Syntax + +The syntax of SAWScript is reminiscent of functional languages such as +Cryptol, Haskell and ML. In particular, functions are applied by +writing them next to their arguments rather than by using parentheses +and commas. Rather than writing `f(x, y)`, write `f x y`. + +Comments are written as in C, Java, and Rust (among many other languages). All +text from `//` until the end of a line is ignored. Additionally, all +text between `/*` and `*/` is ignored, regardless of whether the line +ends. + +## Basic Types and Values + +All values in SAWScript have types, and these types are determined and +checked before a program runs (that is, SAWScript is statically typed). +The basic types available are similar to those in many other languages. + +* The `Int` type represents unbounded mathematical integers. Integer + constants can be written in decimal notation (e.g., `42`), hexadecimal + notation (`0x2a`), and binary (`0b00101010`). However, unlike many + languages, integers in SAWScript are used primarily as constants. + Arithmetic is usually encoded in Cryptol, as discussed in the next + section. + +* The Boolean type, `Bool`, contains the values `true` and `false`, like + in many other languages. As with integers, computations on Boolean + values usually occur in Cryptol. + +* Values of any type can be aggregated into tuples. For example, the + value `(true, 10)` has the type `(Bool, Int)`. + +* Values of any type can also be aggregated into records, which are + exactly like tuples except that their components have names. For + example, the value `{ b = true, n = 10 }` has the type `{ b : Bool, + n : Int }`. + +* A sequence of values of the same type can be stored in a list. For + example, the value `[true, false, true]` has the type `[Bool]`. + +* Strings of textual characters can be represented in the `String` type. + For example, the value `"example"` has type `String`. + +* The "unit" type, written `()`, is essentially a placeholder, similar + to `void` in languages like C and Java. It has only one value, also + written `()`. Values of type `()` convey no information. We will show + in later sections several cases where this is useful. + +* Functions are given types that indicate what type they consume and + what type they produce. For example, the type `Int -> Bool` indicates + a function that takes an `Int` as input and produces a `Bool` as + output. Functions with multiple arguments use multiple arrows. For + example, the type `Int -> String -> Bool` indicates a function in + which the first argument is an `Int`, the second is a `String`, and + the result is a `Bool`. It is possible, but not necessary, to group + arguments in tuples, as well, so the type `(Int, String) -> Bool` + describes a function that takes one argument, a pair of an `Int` and a + `String`, and returns a `Bool`. + +SAWScript also includes some more specialized types that do not have +straightforward counterparts in most other languages. These will appear +in later sections. + +## Basic Expression Forms + +One of the key forms of top-level command in SAWScript is a *binding*, +introduced with the `let` keyword, which gives a name to a value. For +example: + +~~~~ +sawscript> let x = 5 +sawscript> x +5 +~~~~ + +Bindings can have parameters, in which case they define functions. For +instance, the following function takes one parameter and constructs a +list containing that parameter as its single element. + +~~~~ +sawscript> let f x = [x] +sawscript> f "text" +["text"] +~~~~ + +Functions themselves are values and have types. The type of a function +that takes an argument of type `a` and returns a result of type `b` is +`a -> b`. + +Function types are typically inferred, as in the example `f` +above. In this case, because `f` only creates a list with the given +argument, and because it is possible to create a list of any element +type, `f` can be applied to an argument of any type. We say, therefore, +that `f` is *polymorphic*. Concretely, we write the type of `f` as `{a} +a -> [a]`, meaning it takes a value of any type (denoted `a`) and +returns a list containing elements of that same type. This means we can +also apply `f` to `10`: + +~~~~ +sawscript> f 10 +[10] +~~~~ + +However, we may want to specify that a function has a more +specific type. In this case, we could restrict `f` to operate only on +`Int` parameters. + +~~~~ +sawscript> let f (x : Int) = [x] +~~~~ + +This will work identically to the original `f` on an `Int` parameter: + +~~~~ +sawscript> f 10 +[10] +~~~~ + +However, it will fail for a `String` parameter: + +~~~~ +sawscript> f "text" + +type mismatch: String -> t.0 and Int -> [Int] + at "_" (REPL) +mismatched type constructors: String and Int +~~~~ + +Type annotations can be applied to any expression. The notation `(e : +t)` indicates that expression `e` is expected to have type `t` and +that it is an error for `e` to have a different type. Most types in +SAWScript are inferred automatically, but specifying them explicitly can +sometimes enhance readability. + +Because functions are values, functions can return other functions. We +make use of this feature when writing functions of multiple arguments. +Consider the function `g`, similar to `f` but with two arguments: + +~~~~ +sawscript> let g x y = [x, y] +~~~~ + +Like `f`, `g` is polymorphic. Its type is `{a} a -> a -> [a]`. This +means it takes an argument of type `a` and returns a *function* that +takes an argument of the same type `a` and returns a list of `a` values. +We can therefore apply `g` to any two arguments of the same type: + +~~~~ +sawscript> g 2 3 +[2,3] +sawscript> g true false +[true,false] +~~~~ + +But type checking will fail if we apply it to two values of different types: + +~~~~ +sawscript> g 2 false + +type mismatch: Bool -> t.0 and Int -> [Int] + at "_" (REPL) +mismatched type constructors: Bool and Int +~~~~ + +So far we have used two related terms, *function* and *command*, and we +take these to mean slightly different things. A function is any value +with a function type (e.g., `Int -> [Int]`). A command is any value with +a special command type (e.g. `TopLevel ()`, as shown below). These +special types allow us to restrict command usage to specific contexts, +and are also *parameterized* (like the list type). Most but not all +commands are also functions. + +The most important command type is the `TopLevel` type, indicating a +command that can run at the top level (directly at the REPL, or as one +of the top level commands in a script file). The `print` command +has the type `{a} a -> TopLevel ()`, where `TopLevel ()` means that it +is a command that runs in the `TopLevel` context and returns a value of +type `()` (that is, no useful information). In other words, it has a +side effect (printing some text to the screen) but doesn't produce any +information to use in the rest of the SAWScript program. This is the +primary usage of the `()` type. + +It can sometimes be useful to bind a sequence of commands together. This +can be accomplished with the `do { ... }` construct. For example: + +~~~~ +sawscript> let print_two = do { print "first"; print "second"; } +sawscript> print_two +first +second +~~~~ + +The bound value, `print_two`, has type `TopLevel ()`, since that is the +type of its last command. + +Note that in the previous example the printing doesn't occur until +`print_two` directly appears at the REPL. The `let` expression does not +cause those commands to run. The construct that *runs* a command is +written using the `<-` operator. This operator works like `let` except +that it says to run the command listed on the right hand side and bind +the result, rather than binding the variable to the command itself. +Using `<-` instead of `let` in the previous example yields: + +~~~~ +sawscript> print_two <- do { print "first"; print "second"; } +first +second +sawscript> print print_two +() +~~~~ + +Here, the `print` commands run first, and then `print_two` gets the +value returned by the second `print` command, namely `()`. Any command +run without using `<-` at either the top level of a script or within a +`do` block discards its result. However, the REPL prints the result of +any command run without using the `<-` operator. + +In some cases it can be useful to have more control over the value +returned by a `do` block. The `return` command allows us to do this. For +example, say we wanted to write a function that would print a message +before and after running some arbitrary command and then return the +result of that command. We could write: + +~~~~ +let run_with_message msg c = + do { + print "Starting."; + print msg; + res <- c; + print "Done."; + return res; + }; + +x <- run_with_message "Hello" (return 3); +print x; +~~~~ + +If we put this script in `run.saw` and run it with `saw`, we get +something like: + +~~~~ +Loading module Cryptol +Loading file "run.saw" +Starting. +Hello +Done. +3 +~~~~ + +Note that it ran the first `print` command, then the caller-specified +command, then the second `print` command. The result stored in `x` at +the end is the result of the `return` command passed in as an argument. + +## Other Basic Functions + +Aside from the functions we have listed so far, there are a number of other +operations for working with basic data structures and interacting +with the operating system. + +The following functions work on lists: + +* `concat : {a} [a] -> [a] -> [a]` takes two lists and returns the +concatenation of the two. + +* `head : {a} [a] -> a` returns the first element of a list. + +* `tail : {a} [a] -> [a]` returns everything except the first element. + +* `length : {a} [a] -> Int` counts the number of elements in a list. + +* `null : {a} [a] -> Bool` indicates whether a list is empty (has zero +elements). + +* `nth : {a} [a] -> Int -> a` returns the element at the given position, +with `nth l 0` being equivalent to `head l`. + +* `for : {m, a, b} [a] -> (a -> m b) -> m [b]` takes a list and a +function that runs in some command context. The passed command will be +called once for every element of the list, in order. Returns a list of +all of the results produced by the command. + +For interacting with the operating system, we have: + +* `get_opt : Int -> String` returns the command-line argument to `saw` +at the given index. Argument 0 is always the name of the `saw` +executable itself, and higher indices represent later arguments. + +* `exec : String -> [String] -> String -> TopLevel String` runs an +external program given, respectively, an executable name, a list of +arguments, and a string to send to the standard input of the program. +The `exec` command returns the standard output from the program it +executes and prints standard error to the screen. + +* `exit : Int -> TopLevel ()` stops execution of the current script and +returns the given exit code to the operating system. + +Finally, there are a few miscellaneous functions and commands: + +* `show : {a} a -> String` computes the textual representation of its +argument in the same way as `print`, but instead of displaying the value +it returns it as a `String` value for later use in the program. This can +be useful for constructing more detailed messages later. + +* `str_concat : String -> String -> String` concatenates two `String` +values, and can also be useful with `show`. + +* `time : {a} TopLevel a -> TopLevel a` runs any other `TopLevel` +command and prints out the time it took to execute. + +* `with_time : {a} TopLevel a -> TopLevel (Int, a)` returns both the +original result of the timed command and the time taken to execute it +(in milliseconds), without printing anything in the process. + +## REPL Actions + +There is an additional class of things that one may type at the REPL +for interactive use: + +* `:cd` changes the REPL's current directory. + +* `:pwd` prints the REPL's current directory. + +* `:env` displays the values and types of all currently bound +variables, including built-in functions and commands. + +* `:tenv` displays the expansions of all currently defined type +aliases, including those that are built in. + +* `:type` or `:t` checks and prints the type of an arbitrary SAWScript +expression: +~~~~ +sawscript> :t show +{a.0} a.0 -> String +~~~~ + +* `:help` or `:h` prints the help text for a built-in function or +command: +~~~~ +sawscript> :h show +Description +----------- + + show : {a} a -> String + +Convert the value of the given expression to a string. +~~~~ + +* `:quit` or `:q` exits the program. + +## Further built-in functions and commands + +SAW contains many built-in operations, referred to as "primitives." +These appear in SAWScript as built-in functions and commands. +The following sections of the manual will introduce many of these. + +## Experimental and deprecated functions and commands + +Some of the primitives available in SAW at any given time are +experimental. +These may be incomplete, unfinished, use at your own risk, etc. +The functions and commands associated with these are unavailable +by default; they can be made visible with the `enable_experimental` +command. + +Other primitives are considered deprecated. +Some of these, as the +[deprecation process](#formal-deprecation-process) proceeds, are +unavailable by default. + +They can be made visible with the `enable_deprecated` command. diff --git a/doc/manual/symbolic-execution.md b/doc/manual/symbolic-execution.md new file mode 100644 index 0000000000..532929790d --- /dev/null +++ b/doc/manual/symbolic-execution.md @@ -0,0 +1,92 @@ +# Symbolic Execution + +Analysis of Java and LLVM within SAWScript relies heavily on *symbolic +execution*, so some background on how this process works can help with +understanding the behavior of the available built-in functions. + +At the most abstract level, symbolic execution works like normal program +execution except that the values of all variables within the program can be +arbitrary *expressions*, potentially containing free variables, rather than +concrete values. Therefore, each symbolic execution corresponds to some set +of possible concrete executions. + +As a concrete example, consider the following C program that returns +the maximum of two values: + +~~~~ c +unsigned int max(unsigned int x, unsigned int y) { + if (y > x) { + return y; + } else { + return x; + } +} +~~~~ + +If you call this function with two concrete inputs, like this: + +~~~~ c +int r = max(5, 4); +~~~~ + +then it will assign the value `5` to `r`. However, we can also consider what +it will do for *arbitrary* inputs. Consider the following example: + +~~~~ c +int r = max(a, b); +~~~~ + +where `a` and `b` are variables with unknown values. It is still +possible to describe the result of the `max` function in terms of `a` +and `b`. The following expression describes the value of `r`: + +~~~~ +ite (b > a) b a +~~~~ + +where `ite` is the "if-then-else" mathematical function, which based on +the value of the first argument returns either the second or third. One +subtlety of constructing this expression, however, is the treatment of +conditionals in the original program. For any concrete values of `a` and +`b`, only one branch of the `if` statement will execute. During symbolic +execution, on the other hand, it is necessary to execute *both* +branches, track two different program states (each composed of symbolic +values), and then *merge* those states after executing the `if` +statement. This merging process takes into account the original branch +condition and introduces the `ite` expression. + +A symbolic execution system, then, is very similar to an interpreter +that has a different notion of what constitutes a value and executes +*all* paths through the program instead of just one. Therefore, the +execution process is similar to that of a normal +interpreter, and the process of generating a model for a piece of code +is similar to building a test harness for that same code. + +More specifically, the setup process for a test harness typically takes +the following form: + +* Initialize or allocate any resources needed by the code. For Java and + LLVM code, this typically means allocating memory and setting the + initial values of variables. + +* Execute the code. + +* Check the desired properties of the system state after the code + completes. + +Accordingly, three pieces of information are particularly relevant to +the symbolic execution process, and are therefore needed as input to the +symbolic execution system: + +* The initial (potentially symbolic) state of the system. + +* The code to execute. + +* The final state of the system, and which parts of it are relevant to + the properties being tested. + +In the following sections, we describe how the Java and LLVM analysis +primitives work in the context of these key concepts. We start with the +simplest situation, in which the structure of the initial and final +states can be directly inferred, and move on to more complex cases that +require more information from the user. diff --git a/doc/manual/symbolic-termination.md b/doc/manual/symbolic-termination.md new file mode 100644 index 0000000000..fdd42df083 --- /dev/null +++ b/doc/manual/symbolic-termination.md @@ -0,0 +1,66 @@ +# Symbolic Termination + +Above we described the process of executing multiple branches and +merging the results when encountering a conditional statement in the +program. When a program contains loops, the branch that chooses to +continue or terminate a loop could go either way. Therefore, without a +bit more information, the most obvious implementation of symbolic +execution would never terminate when executing programs that contain +loops. + +The solution to this problem is to analyze the branch condition whenever +considering multiple branches. If the condition for one branch can never +be true in the context of the current symbolic state, there is no reason +to execute that branch, and skipping it can make it possible for +symbolic execution to terminate. + +Directly comparing the branch condition to a constant can sometimes be +enough to ensure termination. For example, in simple, bounded loops like +the following, comparison with a constant is sufficient. + +~~~~ c +for (int i = 0; i < 10; i++) { + // do something +} +~~~~ + +In this case, the value of `i` is always concrete, and will eventually +reach the value `10`, at which point the branch corresponding to +continuing the loop will be infeasible. + +As a more complex example, consider the following function: + +~~~~ c +uint8_t f(uint8_t i) { + int done = 0; + while (!done) { + if (i % 8 == 0) done = 1; + i += 5; + } + return i; +} +~~~~ + +The loop in this function can only be determined to symbolically +terminate if the analysis takes into account algebraic rules about +common multiples. Similarly, it can be difficult to prove that a base +case is eventually reached for all inputs to a recursive program. + +In this particular case, however, the code *is* guaranteed to terminate +after a fixed number of iterations (where the number of possible +iterations is a function of the number of bits in the integers being +used). To show that the last iteration is in fact the last possible one, +it's necessary to do more than just compare the branch condition with a +constant. Instead, we can use the same proof tools that we use to +ultimately analyze the generated models to, early in the process, prove +that certain branch conditions can never be true (i.e., are +*unsatisfiable*). + +Normally, most of the Java and LLVM analysis commands simply compare +branch conditions to the constant `True` or `False` to determine whether +a branch may be feasible. However, each form of analysis allows branch +satisfiability checking to be turned on if needed, in which case +functions like `f` above will terminate. + +Next, we examine the details of the specific commands available to +analyze JVM and LLVM programs. diff --git a/doc/manual/the-term-type.md b/doc/manual/the-term-type.md new file mode 100644 index 0000000000..f0f2e76c18 --- /dev/null +++ b/doc/manual/the-term-type.md @@ -0,0 +1,13 @@ +# The Term Type + +Perhaps the most important type in SAWScript, and the one most unlike +the built-in types of most other languages, is the `Term` type. +Essentially, a value of type `Term` precisely describes all +possible computations performed by some program. In particular, if +two `Term` values are *equivalent*, then the programs that they +represent will always compute the same results given the same inputs. We +will say more later about exactly what it means for two terms to be +equivalent, and how to determine whether two terms are equivalent. + +Before exploring the `Term` type more deeply, it is important to +understand the role of the Cryptol language in SAW. diff --git a/doc/manual/transforming-term-values.md b/doc/manual/transforming-term-values.md new file mode 100644 index 0000000000..2dcfab330c --- /dev/null +++ b/doc/manual/transforming-term-values.md @@ -0,0 +1,314 @@ +# Transforming Term Values + +The three primary functions of SAW are *extracting* models (`Term` +values) from programs, *transforming* those models, and *proving* +properties about models using external provers. So far we've shown how +to construct `Term` values from Cryptol programs; later sections +will describe how to extract them from other programs. Now we show how +to use the various term transformation features available in SAW. + +## Rewriting + +Rewriting a `Term` consists of applying one or more *rewrite rules* to +it, resulting in a new `Term`. A rewrite rule in SAW can be specified in +multiple ways: + + 1. as the definition of a function that can be unfolded, + 1. as a term of Boolean type (or a function returning a Boolean) that + is an equality statement, and + 1. as a term of _equality type_ with a body that encodes a proof that + the equality in the type is valid. + +In each case the term logically consists of two sides and describes a +way to transform the left side into the right side. Each side may +contain variables (bound by enclosing lambda expressions) and is +therefore a *pattern* which can match any term in which each variable +represents an arbitrary sub-term. The left-hand pattern describes a term +to match (which may be a sub-term of the full term being rewritten), and +the right-hand pattern describes a term to replace it with. Any variable +in the right-hand pattern must also appear in the left-hand pattern and +will be instantiated with whatever sub-term matched that variable in the +original term. + +For example, say we have the following Cryptol function: + +~~~~ + \(x:[8]) -> (x * 2) + 1 +~~~~ + +We might for some reason want to replace multiplication by a power of +two with a shift. We can describe this replacement using an equality +statement in Cryptol (a rule of form 2 above): + +~~~~ +\(y:[8]) -> (y * 2) == (y << 1) +~~~~ + +Interpreting this as a rewrite rule, it says that for any 8-bit vector +(call it `y` for now), we can replace `y * 2` with `y << 1`. Using this +rule to rewrite the earlier expression would then yield: + +~~~~ + \(x:[8]) -> (x << 1) + 1 +~~~~ + +The general philosophy of rewriting is that the left and right patterns, +while syntactically different, should be semantically equivalent. +Therefore, applying a set of rewrite rules should not change the +fundamental meaning of the term being rewritten. SAW is particularly +focused on the task of proving that some logical statement expressed as +a `Term` is always true. If that is in fact the case, then the entire +term can be replaced by the term `True` without changing its meaning. The +rewriting process can in some cases, by repeatedly applying rules that +themselves are known to be valid, reduce a complex term entirely to +`True`, which constitutes a proof of the original statement. In other +cases, rewriting can simplify terms before sending them to external +automated provers that can then finish the job. Sometimes this +simplification can help the automated provers run more quickly, and +sometimes it can help them prove things they would otherwise be unable +to prove by applying reasoning steps (rewrite rules) that are not +available to the automated provers. + +In practical use, rewrite rules can be aggregated into `Simpset` +values in SAWScript. A few pre-defined `Simpset` values exist: + +* `empty_ss : Simpset` is the empty set of rules. Rewriting with it +should have no effect, but it is useful as an argument to some of the +functions that construct larger `Simpset` values. + +* `basic_ss : Simpset` is a collection of rules that are useful in most +proof scripts. + +* `cryptol_ss : () -> Simpset` includes a collection of Cryptol-specific +rules. Some of these simplify away the abstractions introduced in the +translation from Cryptol to SAWCore, which can be useful when proving +equivalence between Cryptol and non-Cryptol code. Leaving these +abstractions in place is appropriate when comparing only Cryptol code, +however, so `cryptol_ss` is not included in `basic_ss`. + +The next set of functions can extend or apply a `Simpset`: + +* `addsimp' : Term -> Simpset -> Simpset` adds a single `Term` to an +existing `Simpset. + +* `addsimps' : [Term] -> Simpset -> Simpset` adds a list of `Term`s to +an existing `Simpset`. + +* `rewrite : Simpset -> Term -> Term` applies a `Simpset` to an existing +`Term` to produce a new `Term`. + +To make this more concrete, we examine how the rewriting example +sketched above, to convert multiplication into shift, can work in +practice. We simplify everything with `cryptol_ss` as we go along so +that the `Term`s don't get too cluttered. First, we declare the term +to be transformed: + +~~~~ +sawscript> let term = rewrite (cryptol_ss ()) {{ \(x:[8]) -> (x * 2) + 1 }} +sawscript> print_term term +\(x : Prelude.Vec 8 Prelude.Bool) -> + Prelude.bvAdd 8 (Prelude.bvMul 8 x (Prelude.bvNat 8 2)) + (Prelude.bvNat 8 1) +~~~~ + +Next, we declare the rewrite rule: + +~~~~ +sawscript> let rule = rewrite (cryptol_ss ()) {{ \(y:[8]) -> (y * 2) == (y << 1) }} +sawscript> print_term rule +let { x@1 = Prelude.Vec 8 Prelude.Bool + } + in \(y : x@1) -> + Cryptol.ecEq x@1 (Cryptol.PCmpWord 8) + (Prelude.bvMul 8 y (Prelude.bvNat 8 2)) + (Prelude.bvShiftL 8 Prelude.Bool 1 Prelude.False y + (Prelude.bvNat 1 1)) +~~~~ + +Finally, we apply the rule to the target term: + +~~~~ +sawscript> let result = rewrite (addsimp' rule empty_ss) term +sawscript> print_term result +\(x : Prelude.Vec 8 Prelude.Bool) -> + Prelude.bvAdd 8 + (Prelude.bvShiftL 8 Prelude.Bool 1 Prelude.False x + (Prelude.bvNat 1 1)) + (Prelude.bvNat 8 1) +~~~~ + +Note that `addsimp'` and `addsimps'` take a `Term` or list of `Term`s; +these could in principle be anything, and are not necessarily terms +representing logically valid equalities. They have `'` suffixes because +they are not intended to be the primary interface to rewriting. When using +these functions, the soundness of the proof process depends on the +correctness of these rules as a side condition. + +The primary interface to rewriting uses the `Theorem` type instead of +the `Term` type, as shown in the signatures for `addsimp` and +`addsimps`. + +* `addsimp : Theorem -> Simpset -> Simpset` adds a single `Theorem` to a +`Simpset`. + +* `addsimps : [Theorem] -> Simpset -> Simpset` adds several `Theorem` +values to a `Simpset`. + +A `Theorem` is essentially a `Term` that is proven correct in some way. +In general, a `Theorem` can be any statement, and may not be useful as a +rewrite rule. However, if it has an appropriate shape it can be used for +rewriting. In the ["Proofs about Terms"](#proofs-about-terms) section, +we'll describe how to construct `Theorem` values from `Term` values. + +In the absence of user-constructed `Theorem` values, there are some +additional built-in rules that are not included in either `basic_ss` and +`cryptol_ss` because they are not always beneficial, but that can +sometimes be helpful or essential. The `cryptol_ss` simpset includes +rewrite rules to unfold all definitions in the `Cryptol` SAWCore module, +but does not include any of the terms of equality type. + +* `add_cryptol_defs : `[String] -> Simpset -> Simpset` adds unfolding +rules for functions with the given names from the SAWCore `Cryptol` module +to the given `Simpset`. + +* `add_cryptol_eqs : [String] -> Simpset -> Simpset` adds the terms of +equality type with the given names from the SAWCore `Cryptol` module to +the given `Simpset`. + +* `add_prelude_defs : [String] -> Simpset -> Simpset` adds unfolding +rules from the SAWCore `Prelude` module to a `Simpset`. + +* `add_prelude_eqs : [String] -> Simpset -> Simpset` adds equality-typed +terms from the SAWCore `Prelude` module to a `Simpset`. + +Finally, it's possible to construct a theorem from an arbitrary SAWCore +expression (rather than a Cryptol expression), using the `core_axiom` +function. + +* `core_axiom : String -> Theorem` creates a `Theorem` from a `String` +in SAWCore syntax. Any `Theorem` introduced by this function is assumed +to be correct, so use it with caution. + +## Folding and Unfolding + +A SAWCore term can be given a name using the `define` function, and is +then by default printed as that name alone. A named subterm can be +"unfolded" so that the original definition appears again. + +* `define : String -> Term -> TopLevel Term` + +* `unfold_term : [String] -> Term -> Term` + +For example: + +~~~~ +sawscript> let t = {{ 0x22 }} +sawscript> print_term t +Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) + (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) +sawscript> t' <- define "t" t +sawscript> print_term t' +t +sawscript> let t'' = unfold_term ["t"] t' +sawscript> print_term t'' +Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) + (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) +~~~~ + +This process of folding and unfolding is useful both to make large terms +easier for humans to work with and to make automated proofs more +tractable. We'll describe the latter in more detail when we discuss +interacting with external provers. + +In some cases, folding happens automatically when constructing Cryptol +expressions. Consider the following example: + +~~~~ +sawscript> let t = {{ 0x22 }} +sawscript> print_term t +Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) + (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) +sawscript> let {{ t' = 0x22 }} +sawscript> print_term {{ t' }} +t' +~~~~ + +This illustrates that a bare expression in Cryptol braces gets +translated directly to a SAWCore term. However, a Cryptol *definition* +gets translated into a *folded* SAWCore term. In addition, because the +second definition of `t` occurs at the Cryptol level, rather than the +SAWScript level, it is visible only inside Cryptol braces. Definitions +imported from Cryptol source files are also initially folded and can be +unfolded as needed. + +## Other Built-in Transformation and Inspection Functions + +In addition to the `Term` transformation functions described so far, a +variety of others also exist. + +* `beta_reduce_term : Term -> Term` takes any sub-expression of the form +`(\x -> t) v` in the given `Term` and replaces it with a transformed +version of `t` in which all instances of `x` are replaced by `v`. + +* `replace : Term -> Term -> Term -> TopLevel Term` replaces arbitrary +subterms. A call to `replace x y t` replaces any instance of `x` inside +`t` with `y`. + +Assessing the size of a term can be particularly useful during benchmarking. +SAWScript provides two mechanisms for this. + +* `term_size : Term -> Int` calculates the number of nodes in the +Directed Acyclic Graph (DAG) representation of a `Term` used internally +by SAW. This is the most appropriate way of determining the resource use +of a particular term. + +* `term_tree_size : Term -> Int` calculates how large a `Term` would be +if it were represented by a tree instead of a DAG. This can, in general, +be much, much larger than the number returned by `term_size`, and serves +primarily as a way of assessing, for a specific term, how much benefit +there is to the term sharing used by the DAG representation. + +Finally, there are a few commands related to the internal SAWCore type of a +`Term`. + +* `check_term : Term -> TopLevel ()` checks that the internal structure +of a `Term` is well-formed and that it passes all of the rules of the +SAWCore type checker. + +* `type : Term -> Type` returns the type of a particular `Term`, which +can then be used to, for example, construct a new fresh variable with +`fresh_symbolic`. + +## Loading and Storing Terms + +Most frequently, `Term` values in SAWScript come from Cryptol, JVM, or +LLVM programs, or some transformation thereof. However, it is also +possible to obtain them from various other sources. + +* `parse_core : String -> Term` parses a `String` containing a term in +SAWCore syntax, returning a `Term`. + +* `read_core : String -> TopLevel Term` is like `parse_core`, but +obtains the text from the given file and expects it to be in the simpler +SAWCore external representation format, rather than the human-readable +syntax shown so far. + +* `read_aig : String -> TopLevel Term` returns a `Term` representation +of an And-Inverter-Graph (AIG) file in AIGER format. + +* `read_bytes : String -> TopLevel Term` reads a constant sequence of +bytes from a file and represents it as a `Term`. Its result will always +have Cryptol type `[n][8]` for some `n`. + +It is also possible to write `Term` values into files in various +formats, including: AIGER (`write_aig`), CNF (`write_cnf`), SAWCore +external representation (`write_core`), and SMT-Lib version 2 +(`write_smtlib2`). + +* `write_aig : String -> Term -> TopLevel ()` + +* `write_cnf : String -> Term -> TopLevel ()` + +* `write_core : String -> Term -> TopLevel ()` + +* `write_smtlib2 : String -> Term -> TopLevel ()` From d4d64118227489b2313bff8cff1b8bfc36ee87df Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 19:38:18 -0800 Subject: [PATCH 19/67] manual: Correct minor errors in Markdown. - Invalid whitespace around headings / code blocks - Bare URLs - Incorrect emphasis notation (** instead of __) - Invalid links to other pages/sections --- .../analyzing-hardware-circuits-using-yosys.md | 8 ++++++++ .../extraction-to-the-coq-theorem-prover.md | 5 ++--- doc/manual/loading-code.md | 6 +++--- doc/manual/specification-based-verification.md | 18 +++++++++++++----- doc/manual/structure-of-sawscript.md | 4 +++- doc/manual/transforming-term-values.md | 16 ++++++++-------- 6 files changed, 37 insertions(+), 20 deletions(-) diff --git a/doc/manual/analyzing-hardware-circuits-using-yosys.md b/doc/manual/analyzing-hardware-circuits-using-yosys.md index d79e0a1369..8992c1ddc4 100644 --- a/doc/manual/analyzing-hardware-circuits-using-yosys.md +++ b/doc/manual/analyzing-hardware-circuits-using-yosys.md @@ -1,8 +1,10 @@ # Analyzing Hardware Circuits using Yosys + SAW has experimental support for analysis of hardware descriptions written in VHDL ([via GHDL](https://github.com/ghdl/ghdl-yosys-plugin)) through an intermediate representation produced by [Yosys](https://yosyshq.net/yosys/). This generally follows the same conventions and idioms used in the rest of SAWScript. ## Processing VHDL With Yosys + Given a VHDL file `test.vhd` containing an entity `test`, one can generate an intermediate representation `test.json` suitable for loading into SAW: ~~~~ @@ -26,6 +28,7 @@ Yosys is able to convert `$pmux` cells into trees of `$mux` cells using the `pmu We expect there are many other situations where Yosys' considerable library of commands is valuable for pre-processing. ## Example: Ripple-Carry Adder + Consider three VHDL entities. First, a half-adder: @@ -197,12 +200,14 @@ sawscript> full_nocarry_spec <- yosys_verify {{ adderm.full }} [{{\(inp : {a : [ The resulting override `full_nocarry_spec` may still be used in the proof for `add4` (this is accomplished by rewriting to a conditional expression). ## API Reference + N.B: The following commands must first be enabled using `enable_experimental`. * `yosys_import : String -> TopLevel Term` produces a `Term` given the path to a JSON file produced by the Yosys `write_json` command. The resulting term is a Cryptol record, where each field corresponds to one HDL module exported by Yosys. Each HDL module is in turn represented by a function from a record of input port values to a record of output port values. For example, consider a Yosys JSON file derived from the following VHDL entities: + ~~~~vhdl entity half is port ( @@ -223,12 +228,15 @@ N.B: The following commands must first be enabled using `enable_experimental`. ); end full; ~~~~ + The resulting `Term` will have the type: + ~~~~ { half : {a : [1], b : [1]} -> {c : [1], s : [1]} , full : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} } ~~~~ + * `yosys_verify : Term -> [Term] -> Term -> [YosysTheorem] -> ProofScript () -> TopLevel YosysTheorem` proves equality between an HDL module and a specification. The first parameter is the HDL module - given a record `m` from `yosys_import`, this will typically look something like `{{ m.foo }}`. The second parameter is a list of preconditions for the equality. diff --git a/doc/manual/extraction-to-the-coq-theorem-prover.md b/doc/manual/extraction-to-the-coq-theorem-prover.md index 48a6f8e98f..bfd39a3876 100644 --- a/doc/manual/extraction-to-the-coq-theorem-prover.md +++ b/doc/manual/extraction-to-the-coq-theorem-prover.md @@ -213,6 +213,5 @@ work out. However, if Coq typechecking of generated code fails with errors about `Inhabited` class instances, it likely represents some problem with this aspect of the translation. - -[^5]: https://coq.inria.fr -[^6]: https://github.com/mit-plv/fiat-crypto +[^5]: +[^6]: diff --git a/doc/manual/loading-code.md b/doc/manual/loading-code.md index 6672871e14..ba0f232c69 100644 --- a/doc/manual/loading-code.md +++ b/doc/manual/loading-code.md @@ -113,7 +113,7 @@ behavior, and SAW currently does not have built in support for these functions (though you could manually create overrides for them in a verification script). -[^1]: https://clang.llvm.org/docs/UsersManual.html#controlling-code-generation +[^1]: ### Compiling Java @@ -248,5 +248,5 @@ Finally, there is no support for calling constructors in specifications, so you will need to construct objects piece-by-piece using, *e.g.*, `llvm_alloc` and `llvm_points_to`. -[^2]: https://libcxx.llvm.org/docs/BuildingLibcxx.html -[^3]: https://github.com/travitch/whole-program-llvm +[^2]: +[^3]: diff --git a/doc/manual/specification-based-verification.md b/doc/manual/specification-based-verification.md index dc7f09da38..201d113f91 100644 --- a/doc/manual/specification-based-verification.md +++ b/doc/manual/specification-based-verification.md @@ -806,7 +806,7 @@ such as those that are intended to initialize data structures (writing to the memory pointed to, but never reading from it), this sort of uninitialized memory is appropriate. In most cases, however, it's more useful to state that a pointer points to some specific (usually symbolic) value, which you can do with -the *points-to* family of commands. +the _points-to_ family of commands. ### LLVM heap values @@ -819,7 +819,7 @@ value given in the second argument (which may be any type of `SetupValue`). When used in the final state, `llvm_points_to` specifies that the -given pointer *should* point to the given value when the function +given pointer _should_ point to the given value when the function finishes. Occasionally, because C programs frequently reinterpret memory of one @@ -942,7 +942,6 @@ type information with information contained in debug symbols is a bit heuristic. If `llvm_union` cannot figure out how to cast a pointer, one can fall back on the more manual `llvm_cast_pointer` instead. - In the experimental Java verification implementation, the following functions can be used to state the equivalent of a combination of `llvm_points_to` and either `llvm_elem` or `llvm_field`. @@ -1186,6 +1185,7 @@ would panic: let s: &str = &rosu[0..3]; println!("{:?}", s); ~~~ + ~~~ thread 'main' panicked at 'byte index 3 is not a char boundary; it is inside 'ș' (bytes 2..4) of `roșu`' ~~~ @@ -1281,6 +1281,7 @@ pub fn s(x: u32) -> Option { Some(x) } ~~~~ + ~~~~ m <- mir_load_module "example.linked-mir.json"; @@ -1537,7 +1538,7 @@ References to static values can be initialized with the `mir_points_to` command, just like with other forms of references. Immutable static items (e.g., `static X: u8 = 42`) are initialized implicitly in every SAW specification, so there is no need for users to do so manually. Mutable static -items (e.g., `static mut Y: u8 = 27`), on the other hand, are *not* initialized +items (e.g., `static mut Y: u8 = 27`), on the other hand, are _not_ initialized implicitly, and users must explicitly pick a value to initialize them with. The `mir_static_initializer` function can be used to access the initial value @@ -2038,7 +2039,7 @@ let main : TopLevel () = do { }; ~~~~ -[^4]: https://en.wikipedia.org/wiki/Salsa20 +[^4]: ## Verifying Cryptol FFI functions @@ -2054,6 +2055,7 @@ generate a `LLVMSetup ()` spec directly from the type of a Cryptol `foreign` function. This is done with the `llvm_ffi_setup` command, which is experimental and requires `enable_experimental;` to be run beforehand. + ``` llvm_ffi_setup : Term -> LLVMSetup () ``` @@ -2061,10 +2063,13 @@ llvm_ffi_setup : Term -> LLVMSetup () For instance, for the simple imported Cryptol foreign function `foreign add : [32] -> [32] -> [32]` we can obtain a `LLVMSetup` spec simply by writing + ``` let add_setup = llvm_ffi_setup {{ add }}; ``` + which behind the scenes expands to something like + ``` let add_setup = do { in0 <- llvm_fresh_var "in0" (llvm_int 32); @@ -2086,9 +2091,11 @@ resulting term is monomorphic. The user can then define a parameterized specification simply as a SAWScript function in the usual way. For example, for a function `foreign f : {n, m} (fin n, fin m) => [n][32] -> [m][32]`, we can obtain a parameterized `LLVMSetup` spec by + ``` let f_setup (n : Int) (m : Int) = llvm_ffi_setup {{ f`{n, m} }}; ``` + Note that the `Term` parameter that `llvm_ffi_setup` takes is restricted syntactically to the format described above (``{{ fun`{tyArg0, tyArg1, ..., tyArgN} }}``), and cannot be any arbitrary term. @@ -2112,6 +2119,7 @@ The resulting `LLVMSetup ()` spec can be used with the existing `llvm_verify` function to perform the actual verification. And the `LLVMSpec` output from that can be used as an override as usual for further compositional verification. + ``` f_ov <- llvm_verify mod "f" [] true (f_setup 3 5) z3; ``` diff --git a/doc/manual/structure-of-sawscript.md b/doc/manual/structure-of-sawscript.md index 33bee7c8fe..9216dd16e7 100644 --- a/doc/manual/structure-of-sawscript.md +++ b/doc/manual/structure-of-sawscript.md @@ -386,6 +386,7 @@ aliases, including those that are built in. * `:type` or `:t` checks and prints the type of an arbitrary SAWScript expression: + ~~~~ sawscript> :t show {a.0} a.0 -> String @@ -393,6 +394,7 @@ sawscript> :t show * `:help` or `:h` prints the help text for a built-in function or command: + ~~~~ sawscript> :h show Description @@ -422,7 +424,7 @@ command. Other primitives are considered deprecated. Some of these, as the -[deprecation process](#formal-deprecation-process) proceeds, are +[deprecation process](formal-deprecation-process.md) proceeds, are unavailable by default. They can be made visible with the `enable_deprecated` command. diff --git a/doc/manual/transforming-term-values.md b/doc/manual/transforming-term-values.md index 2dcfab330c..b2cdc43334 100644 --- a/doc/manual/transforming-term-values.md +++ b/doc/manual/transforming-term-values.md @@ -1,7 +1,7 @@ # Transforming Term Values -The three primary functions of SAW are *extracting* models (`Term` -values) from programs, *transforming* those models, and *proving* +The three primary functions of SAW are _extracting_ models (`Term` +values) from programs, _transforming_ those models, and _proving_ properties about models using external provers. So far we've shown how to construct `Term` values from Cryptol programs; later sections will describe how to extract them from other programs. Now we show how @@ -9,7 +9,7 @@ to use the various term transformation features available in SAW. ## Rewriting -Rewriting a `Term` consists of applying one or more *rewrite rules* to +Rewriting a `Term` consists of applying one or more _rewrite rules_ to it, resulting in a new `Term`. A rewrite rule in SAW can be specified in multiple ways: @@ -22,7 +22,7 @@ multiple ways: In each case the term logically consists of two sides and describes a way to transform the left side into the right side. Each side may contain variables (bound by enclosing lambda expressions) and is -therefore a *pattern* which can match any term in which each variable +therefore a _pattern_ which can match any term in which each variable represents an arbitrary sub-term. The left-hand pattern describes a term to match (which may be a sub-term of the full term being rewritten), and the right-hand pattern describes a term to replace it with. Any variable @@ -157,7 +157,7 @@ values to a `Simpset`. A `Theorem` is essentially a `Term` that is proven correct in some way. In general, a `Theorem` can be any statement, and may not be useful as a rewrite rule. However, if it has an appropriate shape it can be used for -rewriting. In the ["Proofs about Terms"](#proofs-about-terms) section, +rewriting. In the ["Proofs about Terms"](proofs-about-terms.md) section, we'll describe how to construct `Theorem` values from `Term` values. In the absence of user-constructed `Theorem` values, there are some @@ -167,7 +167,7 @@ sometimes be helpful or essential. The `cryptol_ss` simpset includes rewrite rules to unfold all definitions in the `Cryptol` SAWCore module, but does not include any of the terms of equality type. -* `add_cryptol_defs : `[String] -> Simpset -> Simpset` adds unfolding +* `add_cryptol_defs : [String] -> Simpset -> Simpset` adds unfolding rules for functions with the given names from the SAWCore `Cryptol` module to the given `Simpset`. @@ -234,8 +234,8 @@ t' ~~~~ This illustrates that a bare expression in Cryptol braces gets -translated directly to a SAWCore term. However, a Cryptol *definition* -gets translated into a *folded* SAWCore term. In addition, because the +translated directly to a SAWCore term. However, a Cryptol _definition_ +gets translated into a _folded_ SAWCore term. In addition, because the second definition of `t` occurs at the Cryptol level, rather than the SAWScript level, it is visible only inside Cryptol braces. Definitions imported from Cryptol source files are also initially folded and can be From a416bc95fb2b2920aaaba5665a65f5253929479a Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 21:07:51 -0800 Subject: [PATCH 20/67] manual: Further normalize Markdown. - Code blocks (::: fences) - __ for emphasis instead of ** - '-' instead of '*' for unordered lists - Unordered -> Ordered (and vice versa) where appropriate - Fix broken link(s) --- ...analyzing-hardware-circuits-using-yosys.md | 64 +- doc/manual/bisimulation-prover.md | 96 +-- doc/manual/creating-symbolic-variables.md | 38 +- doc/manual/cryptol-and-its-role-in-saw.md | 71 +- doc/manual/direct-extraction.md | 6 +- .../extraction-to-the-coq-theorem-prover.md | 16 +- doc/manual/loading-code.md | 64 +- doc/manual/proofs-about-terms.md | 132 ++-- .../specification-based-verification.md | 643 +++++++++--------- doc/manual/structure-of-sawscript.md | 155 ++--- doc/manual/symbolic-execution.md | 34 +- doc/manual/symbolic-termination.md | 12 +- doc/manual/transforming-term-values.md | 96 +-- 13 files changed, 708 insertions(+), 719 deletions(-) diff --git a/doc/manual/analyzing-hardware-circuits-using-yosys.md b/doc/manual/analyzing-hardware-circuits-using-yosys.md index 8992c1ddc4..288197aae3 100644 --- a/doc/manual/analyzing-hardware-circuits-using-yosys.md +++ b/doc/manual/analyzing-hardware-circuits-using-yosys.md @@ -7,7 +7,7 @@ This generally follows the same conventions and idioms used in the rest of SAWSc Given a VHDL file `test.vhd` containing an entity `test`, one can generate an intermediate representation `test.json` suitable for loading into SAW: -~~~~ +:::{code-block} console $ ghdl -a test.vhd $ yosys ... @@ -20,7 +20,7 @@ Importing module test. yosys> write_json test.json 2. Executing JSON backend. -~~~~ +::: It can sometimes be helpful to invoke additional Yosys passes between the `ghdl` and `write_json` commands. For example, at present SAW does not support the `$pmux` cell type. @@ -32,7 +32,7 @@ We expect there are many other situations where Yosys' considerable library of c Consider three VHDL entities. First, a half-adder: -~~~~vhdl +:::{code-block} vhdl library ieee; use ieee.std_logic_1164.all; @@ -50,11 +50,11 @@ begin c <= a and b; s <= a xor b; end halfarch; -~~~~ +::: Next, a one-bit adder built atop that half-adder: -~~~~vhdl +:::{code-block} vhdl library ieee; use ieee.std_logic_1164.all; @@ -77,11 +77,11 @@ begin half1 : entity work.half port map (a => half0s, b => cin, c => half1c, s => s); cout <= half0c or half1c; end fullarch; -~~~~ +::: Finally, a four-bit adder: -~~~~vhdl +:::{code-block} vhdl library ieee; use ieee.std_logic_1164.all; @@ -104,19 +104,19 @@ begin full2 : entity work.full port map (a => a(2), b => b(2), cin => full1cout, cout => full2cout, s => res(2)); full3 : entity work.full port map (a => a(3), b => b(3), cin => full2cout, cout => ignore, s => res(3)); end add4arch; -~~~~ +::: Using GHDL and Yosys, we can convert the VHDL source above into a format that SAW can import. If all of the code above is in a file `adder.vhd`, we can run the following commands: -~~~~ +:::{code-block} console $ ghdl -a adder.vhd $ yosys -p 'ghdl add4; write_json adder.json' -~~~~ +::: The produced file `adder.json` can then be loaded into SAW with `yosys_import`: -~~~~ +:::{code-block} console $ saw ... sawscript> enable_experimental @@ -127,29 +127,29 @@ sawscript> type m [23:57:14.492] {add4 : {a : [4], b : [4]} -> {res : [4]}, full : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]}, half : {a : [1], b : [1]} -> {c : [1], s : [1]}} -~~~~ +::: `yosys_import` returns a `Term` with a Cryptol record type, where the fields correspond to each VHDL module. We can access the fields of this record like we would any Cryptol record, and call the functions within like any Cryptol function. -~~~~ +:::{code-block} console sawscript> type {{ m.add4 }} [00:00:25.255] {a : [4], b : [4]} -> {res : [4]} sawscript> eval_int {{ (m.add4 { a = 1, b = 2 }).res }} [00:02:07.329] 3 -~~~~ +::: We can also use all of SAW's infrastructure for asking solvers about `Term`s, such as the `sat` and `prove` commands. For example: -~~~~ +:::{code-block} console sawscript> sat w4 {{ m.add4 === \_ -> { res = 5 } }} [00:04:41.993] Sat: [_ = (5, 0)] sawscript> prove z3 {{ m.add4 === \inp -> { res = inp.a + inp.b } }} [00:05:43.659] Valid sawscript> prove yices {{ m.add4 === \inp -> { res = inp.a - inp.b } }} [00:05:56.171] Invalid: [_ = (8, 13)] -~~~~ +::: The full library of `ProofScript` tactics is available in this setting. If necessary, proof tactics like `simplify` can be used to rewrite goals before querying a solver. @@ -158,44 +158,44 @@ Special support is provided for the common case of equivalence proofs between HD The command `yosys_verify` has an interface similar to `llvm_verify`: given a specification, some lemmas, and a proof tactic, it produces evidence of a proven equivalence that may be passed as a lemma to future calls of `yosys_verify`. For example, consider the following Cryptol specifications for one-bit and four-bit adders: -~~~~cryptol +:::{code-block} cryptol cryfull : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} cryfull inp = { cout = [cout], s = [s] } where [cout, s] = zext inp.a + zext inp.b + zext inp.cin cryadd4 : {a : [4], b : [4]} -> {res : [4]} cryadd4 inp = { res = inp.a + inp.b } -~~~~ +::: We can prove equivalence between `cryfull` and the VHDL `full` module: -~~~~ +:::{code-block} console sawscript> full_spec <- yosys_verify {{ m.full }} [] {{ cryfull }} [] w4; -~~~~ +::: The result `full_spec` can then be used as an "override" when proving equivalence between `cryadd4` and the VHDL `add4` module: -~~~~ +:::{code-block} console sawscript> add4_spec <- yosys_verify {{ m.add4 }} [] {{ cryadd4 }} [full_spec] w4; -~~~~ +::: The above could also be accomplished through the use of `prove_print` and term rewriting, but it is much more verbose. `yosys_verify` may also be given a list of preconditions under which the equivalence holds. For example, consider the following Cryptol specification for `full` that ignores the `cin` bit: -~~~~cryptol +:::{code-block} cryptol cryfullnocarry : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} cryfullnocarry inp = { cout = [cout], s = [s] } where [cout, s] = zext inp.a + zext inp.b -~~~~ +::: This is not equivalent to `full` in general, but it is if constrained to inputs where `cin = 0`. We may express that precondition like so: -~~~~ +:::{code-block} console sawscript> full_nocarry_spec <- yosys_verify {{ adderm.full }} [{{\(inp : {a : [1], b : [1], cin : [1]}) -> inp.cin == 0}}] {{ cryfullnocarry }} [] w4; -~~~~ +::: The resulting override `full_nocarry_spec` may still be used in the proof for `add4` (this is accomplished by rewriting to a conditional expression). @@ -203,12 +203,12 @@ The resulting override `full_nocarry_spec` may still be used in the proof for `a N.B: The following commands must first be enabled using `enable_experimental`. -* `yosys_import : String -> TopLevel Term` produces a `Term` given the path to a JSON file produced by the Yosys `write_json` command. +- `yosys_import : String -> TopLevel Term` produces a `Term` given the path to a JSON file produced by the Yosys `write_json` command. The resulting term is a Cryptol record, where each field corresponds to one HDL module exported by Yosys. Each HDL module is in turn represented by a function from a record of input port values to a record of output port values. For example, consider a Yosys JSON file derived from the following VHDL entities: - ~~~~vhdl + :::{code-block} vhdl entity half is port ( a : in std_logic; @@ -227,17 +227,17 @@ N.B: The following commands must first be enabled using `enable_experimental`. s : out std_logic ); end full; - ~~~~ + ::: The resulting `Term` will have the type: - ~~~~ + :::{code-block} cryptol { half : {a : [1], b : [1]} -> {c : [1], s : [1]} , full : {a : [1], b : [1], cin : [1]} -> {cout : [1], s : [1]} } - ~~~~ + ::: -* `yosys_verify : Term -> [Term] -> Term -> [YosysTheorem] -> ProofScript () -> TopLevel YosysTheorem` proves equality between an HDL module and a specification. +- `yosys_verify : Term -> [Term] -> Term -> [YosysTheorem] -> ProofScript () -> TopLevel YosysTheorem` proves equality between an HDL module and a specification. The first parameter is the HDL module - given a record `m` from `yosys_import`, this will typically look something like `{{ m.foo }}`. The second parameter is a list of preconditions for the equality. The third parameter is the specification, a term of the same type as the HDL module, which will typically be some Cryptol function or another HDL module. diff --git a/doc/manual/bisimulation-prover.md b/doc/manual/bisimulation-prover.md index 0a9581f782..e5d8c931b1 100644 --- a/doc/manual/bisimulation-prover.md +++ b/doc/manual/bisimulation-prover.md @@ -7,9 +7,9 @@ proof is useful in demonstrating the eventual equivalence of two circuits, or of a circuit and a functional specification. SAW enables these proofs with the experimental `prove_bisim` command: -~~~~ +:::{code-block} sawscript prove_bisim : ProofScript () -> [BisimTheorem] -> Term -> Term -> Term -> Term -> TopLevel BisimTheorem -~~~~ +::: When invoking `prove_bisim strat theorems srel orel lhs rhs`, the arguments represent the following: @@ -49,9 +49,9 @@ of an AND gate that makes use of internal state and takes two cycles to complete is equivalent to a pure function that computes the logical AND of its inputs in one cycle. First, we define the implementation's state type: -~~~~ +:::{code-block} cryptol type andState = { loaded : Bit, origX : Bit, origY : Bit } -~~~~ +::: `andState` is a record type with three fields: @@ -62,13 +62,13 @@ type andState = { loaded : Bit, origX : Bit, origY : Bit } Now, we define the AND gate's implementation: -~~~~ +:::{code-block} cryptol andImp : (andState, (Bit, Bit)) -> (andState, (Bit, Bit)) andImp (s, (x, y)) = if s.loaded /\ x == s.origX /\ y == s.origY then (s, (True, s.origX && s.origY)) else ({ loaded = True, origX = x, origY = y }, (False, 0)) -~~~~ +::: `andImp` takes a tuple as input where the first field is an `andState` holding the gate's internal state, and second field is a tuple containing the inputs to @@ -91,10 +91,10 @@ computation (even if the inputs change between the first and second cycles). Next, we define the pure function we'd like to prove `andImp` bisimilar to: -~~~~ +:::{code-block} cryptol andSpec : ((), (Bit, Bit)) -> ((), (Bit, Bit)) andSpec (_, (x, y)) = ((), (True, x && y)) -~~~~ +::: `andSpec` takes a tuple as input where the first field is `()`, indicating that `andSpec` is a pure function without internal state, and the second field is a @@ -110,10 +110,10 @@ It computes the logical AND directly on the function's inputs using Cryptol's Next, we define a state relation over `andImp` and `andSpec`: -~~~~ +:::{code-block} cryptol andStateRel : andState -> () -> Bit andStateRel _ () = True -~~~~ +::: `andStateRel` takes two arguments: @@ -126,11 +126,11 @@ and therefore the state relation permits `andImp` to accept any state. Lastly, we define a relation over `andImp` and `andSpec`: -~~~~ +:::{code-block} cryptol andOutputRel : (andState, (Bit, Bit)) -> ((), (Bit, Bit)) -> Bit andOutputRel (s, (impReady, impO)) ((), (_, specO)) = if impReady then impO == specO else True -~~~~ +::: `andOutputRel` takes two arguments: @@ -153,18 +153,18 @@ Put another way, the relation is satisfied if the end result of `andImp` and We can verify that this relation is always satisfied--and therefore the two terms are bisimilar--by using `prove_bisim`: -~~~~ +:::{code-block} sawscript import "And.cry"; enable_experimental; and_bisim <- prove_bisim z3 [] {{ andStateRel }} {{ andOutputRel }} {{ andImp }} {{ andSpec }}; -~~~~ +::: Upon running this script, SAW prints: -~~~~ +:::{code-block} console Successfully proved bisimulation between andImp and andSpec -~~~~ +::: ### Building a NAND gate @@ -173,19 +173,19 @@ gate. We first define a state type for the NAND gate implementation that contains `andImp`'s state. This NAND gate will not need any additional state, so we will define a type `nandState` that is equal to `andState`: -~~~~ +:::{code-block} cryptol type nandState = andState -~~~~ +::: Now, we define an implementation `nandImp` that calls `andImp` and negates the result: -~~~~ +:::{code-block} cryptol nandImp : (nandState, (Bit, Bit)) -> (nandState, (Bit, Bit)) nandImp x = (s, (andReady, ~andRes)) where (s, (andReady, andRes)) = andImp x -~~~~ +::: Note that `nandImp` is careful to preserve the ready status of `andImp`. Because `nandImp` relies on `andImp`, it also takes two cycles to compute the @@ -193,20 +193,20 @@ logical NAND of its inputs. Next, we define a specification `nandSpec` in terms of `andSpec`: -~~~~ +:::{code-block} cryptol nandSpec : ((), (Bit, Bit)) -> ((), (Bit, Bit)) nandSpec (_, (x, y)) = ((), (True, ~ (andSpec ((), (x, y))).1.1)) -~~~~ +::: As with `andSpec`, `nandSpec` is pure and computes its result in a single cycle. Next, we define a state relation over `nandImp` and `nandSpec`: -~~~~ +:::{code-block} cryptol nandStateRel : andState -> () -> Bit nandStateRel _ () = True -~~~~ +::: As with `andStateRel`, this state relation is always `True` because `nandSpec` is stateless. @@ -214,25 +214,25 @@ is stateless. Lastly, we define an output relation indicating that `nandImp` and `nandSpec` produce equivalent results once `nandImp`'s ready bit is `1`: -~~~~ +:::{code-block} cryptol nandOutputRel : (nandState, (Bit, Bit)) -> ((), (Bit, Bit)) -> Bit nandOutputRel (s, (impReady, impO)) ((), (_, specO)) = if impReady then impO == specO else True -~~~~ +::: To prove that `nandImp` and `nandSpec` are bisimilar, we again use `prove_bisim`. This time however, we can reuse the bisimulation proof for the AND gate by including it in the `theorems` paramter for `prove_bisim`: -~~~~ +:::{code-block} sawscript prove_bisim z3 [and_bisim] {{ nandStateRel }} {{ nandOutputRel }} {{ nandImp }} {{ nandSpec }}; -~~~~ +::: Upon running this script, SAW prints: -~~~~ +:::{code-block} console Successfully proved bisimulation between nandImp and nandSpec -~~~~ +::: ## Understanding the proof goals @@ -240,7 +240,7 @@ While not necessary for simple proofs, more advanced proofs may require inspecting proof goals. `prove_bisim` generates and attempts to solve the following proof goals: -~~~~ +:::{code-block} text OUTPUT RELATION THEOREM: forall s1 s2 in. srel s1 s2 -> orel (lhs (s1, in)) (rhs (s2, in)) @@ -248,15 +248,15 @@ OUTPUT RELATION THEOREM: STATE RELATION THEOREM: forall s1 s2 out1 out2. orel (s1, out1) (s2, out2) -> srel s1 s2 -~~~~ +::: where the variables in the `forall`s are: -* `s1`: Initial state for `lhs` -* `s2`: Initial state for `rhs` -* `in`: Input value to `lhs` and `rhs` -* `out1`: Initial output value for `lhs` -* `out2`: Initial output value for `rhs` +- `s1`: Initial state for `lhs` +- `s2`: Initial state for `rhs` +- `in`: Input value to `lhs` and `rhs` +- `out1`: Initial output value for `lhs` +- `out2`: Initial output value for `rhs` The `STATE RELATION THEOREM` verifies that the output relation properly captures the guarantees of the state relation. The `OUTPUT RELATION THEOREM` verifies @@ -268,30 +268,30 @@ When using composition, `prove_bisim` also generates and attempts to solve the proof goal below for any successfully applied `BisimTheorem` in the `theorems` list: -~~~~ +:::{code-block} text COMPOSITION SIDE CONDITION: forall g_lhs_s g_rhs_s. g_srel g_lhs_s g_rhs_s -> f_srel f_lhs_s f_rhs_s where f_lhs_s = extract_inner_state g_lhs g_lhs_s f_lhs f_rhs_s = extract_inner_state g_rhs g_rhs_s f_rhs -~~~~ +::: where `g_lhs` is an outer term containing a call to an inner term `f_lhs` represented by a `BisimTheorem` and `g_rhs` is an outer term containing a call to an inner term `f_rhs` represented by the same `BisimTheorem`. The variables in `COMPOSITION SIDE CONDITION` are: -* `extract_inner_state x x_s y`: A helper function that takes an outer term `x`, an +- `extract_inner_state x x_s y`: A helper function that takes an outer term `x`, an outer state `x_s`, and an inner term `y`, and returns the inner state of `x_s` that `x` passes to `y`. -* `g_lhs_s`: The state for `g_lhs` -* `g_rhs_s`: The state for `g_rhs` -* `g_srel`: The state relation for `g_lhs` and `g_rhs` -* `f_srel`: The state relation for `f_lhs` and `f_rhs` -* `f_lhs_s`: The state for `f_lhs`, as represented in `g_lhs_s` (extracted using +- `g_lhs_s`: The state for `g_lhs` +- `g_rhs_s`: The state for `g_rhs` +- `g_srel`: The state relation for `g_lhs` and `g_rhs` +- `f_srel`: The state relation for `f_lhs` and `f_rhs` +- `f_lhs_s`: The state for `f_lhs`, as represented in `g_lhs_s` (extracted using `extract_inner_state`). -* `f_rhs_s`: The state for `f_rhs`, as represented in `g_rhs_s` (extracted using +- `f_rhs_s`: The state for `f_rhs`, as represented in `g_rhs_s` (extracted using `extract_inner_state`). The `COMPOSITION SIDE CONDITION` exists to verify that the terms in the @@ -301,9 +301,9 @@ bisimulation relation properly set up valid states for subterms they contain. For now, the `prove_bisim` command has a couple limitations: -* `lhs` and `rhs` must be named functions. This is because `prove_bisim` uses +- `lhs` and `rhs` must be named functions. This is because `prove_bisim` uses these names to perform substitution when making use of compositionality. -* Each subterm present in the list of bisimulation theorems already +- Each subterm present in the list of bisimulation theorems already proven may be invoked at most once in `lhs` or `rhs`. That is, if some function `g_lhs` calls `f_lhs`, and `prove_bisim` is invoked with a `BisimTheorem` proving that `f_lhs` is bisimilar to `f_rhs`, then `g_lhs` may diff --git a/doc/manual/creating-symbolic-variables.md b/doc/manual/creating-symbolic-variables.md index 8d822ef1fe..0abab7e099 100644 --- a/doc/manual/creating-symbolic-variables.md +++ b/doc/manual/creating-symbolic-variables.md @@ -8,15 +8,15 @@ more complex code, however, it can be necessary (or more natural) to specifically introduce fresh variables and indicate what portions of the program state they correspond to. -* `fresh_symbolic : String -> Type -> TopLevel Term` is responsible for +- `fresh_symbolic : String -> Type -> TopLevel Term` is responsible for creating new variables in this context. The first argument is a name used for pretty-printing of terms and counter-examples. In many cases it makes sense for this to be the same as the name used within SAWScript, as in the following: -~~~~ +:::{code-block} sawscript x <- fresh_symbolic "x" ty; -~~~~ +::: However, using the same name is not required. @@ -27,23 +27,23 @@ brackets `{|` and `|}`. For example, creating a 32-bit integer, as might be used to represent a Java `int` or an LLVM `i32`, can be done as follows: -~~~~ +:::{code-block} sawscript x <- fresh_symbolic "x" {| [32] |}; -~~~~ +::: Although symbolic execution works best on symbolic variables, which are "unbound" or "free", most of the proof infrastructure within SAW uses -variables that are *bound* by an enclosing lambda expression. Given a +variables that are _bound_ by an enclosing lambda expression. Given a `Term` with free symbolic variables, we can construct a lambda term that binds them in several ways. -* `abstract_symbolic : Term -> Term` finds all symbolic variables in the +- `abstract_symbolic : Term -> Term` finds all symbolic variables in the `Term` and constructs a lambda expression binding each one, in some order. The result is a function of some number of arguments, one for each symbolic variable. It is the simplest but least flexible way to bind symbolic variables. -~~~~ +:::{code-block} console sawscript> x <- fresh_symbolic "x" {| [8] |} sawscript> let t = {{ x + x }} sawscript> print_term t @@ -58,7 +58,7 @@ let { x@1 = Prelude.Vec 8 Prelude.Bool } in \(x : x@1) -> Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x x -~~~~ +::: If there are multiple symbolic variables in the `Term` passed to `abstract_symbolic`, the ordering of parameters can be hard to predict. @@ -66,26 +66,26 @@ In some cases (such as when a proof is the immediate next step, and it's expected to succeed) the order isn't important. In others, it's nice to have more control over the order. -* `lambda : Term -> Term -> Term` is the building block for controlled +- `lambda : Term -> Term -> Term` is the building block for controlled binding. It takes two terms: the one to transform, and the portion of the term to abstract over. Generally, the first `Term` is one obtained from `fresh_symbolic` and the second is a `Term` that would be passed to `abstract_symbolic`. -~~~~ +:::{code-block} console sawscript> let f = lambda x t sawscript> print_term f let { x@1 = Prelude.Vec 8 Prelude.Bool } in \(x : x@1) -> Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x x -~~~~ +::: -* `lambdas : [Term] -> Term -> Term` allows you to list the order in which +- `lambdas : [Term] -> Term -> Term` allows you to list the order in which symbolic variables should be bound. Consider, for example, a `Term` which adds two symbolic variables: -~~~~ +:::{code-block} console sawscript> x1 <- fresh_symbolic "x1" {| [8] |} sawscript> x2 <- fresh_symbolic "x2" {| [8] |} sawscript> let t = {{ x1 + x2 }} @@ -95,11 +95,11 @@ let { x@1 = Prelude.Vec 8 Prelude.Bool in Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x1 x2 -~~~~ +::: We can turn `t` into a function that takes `x1` followed by `x2`: -~~~~ +:::{code-block} console sawscript> let f1 = lambdas [x1, x2] t sawscript> print_term f1 let { x@1 = Prelude.Vec 8 Prelude.Bool @@ -108,11 +108,11 @@ let { x@1 = Prelude.Vec 8 Prelude.Bool \(x2 : x@1) -> Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x1 x2 -~~~~ +::: Or we can turn `t` into a function that takes `x2` followed by `x1`: -~~~~ +:::{code-block} console sawscript> let f1 = lambdas [x2, x1] t sawscript> print_term f1 let { x@1 = Prelude.Vec 8 Prelude.Bool @@ -121,4 +121,4 @@ let { x@1 = Prelude.Vec 8 Prelude.Bool \(x1 : x@1) -> Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool (Cryptol.TCNum 8)) x1 x2 -~~~~ +::: diff --git a/doc/manual/cryptol-and-its-role-in-saw.md b/doc/manual/cryptol-and-its-role-in-saw.md index e4d74b06e7..43aab9df33 100644 --- a/doc/manual/cryptol-and-its-role-in-saw.md +++ b/doc/manual/cryptol-and-its-role-in-saw.md @@ -7,11 +7,8 @@ particularly applicable to describing computations that operate on streams of data of some fixed size. In addition to being integrated into SAW, Cryptol is a standalone -language with its own manual: - -~~~~ -http://cryptol.net/files/ProgrammingCryptol.pdf -~~~~ +language with [its own +manual](http://cryptol.net/files/ProgrammingCryptol.pdf). SAW includes deep support for Cryptol, and in fact requires the use of Cryptol for most non-trivial tasks. To fully understand the rest of @@ -29,20 +26,20 @@ simple example, there is no built-in integer addition operation in SAWScript. However, we can use Cryptol's built-in integer addition operator within SAWScript as follows: -~~~~ +:::{code-block} console sawscript> let t = {{ 0x22 + 0x33 }} sawscript> print t 85 sawscript> :type t Term -~~~~ +::: Although it printed out in the same way as an `Int`, it is important to note that `t` actually has type `Term`. We can see how this term is represented internally, before being evaluated, with the `print_term` function. -~~~~ +:::{code-block} console sawscript> print_term t let { x@1 = Prelude.Vec 8 Prelude.Bool x@2 = Cryptol.TCNum 8 @@ -51,7 +48,7 @@ let { x@1 = Prelude.Vec 8 Prelude.Bool in Cryptol.ecPlus x@1 (Cryptol.PArithSeqBool x@2) (Cryptol.ecNumber (Cryptol.TCNum 34) x@1 x@3) (Cryptol.ecNumber (Cryptol.TCNum 51) x@1 x@3) -~~~~ +::: For the moment, it's not important to understand what this output means. We show it only to clarify that `Term` values have their own internal @@ -66,22 +63,22 @@ is not a command, so it executes directly and does not need `<-` to bind its result. Therefore, the following will have the same result as the `print_term` command above: -~~~~ +:::{code-block} console sawscript> let s = show_term t sawscript> :type s String sawscript> print s -~~~~ +::: Numbers are printed in decimal notation by default when printing terms, but the following two commands can change that behavior. -* `set_ascii : Bool -> TopLevel ()`, when passed `true`, makes +- `set_ascii : Bool -> TopLevel ()`, when passed `true`, makes subsequent `print_term` or `show_term` commands print sequences of bytes as ASCII strings (and doesn't affect printing of anything else). -* `set_base : Int -> TopLevel ()` prints all bit vectors in the given +- `set_base : Int -> TopLevel ()` prints all bit vectors in the given base, which can be between 2 and 36 (inclusive). A `Term` that represents an integer (any bit vector, as affected by @@ -90,7 +87,7 @@ A `Term` that represents an integer (any bit vector, as affected by `Int` if the `Term` can be represented as one, and fails at runtime otherwise. -~~~~ +:::{code-block} console sawscript> print (eval_int t) 85 sawscript> print (eval_int {{ True }}) @@ -99,23 +96,23 @@ sawscript> print (eval_int {{ True }}) eval_int: argument is not a finite bitvector sawscript> print (eval_int {{ [True] }}) 1 -~~~~ +::: Similarly, values of type `Bit` in Cryptol can be translated into values of type `Bool` in SAWScript using the `eval_bool : Term -> Bool` function: -~~~~ +:::{code-block} console sawscript> let b = {{ True }} sawscript> print_term b Prelude.True sawscript> print (eval_bool b) true -~~~~ +::: Anything with sequence type in Cryptol can be translated into a list of `Term` values in SAWScript using the `eval_list : Term -> [Term]` function. -~~~~ +:::{code-block} console sawscript> let l = {{ [0x01, 0x02, 0x03] }} sawscript> print_term l let { x@1 = Prelude.Vec 8 Prelude.Bool @@ -131,13 +128,13 @@ sawscript> print (eval_list l) (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) ,Cryptol.ecNumber (Cryptol.TCNum 3) (Prelude.Vec 8 Prelude.Bool) (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8))] -~~~~ +::: Finally, a list of `Term` values in SAWScript can be collapsed into a single `Term` with sequence type using the `list_term : [Term] -> Term` function, which is the inverse of `eval_list`. -~~~~ +:::{code-block} console sawscript> let ts = eval_list l sawscript> let l = list_term ts sawscript> print_term l @@ -147,22 +144,22 @@ let { x@1 = Prelude.Vec 8 Prelude.Bool in [Cryptol.ecNumber (Cryptol.TCNum 1) x@1 x@2 ,Cryptol.ecNumber (Cryptol.TCNum 2) x@1 x@2 ,Cryptol.ecNumber (Cryptol.TCNum 3) x@1 x@2] -~~~~ +::: In addition to being able to extract integer and Boolean values from Cryptol expressions, `Term` values can be injected into Cryptol expressions. When SAWScript evaluates a Cryptol expression between `{{` and `}}` delimiters, it does so with several extra bindings in scope: -* Any variable in scope that has SAWScript type `Bool` is visible in +- Any variable in scope that has SAWScript type `Bool` is visible in Cryptol expressions as a value of type `Bit`. -* Any variable in scope that has SAWScript type `Int` is visible in - Cryptol expressions as a *type variable*. Type variables can be +- Any variable in scope that has SAWScript type `Int` is visible in + Cryptol expressions as a _type variable_. Type variables can be demoted to numeric bit vector values using the backtick (`` ` ``) operator. -* Any variable in scope that has SAWScript type `Term` is visible in +- Any variable in scope that has SAWScript type `Term` is visible in Cryptol expressions as a value with the Cryptol type corresponding to the internal type of the term. The power of this conversion is that the `Term` does not need to have originally been derived from a @@ -179,7 +176,7 @@ we create a `Term` variable that internally has function type, we can apply it to an argument within a Cryptol expression, but not at the SAWScript level: -~~~~ +:::{code-block} console sawscript> let n = 8 sawscript> :type n Int @@ -191,12 +188,12 @@ sawscript> :type f :1:1-1:2: unbound variable: "f" (:1:1-1:2) sawscript> print {{ f 2 }} 3 -~~~~ +::: If `f` was a binding of a SAWScript variable to a `Term` of function type, we would get a different error: -~~~~ +:::{code-block} console sawscript> let f = {{ \(x : [n]) -> x + 1 }} sawscript> :type {{ f }} Term @@ -209,7 +206,7 @@ sawscript> print (f 2) type mismatch: Int -> t.0 and Term at "_" (REPL) mismatched type constructors: (->) and Term -~~~~ +::: One subtlety of dealing with `Term`s constructed from Cryptol is that because the Cryptol expressions themselves are type checked by the @@ -219,30 +216,30 @@ brackets are evaluated. So type errors at the Cryptol level may occur at runtime from the SAWScript perspective (though they occur before the Cryptol expressions are run). -So far, we have talked about using Cryptol *value* expressions. However, -SAWScript can also work with Cryptol *types*. The most direct way to +So far, we have talked about using Cryptol _value_ expressions. However, +SAWScript can also work with Cryptol _types_. The most direct way to refer to a Cryptol type is to use type brackets: `{|` and `|}`. Any Cryptol type written between these brackets becomes a `Type` value in -SAWScript. Some types in Cryptol are *numeric* (also known as *size*) +SAWScript. Some types in Cryptol are _numeric_ (also known as _size_) types, and correspond to non-negative integers. These can be translated into SAWScript integers with the `eval_size` function. For example: -~~~~ +:::{code-block} console sawscript> let {{ type n = 16 }} sawscript> eval_size {| n |} 16 sawscript> eval_size {| 16 |} 16 -~~~~ +::: For non-numeric types, `eval_size` fails at runtime: -~~~~ +:::{code-block} console sawscript> eval_size {| [16] |} "eval_size" (:1:1): eval_size: not a numeric type -~~~~ +::: In addition to the use of brackets to write Cryptol expressions inline, several built-in functions can extract `Term` values from Cryptol files @@ -262,4 +259,4 @@ contents are available qualified with the name of the `CryptolModule` variable. A specific definition can be explicitly extracted from a `CryptolModule` using the `cryptol_extract` command: -* `cryptol_extract : CryptolModule -> String -> TopLevel Term` +- `cryptol_extract : CryptolModule -> String -> TopLevel Term` diff --git a/doc/manual/direct-extraction.md b/doc/manual/direct-extraction.md index 9e01f68199..1a97abe053 100644 --- a/doc/manual/direct-extraction.md +++ b/doc/manual/direct-extraction.md @@ -9,16 +9,16 @@ In cases like this, a direct translation is possible, given only an identification of which code to execute. Two functions exist to handle such simple code. The first, for LLVM is the more stable of the two: -* `llvm_extract : LLVMModule -> String -> TopLevel Term` +- `llvm_extract : LLVMModule -> String -> TopLevel Term` A similar function exists for Java, but is more experimental. -* `jvm_extract : JavaClass -> String -> TopLevel Term` +- `jvm_extract : JavaClass -> String -> TopLevel Term` Because of its lack of maturity, it (and later Java-related commands) must be enabled by running the `enable_experimental` command beforehand. -* `enable_experimental : TopLevel ()` +- `enable_experimental : TopLevel ()` The structure of these two extraction functions is essentially identical. The first argument describes where to look for code (in diff --git a/doc/manual/extraction-to-the-coq-theorem-prover.md b/doc/manual/extraction-to-the-coq-theorem-prover.md index bfd39a3876..f9f944be82 100644 --- a/doc/manual/extraction-to-the-coq-theorem-prover.md +++ b/doc/manual/extraction-to-the-coq-theorem-prover.md @@ -42,10 +42,10 @@ Once the library is compiled, the recommended way to import it into your subsequent development is by adding the following lines to your `_CoqProject` file: -``` +:::{code-block} text -Q /saw-core-coq/coq/generated/CryptolToCoq CryptolToCoq -Q /saw-core-coq/coq/handwritten/CryptolToCoq CryptolToCoq -``` +::: Here `` refers to the location on your system where the SAWScript source tree is checked out. This will add the relevant @@ -93,10 +93,10 @@ to generate a Coq file named `output.v`. We can accomplish this by running the following commands in saw (either directly from the `saw` command prompt, or via a script file) -``` +:::{code-block} sawscript enable_experimental; write_coq_cryptol_module "source.cry" "output.v" [] []; -``` +::: In this default mode, identifiers in the Cryptol source will be directly translated into identifiers in Coq. This may occasionally @@ -133,18 +133,18 @@ both to provide specifications for functions to be verified with For example, if I write the following Cryptol source file: -``` +:::{code-block} cryptol primitive f : Integer -> Integer g : Integer -> Bool g x = f (f x) > 0 -``` +::: After extraction, the generated term `g` will have Coq type: -``` +:::{code-block} coq (Integer -> Integer) -> Integer -> Bool -``` +::: ## Translation limitations and caveats diff --git a/doc/manual/loading-code.md b/doc/manual/loading-code.md index ba0f232c69..54b65c11d9 100644 --- a/doc/manual/loading-code.md +++ b/doc/manual/loading-code.md @@ -7,7 +7,7 @@ The first step in analyzing any code is to load it into the system. To load LLVM code, simply provide the location of a valid bitcode file to the `llvm_load_module` function. -* `llvm_load_module : String -> TopLevel LLVMModule` +- `llvm_load_module : String -> TopLevel LLVMModule` The resulting `LLVMModule` can be passed into the various functions described below to perform analysis of specific LLVM functions. @@ -25,15 +25,15 @@ Loading Java code is slightly more complex, because of the more structured nature of Java packages. First, when running `saw`, three flags control where to look for classes: -* The `-b` flag takes the path where the `java` executable lives, which is used +- The `-b` flag takes the path where the `java` executable lives, which is used to locate the Java standard library classes and add them to the class database. Alternatively, one can put the directory where `java` lives on the `PATH`, which SAW will search if `-b` is not set. -* The `-j` flag takes the name of a JAR file as an argument and adds the +- The `-j` flag takes the name of a JAR file as an argument and adds the contents of that file to the class database. -* The `-c` flag takes the name of a directory as an argument and adds all class +- The `-c` flag takes the name of a directory as an argument and adds all class files found in that directory (and its subdirectories) to the class database. By default, the current directory is included in the class path. @@ -49,7 +49,7 @@ flag (or, alternatively, with the `SAW_JDK_JAR` environment variable). Once the class path is configured, you can pass the name of a class to the `java_load_class` function. -* `java_load_class : String -> TopLevel JavaClass` +- `java_load_class : String -> TopLevel JavaClass` The resulting `JavaClass` can be passed into the various functions described below to perform analysis of specific Java methods. @@ -67,7 +67,7 @@ To load a piece of Rust code, first compile it to a MIR JSON file, as described in [this section](#compiling-mir), and then provide the location of the JSON file to the `mir_load_module` function: -* `mir_load_module : String -> TopLevel MIRModule` +- `mir_load_module : String -> TopLevel MIRModule` SAW currently supports Rust code that can be built with a [January 23, 2023 Rust nightly](https://static.rust-lang.org/dist/2023-01-23/). If you encounter @@ -84,16 +84,16 @@ more likely to succeed. For generating LLVM with `clang`, it can be helpful to: -* Turn on debugging symbols with `-g` so that SAW can find source +- Turn on debugging symbols with `-g` so that SAW can find source locations of functions, names of variables, etc. -* Optimize with `-O1` so that the generated bitcode more closely matches +- Optimize with `-O1` so that the generated bitcode more closely matches the C/C++ source, making the results more comprehensible. -* Use `-fno-threadsafe-statics` to prevent `clang` from emitting +- Use `-fno-threadsafe-statics` to prevent `clang` from emitting unnecessary pthread code. -* Link all relevant bitcode with `llvm-link` (including, *e.g.*, the C++ +- Link all relevant bitcode with `llvm-link` (including, _e.g._, the C++ standard library when analyzing C++ code). All SAW proofs include side conditions to rule out undefined behavior, @@ -138,15 +138,15 @@ following steps: 1. Clone the [`crucible`](https://github.com/GaloisInc/crucible) and `mir-json` submodules like so: - ``` + :::{code-block} console $ git submodule update deps/crucible deps/mir-json - ``` + ::: 2. Navigate to the `mir-json` submodule: - ``` + :::{code-block} console $ cd deps/mir-json - ``` + ::: 3. Follow the instructions laid out in the [`mir-json` installation instructions](https://github.com/GaloisInc/mir-json#installation-instructions) @@ -156,15 +156,15 @@ following steps: [`crux-mir`](https://github.com/GaloisInc/crucible/tree/master/crux-mir) subdirectory of the `crucible` submodule: - ``` + :::{code-block} console $ cd ../crucible/crux-mir/ - ``` + ::: 5. Run the `translate_libs.sh` script: - ``` + :::{code-block} console $ ./translate_libs.sh - ``` + ::: This will compile the custom versions of the Rust standard libraries using `mir-json`, placing the results under the `rlibs` subdirectory. @@ -172,42 +172,42 @@ following steps: 6. Finally, define a `SAW_RUST_LIBRARY_PATH` environment variable that points to the newly created `rlibs` subdirectory: - ``` + :::{code-block} console $ export SAW_RUST_LIBRARY_PATH=<...>/crucible/crux-mir/rlibs - ``` + ::: For `cargo`-based projects, `mir-json` provides a `cargo` subcommand called `cargo saw-build` that builds a JSON file suitable for use with SAW. `cargo saw-build` integrates directly with `cargo`, so you can pass flags to it like any other `cargo` subcommand. For example: -``` +:::{code-block} console # Make sure that SAW_RUST_LIBRARY_PATH is defined, as described above $ cargo saw-build linking 11 mir files into <...>/example-364cf2df365c7055.linked-mir.json -``` +::: Note that: -* The full output of `cargo saw-build` here is omitted. The important part is +- The full output of `cargo saw-build` here is omitted. The important part is the `.linked-mir.json` file that appears after `linking X mir files into`, as that is the JSON file that must be loaded with SAW. -* `SAW_RUST_LIBRARY_PATH` should point to the the MIR JSON files for the Rust +- `SAW_RUST_LIBRARY_PATH` should point to the the MIR JSON files for the Rust standard library. `mir-json` also supports compiling individual `.rs` files through `mir-json`'s `saw-rustc` command. As the name suggests, it accepts all of the flags that `rustc` accepts. For example: -``` +:::{code-block} console # Make sure that SAW_RUST_LIBRARY_PATH is defined, as described above $ saw-rustc example.rs linking 11 mir files into <...>/example.linked-mir.json -``` +::: ## Notes on C++ Analysis @@ -234,19 +234,19 @@ identifying the symbol you want to refer to. In addition, C++ names from namespaces can sometimes include quote marks in their LLVM encoding. For example: -~~~~ +:::{code-block} llvm %"class.quux::Foo" = type { i32, i32 } -~~~~ +::: This can be mentioned in SAW by saying: -~~~~ +:::{code-block} sawscript llvm_type "%\"class.quux::Foo\"" -~~~~ +::: Finally, there is no support for calling constructors in specifications, -so you will need to construct objects piece-by-piece using, *e.g.*, +so you will need to construct objects piece-by-piece using, _e.g._, `llvm_alloc` and `llvm_points_to`. -[^2]: +[^2]: [^3]: diff --git a/doc/manual/proofs-about-terms.md b/doc/manual/proofs-about-terms.md index 1b58d5e01e..5de4966873 100644 --- a/doc/manual/proofs-about-terms.md +++ b/doc/manual/proofs-about-terms.md @@ -6,10 +6,10 @@ rule in later proofs, but ultimately these rewrite rules come together into a proof of some higher-level property about a software system. Whether proving small lemmas (in the form of rewrite rules) or a -top-level theorem, the process builds on the idea of a *proof script* +top-level theorem, the process builds on the idea of a _proof script_ that is run by one of the top level proof commands. -* `prove_print : ProofScript () -> Term -> TopLevel Theorem` +- `prove_print : ProofScript () -> Term -> TopLevel Theorem` takes a proof script (which we'll describe next) and a `Term`. The `Term` should be of function type with a return value of `Bool` (`Bit` at the Cryptol level). It will then use the proof script to attempt to @@ -17,11 +17,11 @@ show that the `Term` returns `True` for all possible inputs. If it is successful, it will print `Valid` and return a `Theorem`. If not, it will abort. -* `sat_print : ProofScript () -> Term -> TopLevel ()` is similar -except that it looks for a *single* value for which the `Term` evaluates +- `sat_print : ProofScript () -> Term -> TopLevel ()` is similar +except that it looks for a _single_ value for which the `Term` evaluates to `True` and prints out that value, returning nothing. -* `prove_core : ProofScript () -> String -> TopLevel Theorem` +- `prove_core : ProofScript () -> String -> TopLevel Theorem` proves and returns a `Theorem` from a string in SAWCore syntax. ## Automated Tactics @@ -32,7 +32,7 @@ provers, respectively, and are typically good choices. For example, combining `prove_print` with `abc`: -~~~~ +:::{code-block} console sawscript> t <- prove_print abc {{ \(x:[8]) -> x+x == x*2 }} Valid sawscript> t @@ -47,16 +47,16 @@ Theorem (let { x@1 = Prelude.Vec 8 Prelude.Bool (Cryptol.ecMul x@1 x@3 x (Cryptol.ecNumber (Cryptol.TCNum 2) x@1 (Cryptol.PLiteralSeqBool x@2))))) -~~~~ +::: Similarly, `sat_print` will show that the function returns `True` for one specific input (which it should, since we already know it returns `True` for all inputs): -~~~~ +:::{code-block} console sawscript> sat_print abc {{ \(x:[8]) -> x+x == x*2 }} Sat: [x = 0] -~~~~ +::: In addition to these, the `bitwuzla`, `boolector`, `cvc4`, `cvc5`, `mathsat`, and `yices` provers are available. The internal decision procedure `rme`, short @@ -75,17 +75,17 @@ During development of a proof, it can be useful to print various information about the current goal. The following tactics are useful in that context. -* `print_goal : ProofScript ()` prints the entire goal in SAWCore +- `print_goal : ProofScript ()` prints the entire goal in SAWCore syntax. -* `print_goal_consts : ProofScript ()` prints a list of unfoldable constants +- `print_goal_consts : ProofScript ()` prints a list of unfoldable constants in the current goal. -* `print_goal_depth : Int -> ProofScript ()` takes an integer argument, `n`, +- `print_goal_depth : Int -> ProofScript ()` takes an integer argument, `n`, and prints the goal up to depth `n`. Any elided subterms are printed with a `...` notation. -* `print_goal_size : ProofScript ()` prints the number of nodes in the +- `print_goal_size : ProofScript ()` prints the number of nodes in the DAG representation of the goal. ## Rewriting in Proof Scripts @@ -94,15 +94,15 @@ One of the key techniques available for completing proofs in SAWScript is the use of rewriting or transformation. The following commands support this approach. -* `simplify : Simpset -> ProofScript ()` works just like `rewrite`, +- `simplify : Simpset -> ProofScript ()` works just like `rewrite`, except that it works in a `ProofScript` context and implicitly transforms the current (unnamed) goal rather than taking a `Term` as a parameter. -* `goal_eval : ProofScript ()` will evaluate the current proof goal to a +- `goal_eval : ProofScript ()` will evaluate the current proof goal to a first-order combination of primitives. -* `goal_eval_unint : [String] -> ProofScript ()` works like `goal_eval` +- `goal_eval_unint : [String] -> ProofScript ()` works like `goal_eval` but avoids expanding or simplifying the given names. ## Other Transformations @@ -110,12 +110,12 @@ but avoids expanding or simplifying the given names. Some useful transformations are not easily specified using equality statements, and instead have special tactics. -* `beta_reduce_goal : ProofScript ()` works like `beta_reduce_term` but +- `beta_reduce_goal : ProofScript ()` works like `beta_reduce_term` but on the current goal. It takes any sub-expression of the form `(\x -> t) v` and replaces it with a transformed version of `t` in which all instances of `x` are replaced by `v`. -* `unfolding : [String] -> ProofScript ()` works like `unfold_term` but +- `unfolding : [String] -> ProofScript ()` works like `unfold_term` but on the current goal. Using `unfolding` is mostly valuable for proofs @@ -124,15 +124,15 @@ provers is to unfold everything before sending a goal to a prover. However, with some provers it is possible to indicate that specific named subterms should be represented as uninterpreted functions. -* `unint_bitwuzla : [String] -> ProofScript ()` +- `unint_bitwuzla : [String] -> ProofScript ()` -* `unint_cvc4 : [String] -> ProofScript ()` +- `unint_cvc4 : [String] -> ProofScript ()` -* `unint_cvc5 : [String] -> ProofScript ()` +- `unint_cvc5 : [String] -> ProofScript ()` -* `unint_yices : [String] -> ProofScript ()` +- `unint_yices : [String] -> ProofScript ()` -* `unint_z3 : [String] -> ProofScript ()` +- `unint_z3 : [String] -> ProofScript ()` The list of `String` arguments in these cases indicates the names of the subterms to leave folded, and therefore present as uninterpreted @@ -147,27 +147,27 @@ Note that each of the `unint_*` tactics have variants that are prefixed with `sbv_` and `w4_`. The `sbv_`-prefixed tactics make use of the SBV library to represent and solve SMT queries: -* `sbv_unint_bitwuzla : [String] -> ProofScript ()` +- `sbv_unint_bitwuzla : [String] -> ProofScript ()` -* `sbv_unint_cvc4 : [String] -> ProofScript ()` +- `sbv_unint_cvc4 : [String] -> ProofScript ()` -* `sbv_unint_cvc5 : [String] -> ProofScript ()` +- `sbv_unint_cvc5 : [String] -> ProofScript ()` -* `sbv_unint_yices : [String] -> ProofScript ()` +- `sbv_unint_yices : [String] -> ProofScript ()` -* `sbv_unint_z3 : [String] -> ProofScript ()` +- `sbv_unint_z3 : [String] -> ProofScript ()` The `w4_`-prefixed tactics make use of the What4 library instead of SBV: -* `w4_unint_bitwuzla : [String] -> ProofScript ()` +- `w4_unint_bitwuzla : [String] -> ProofScript ()` -* `w4_unint_cvc4 : [String] -> ProofScript ()` +- `w4_unint_cvc4 : [String] -> ProofScript ()` -* `w4_unint_cvc5 : [String] -> ProofScript ()` +- `w4_unint_cvc5 : [String] -> ProofScript ()` -* `w4_unint_yices : [String] -> ProofScript ()` +- `w4_unint_yices : [String] -> ProofScript ()` -* `w4_unint_z3 : [String] -> ProofScript ()` +- `w4_unint_z3 : [String] -> ProofScript ()` In most specifications, the choice of SBV versus What4 is not important, as both libraries are broadly compatible in terms of functionality. There are some @@ -208,7 +208,7 @@ a cache at the specified path until it is actually needed. There are also a number of SAW commands related to solver caching. -* `set_solver_cache_path` is like setting `SAW_SOLVER_CACHE_PATH` for the +- `set_solver_cache_path` is like setting `SAW_SOLVER_CACHE_PATH` for the remainder of the current session, but opens an LMDB database at the specified path immediately. If a cache is already in use in the current session (i.e. through a prior call to `set_solver_cache_path` or through @@ -216,18 +216,18 @@ There are also a number of SAW commands related to solver caching. then all entries in the cache already in use will be copied to the new cache being opened. -* `clean_mismatched_versions_solver_cache` will remove all entries in the +- `clean_mismatched_versions_solver_cache` will remove all entries in the solver result cache which were created using solver backend versions which do not match the versions in the current environment. This can be run after an update to clear out any old, unusable entries from the solver cache. This command can also be run directly from the command line through the `--clean-mismatched-versions-solver-cache` command-line option. -* `print_solver_cache` prints to the console all entries in the cache whose +- `print_solver_cache` prints to the console all entries in the cache whose SHA256 hash keys start with the given hex string. Providing an empty string results in all entries in the cache being printed. -* `print_solver_cache_stats` prints to the console statistics including the +- `print_solver_cache_stats` prints to the console statistics including the size of the solver cache, where on disk it is stored, and some counts of how often it has been used during the current session. @@ -239,7 +239,7 @@ interacting with the LMDB databases kept by SAW for solver caching. Below is an example of using solver caching with `saw -v Debug`. Only the relevant output is shown, the rest abbreviated with "...". -~~~~ +:::{code-block} console sawscript> set_solver_cache_path "example.cache" sawscript> prove_print z3 {{ \(x:[8]) -> x+x == x*2 }} [22:13:00.832] Caching result: d1f5a76e7a0b7c01 (SBV 9.2, Z3 4.8.7 - 64 bit) @@ -270,7 +270,7 @@ sawscript> print_solver_cache_stats [22:13:20.585] - 2 results cached in example.cache [22:13:20.585] - 2 insertions into the cache so far this run (0 failed attempts) [22:13:20.585] - 1 usage of cached results so far this run (0 failed attempts) -~~~~ +::: ## Other External Provers @@ -278,7 +278,7 @@ In addition to the built-in automated provers already discussed, SAW supports more generic interfaces to other arbitrary theorem provers supporting specific interfaces. -* `external_aig_solver : String -> [String] -> ProofScript ()` +- `external_aig_solver : String -> [String] -> ProofScript ()` supports theorem provers that can take input as a single-output AIGER file. The first argument is the name of the executable to run. The second argument is the list of command-line parameters to pass to that @@ -286,7 +286,7 @@ executable. Any element of this list equal to `"%f"` will be replaced with the name of the temporary AIGER file generated for the proof goal. The output from the solver is expected to be in DIMACS solution format. -* `external_cnf_solver : String -> [String] -> ProofScript ()` +- `external_cnf_solver : String -> [String] -> ProofScript ()` works similarly but for SAT solvers that take input in DIMACS CNF format and produce output in DIMACS solution format. @@ -297,15 +297,15 @@ until a later time, there are functions to write the current goal to a file in various formats, and then assume that the goal is valid through the rest of the script. -* `offline_aig : String -> ProofScript ()` +- `offline_aig : String -> ProofScript ()` -* `offline_cnf : String -> ProofScript ()` +- `offline_cnf : String -> ProofScript ()` -* `offline_extcore : String -> ProofScript ()` +- `offline_extcore : String -> ProofScript ()` -* `offline_smtlib2 : String -> ProofScript ()` +- `offline_smtlib2 : String -> ProofScript ()` -* `offline_unint_smtlib2 : [String] -> String -> ProofScript ()` +- `offline_unint_smtlib2 : [String] -> String -> ProofScript ()` These support the AIGER, DIMACS CNF, shared SAWCore, and SMT-Lib v2 formats, respectively. The shared representation for SAWCore is @@ -319,26 +319,26 @@ listed in its first argument as uninterpreted functions. Some proofs can be completed using unsound placeholders, or using techniques that do not require significant computation. -* `assume_unsat : ProofScript ()` indicates that the current goal +- `assume_unsat : ProofScript ()` indicates that the current goal should be assumed to be unsatisfiable. This is an alias for `assume_valid`. Users should prefer to use `admit` instead. -* `assume_valid : ProofScript ()` indicates that the current +- `assume_valid : ProofScript ()` indicates that the current goal should be assumed to be valid. Users should prefer to use `admit` instead -* `admit : String -> ProofScript ()` indicates that the current +- `admit : String -> ProofScript ()` indicates that the current goal should be assumed to be valid without proof. The given string should be used to record why the user has decided to assume this proof goal. -* `quickcheck : Int -> ProofScript ()` runs the goal on the given +- `quickcheck : Int -> ProofScript ()` runs the goal on the given number of random inputs, and succeeds if the result of evaluation is always `True`. This is unsound, but can be helpful during proof development, or as a way to provide some evidence for the validity of a specification believed to be true but difficult or infeasible to prove. -* `trivial : ProofScript ()` states that the current goal should +- `trivial : ProofScript ()` states that the current goal should be trivially true. This tactic recognizes instances of equality that can be demonstrated by conversion alone. In particular it is able to prove `EqTrue x` goals where `x` reduces to @@ -352,28 +352,28 @@ multiple goals. The following commands can introduce or work with multiple goals. These are experimental and can be used only after `enable_experimental` has been called. -* `goal_apply : Theorem -> ProofScript ()` will apply a given +- `goal_apply : Theorem -> ProofScript ()` will apply a given introduction rule to the current goal. This will result in zero or more new subgoals. -* `goal_assume : ProofScript Theorem` will convert the first hypothesis +- `goal_assume : ProofScript Theorem` will convert the first hypothesis in the current proof goal into a local `Theorem` -* `goal_insert : Theorem -> ProofScript ()` will insert a given +- `goal_insert : Theorem -> ProofScript ()` will insert a given `Theorem` as a new hypothesis in the current proof goal. -* `goal_intro : String -> ProofScript Term` will introduce a quantified +- `goal_intro : String -> ProofScript Term` will introduce a quantified variable in the current proof goal, returning the variable as a `Term`. -* `goal_when : String -> ProofScript () -> ProofScript ()` will run the +- `goal_when : String -> ProofScript () -> ProofScript ()` will run the given proof script only when the goal name contains the given string. -* `goal_exact : Term -> ProofScript ()` will attempt to use the given +- `goal_exact : Term -> ProofScript ()` will attempt to use the given term as an exact proof for the current goal. This tactic will succeed whever the type of the given term exactly matches the current goal, and will fail otherwise. -* `split_goal : ProofScript ()` will split a goal of the form +- `split_goal : ProofScript ()` will split a goal of the form `Prelude.and prop1 prop2` into two separate goals `prop1` and `prop2`. ## Proof Failure and Satisfying Assignments @@ -391,17 +391,17 @@ In the case of `ProofResult`, a statement may be valid or there may be a counter-example. In the case of `SatResult`, there may be a satisfying assignment or the statement may be unsatisfiable. -* `prove : ProofScript SatResult -> Term -> TopLevel ProofResult` +- `prove : ProofScript SatResult -> Term -> TopLevel ProofResult` -* `sat : ProofScript SatResult -> Term -> TopLevel SatResult` +- `sat : ProofScript SatResult -> Term -> TopLevel SatResult` To operate on these new types, SAWScript includes a pair of functions: -* `caseProofResult : {b} ProofResult -> b -> (Term -> b) -> b` takes a +- `caseProofResult : {b} ProofResult -> b -> (Term -> b) -> b` takes a `ProofResult`, a value to return in the case that the statement is valid, and a function to run on the counter-example, if there is one. -* `caseSatResult : {b} SatResult -> b -> (Term -> b) -> b` has the same +- `caseSatResult : {b} SatResult -> b -> (Term -> b) -> b` has the same shape: it returns its first argument if the result represents an unsatisfiable statement, or its second argument applied to a satisfying assignment if it finds one. @@ -420,15 +420,15 @@ particularly equivalence checking on AIGs. To take advantage of this capability, a handful of built-in commands can operate on AIGs. -* `bitblast : Term -> TopLevel AIG` represents a `Term` as an `AIG` by +- `bitblast : Term -> TopLevel AIG` represents a `Term` as an `AIG` by "blasting" all of its primitive operations (things like bit-vector addition) down to the level of individual bits. -* `load_aig : String -> TopLevel AIG` loads an `AIG` from an external +- `load_aig : String -> TopLevel AIG` loads an `AIG` from an external AIGER file. -* `save_aig : String -> AIG -> TopLevel ()` saves an `AIG` to an +- `save_aig : String -> AIG -> TopLevel ()` saves an `AIG` to an external AIGER file. -* `save_aig_as_cnf : String -> AIG -> TopLevel ()` writes an `AIG` out +- `save_aig_as_cnf : String -> AIG -> TopLevel ()` writes an `AIG` out in CNF format for input into a standard SAT solver. diff --git a/doc/manual/specification-based-verification.md b/doc/manual/specification-based-verification.md index 201d113f91..31a0e056ca 100644 --- a/doc/manual/specification-based-verification.md +++ b/doc/manual/specification-based-verification.md @@ -15,7 +15,7 @@ verifications, allowing the proof process to be decomposed. Verification of LLVM is controlled by the `llvm_verify` command. -~~~~ +:::{code-block} sawscript llvm_verify : LLVMModule -> String -> @@ -24,7 +24,7 @@ llvm_verify : LLVMSetup () -> ProofScript SatResult -> TopLevel CrucibleMethodSpec -~~~~ +::: The first two arguments specify the module and function name to verify, as with `llvm_verify`. The third argument specifies the list of @@ -38,7 +38,7 @@ that call this one. Similar commands are available for JVM programs: -~~~~ +:::{code-block} sawscript jvm_verify : JavaClass -> String -> @@ -47,11 +47,11 @@ jvm_verify : JVMSetup () -> ProofScript SatResult -> TopLevel JVMMethodSpec -~~~~ +::: And for MIR programs: -~~~~ +:::{code-block} sawscript mir_verify : MIRModule -> String -> @@ -60,7 +60,7 @@ mir_verify : MIRSetup () -> ProofScript () -> TopLevel MIRSpec -~~~~ +::: ### Running a MIR-based verification @@ -72,16 +72,16 @@ The `String` supplied as an argument to `mir_verify` is expected to be a function _identifier_. An identifier is expected adhere to one of the following conventions: -* `/::` -* `::` +- `/::` +- `::` Where: -* `` is the name of the crate in which the function is defined. (If +- `` is the name of the crate in which the function is defined. (If you produced your MIR JSON file by compiling a single `.rs` file with `saw-rustc`, then the crate name is the same as the name of the file, but without the `.rs` file extension.) -* `` is a hash of the crate and its dependencies. In extreme +- `` is a hash of the crate and its dependencies. In extreme cases, it is possible for two different crates to have identical crate names, in which case the disambiguator must be used to distinguish between the two crates. In the common case, however, most crate names will correspond to @@ -89,15 +89,15 @@ Where: `/` part of the `String` in this case. If you supply an identifier with an ambiguous crate name and omit the disambiguator, then SAW will raise an error. -* `` is the path to the function within the crate. Sometimes, +- `` is the path to the function within the crate. Sometimes, this is as simple as the function name itself. In other cases, a function path may involve multiple _segments_, depending on the module hierarchy for the program being verified. For instance, a `read` function located in `core/src/ptr/mod.rs` will have the identifier: - ``` + :::{code-block} text core::ptr::read - ``` + ::: Where `core` is the crate name and `ptr::read` is the function path, which has two segments `ptr` and `read`. There are also some special forms of @@ -105,9 +105,9 @@ Where: For instance, if a function is defined in an `impl` block, then it will have `{impl}` as one of its segments, e.g., - ``` + :::{code-block} text core::ptr::const_ptr::{impl}::offset - ``` + ::: If you are in doubt about what the full identifier for a given function is, consult the MIR JSON file for your program. @@ -121,11 +121,11 @@ or `MIRSetup ()`. A specifications for Crucible consists of three logical components: -* A specification of the initial state before execution of the function. +- A specification of the initial state before execution of the function. -* A description of how to call the function within that state. +- A description of how to call the function within that state. -* A specification of the expected final value of the program state. +- A specification of the expected final value of the program state. These three portions of the specification are written in sequence within a `do` block of type `{LLVM,JVM,MIR}Setup`. The command `{llvm,jvm,mir}_execute_func` @@ -143,11 +143,11 @@ values of at least some elements of the program state must contain fresh variables. These are created in a specification with the `{llvm,jvm,mir}_fresh_var` commands rather than `fresh_symbolic`. -* `llvm_fresh_var : String -> LLVMType -> LLVMSetup Term` +- `llvm_fresh_var : String -> LLVMType -> LLVMSetup Term` -* `jvm_fresh_var : String -> JavaType -> JVMSetup Term` +- `jvm_fresh_var : String -> JavaType -> JVMSetup Term` -* `mir_fresh_var : String -> MIRType -> MIRSetup Term` +- `mir_fresh_var : String -> MIRType -> MIRSetup Term` The first parameter to both functions is a name, used only for presentation. It's possible (though not recommended) to create multiple @@ -166,53 +166,53 @@ function such as `llvm_fresh_expanded_val` (for LLVM verification) or LLVM types are built with this set of functions: -* `llvm_int : Int -> LLVMType` -* `llvm_alias : String -> LLVMType` -* `llvm_array : Int -> LLVMType -> LLVMType` -* `llvm_float : LLVMType` -* `llvm_double : LLVMType` -* `llvm_packed_struct : [LLVMType] -> LLVMType` -* `llvm_struct_type : [LLVMType] -> LLVMType` +- `llvm_int : Int -> LLVMType` +- `llvm_alias : String -> LLVMType` +- `llvm_array : Int -> LLVMType -> LLVMType` +- `llvm_float : LLVMType` +- `llvm_double : LLVMType` +- `llvm_packed_struct : [LLVMType] -> LLVMType` +- `llvm_struct_type : [LLVMType] -> LLVMType` Java types are built up using the following functions: -* `java_bool : JavaType` -* `java_byte : JavaType` -* `java_char : JavaType` -* `java_short : JavaType` -* `java_int : JavaType` -* `java_long : JavaType` -* `java_float : JavaType` -* `java_double : JavaType` -* `java_class : String -> JavaType` -* `java_array : Int -> JavaType -> JavaType` +- `java_bool : JavaType` +- `java_byte : JavaType` +- `java_char : JavaType` +- `java_short : JavaType` +- `java_int : JavaType` +- `java_long : JavaType` +- `java_float : JavaType` +- `java_double : JavaType` +- `java_class : String -> JavaType` +- `java_array : Int -> JavaType -> JavaType` MIR types are built up using the following functions: -* `mir_adt : MIRAdt -> MIRType` -* `mir_array : Int -> MIRType -> MIRType` -* `mir_bool : MIRType` -* `mir_char : MIRType` -* `mir_i8 : MIRType` -* `mir_i6 : MIRType` -* `mir_i32 : MIRType` -* `mir_i64 : MIRType` -* `mir_i128 : MIRType` -* `mir_isize : MIRType` -* `mir_f32 : MIRType` -* `mir_f64 : MIRType` -* `mir_lifetime : MIRType` -* `mir_ref : MIRType -> MIRType` -* `mir_ref_mut : MIRType -> MIRType` -* `mir_slice : MIRType -> MIRType` -* `mir_str : MIRType` -* `mir_tuple : [MIRType] -> MIRType` -* `mir_u8 : MIRType` -* `mir_u6 : MIRType` -* `mir_u32 : MIRType` -* `mir_u64 : MIRType` -* `mir_u128 : MIRType` -* `mir_usize : MIRType` +- `mir_adt : MIRAdt -> MIRType` +- `mir_array : Int -> MIRType -> MIRType` +- `mir_bool : MIRType` +- `mir_char : MIRType` +- `mir_i8 : MIRType` +- `mir_i6 : MIRType` +- `mir_i32 : MIRType` +- `mir_i64 : MIRType` +- `mir_i128 : MIRType` +- `mir_isize : MIRType` +- `mir_f32 : MIRType` +- `mir_f64 : MIRType` +- `mir_lifetime : MIRType` +- `mir_ref : MIRType -> MIRType` +- `mir_ref_mut : MIRType -> MIRType` +- `mir_slice : MIRType -> MIRType` +- `mir_str : MIRType` +- `mir_tuple : [MIRType] -> MIRType` +- `mir_u8 : MIRType` +- `mir_u6 : MIRType` +- `mir_u32 : MIRType` +- `mir_u64 : MIRType` +- `mir_u128 : MIRType` +- `mir_usize : MIRType` Most of these types are straightforward mappings to the standard LLVM and Java types. The one key difference is that arrays must have a fixed, @@ -232,7 +232,7 @@ bitcode by compiling your code with `clang -S -emit-llvm`. LLVM types can also be specified in LLVM syntax directly by using the `llvm_type` function. -* `llvm_type : String -> LLVMType` +- `llvm_type : String -> LLVMType` For example, `llvm_type "i32"` yields the same result as `llvm_int 32`. @@ -255,9 +255,9 @@ these (both structures and arrays). The `llvm_term`, `jvm_term`, and `mir_term` functions create a `SetupValue`, `JVMValue`, or `MIRValue`, respectively, from a `Term`: -* `llvm_term : Term -> SetupValue` -* `jvm_term : Term -> JVMValue` -* `mir_term : Term -> MIRValue` +- `llvm_term : Term -> SetupValue` +- `jvm_term : Term -> JVMValue` +- `mir_term : Term -> MIRValue` The value that these functions return will have an LLVM, JVM, or MIR type corresponding to the Cryptol type of the `Term` argument. (For more information @@ -277,67 +277,67 @@ Cryptol types (and vice versa) in this way. The following LLVM types correspond to Cryptol types: -* `llvm_alias `: Corresponds to the same Cryptol type as the type used +- `llvm_alias `: Corresponds to the same Cryptol type as the type used in the definition of ``. -* `llvm_array `: Corresponds to the Cryptol sequence `[][]`, +- `llvm_array `: Corresponds to the Cryptol sequence `[][]`, where `` is the Cryptol type corresponding to ``. -* `llvm_int `: Corresponds to the Cryptol word `[]`. -* `llvm_struct_type [, ..., ]` and `llvm_packed_struct [, ..., ]`: +- `llvm_int `: Corresponds to the Cryptol word `[]`. +- `llvm_struct_type [, ..., ]` and `llvm_packed_struct [, ..., ]`: Corresponds to the Cryptol tuple `(, ..., )`, where `` is the Cryptol type corresponding to `` for each `i` ranging from `1` to `n`. The following LLVM types do _not_ correspond to Cryptol types: -* `llvm_double` -* `llvm_float` -* `llvm_pointer` +- `llvm_double` +- `llvm_float` +- `llvm_pointer` #### JVM verification The following Java types correspond to Cryptol types: -* `java_array `: Corresponds to the Cryptol sequence `[][]`, +- `java_array `: Corresponds to the Cryptol sequence `[][]`, where `` is the Cryptol type corresponding to ``. -* `java_bool`: Corresponds to the Cryptol `Bit` type. -* `java_byte`: Corresponds to the Cryptol `[8]` type. -* `java_char`: Corresponds to the Cryptol `[16]` type. -* `java_int`: Corresponds to the Cryptol `[32]` type. -* `java_long`: Corresponds to the Cryptol `[64]` type. -* `java_short`: Corresponds to the Cryptol `[16]` type. +- `java_bool`: Corresponds to the Cryptol `Bit` type. +- `java_byte`: Corresponds to the Cryptol `[8]` type. +- `java_char`: Corresponds to the Cryptol `[16]` type. +- `java_int`: Corresponds to the Cryptol `[32]` type. +- `java_long`: Corresponds to the Cryptol `[64]` type. +- `java_short`: Corresponds to the Cryptol `[16]` type. The following Java types do _not_ correspond to Cryptol types: -* `java_class` -* `java_double` -* `java_float` +- `java_class` +- `java_double` +- `java_float` #### MIR verification The following MIR types correspond to Cryptol types: -* `mir_array `: Corresponds to the Cryptol sequence `[][]`, +- `mir_array `: Corresponds to the Cryptol sequence `[][]`, where `` is the Cryptol type corresponding to ``. -* `mir_bool`: Corresponds to the Cryptol `Bit` type. -* `mir_char`: Corresponds to the Cryptol `[32]` type. -* `mir_i8` and `mir_u8`: Corresponds to the Cryptol `[8]` type. -* `mir_i16` and `mir_u16`: Corresponds to the Cryptol `[16]` type. -* `mir_i32` and `mir_u32`: Corresponds to the Cryptol `[32]` type. -* `mir_i64` and `mir_u64`: Corresponds to the Cryptol `[64]` type. -* `mir_i128` and `mir_u128`: Corresponds to the Cryptol `[128]` type. -* `mir_isize` and `mir_usize`: Corresponds to the Cryptol `[32]` type. -* `mir_tuple [, ..., ]`: Corresponds to the Cryptol tuple +- `mir_bool`: Corresponds to the Cryptol `Bit` type. +- `mir_char`: Corresponds to the Cryptol `[32]` type. +- `mir_i8` and `mir_u8`: Corresponds to the Cryptol `[8]` type. +- `mir_i16` and `mir_u16`: Corresponds to the Cryptol `[16]` type. +- `mir_i32` and `mir_u32`: Corresponds to the Cryptol `[32]` type. +- `mir_i64` and `mir_u64`: Corresponds to the Cryptol `[64]` type. +- `mir_i128` and `mir_u128`: Corresponds to the Cryptol `[128]` type. +- `mir_isize` and `mir_usize`: Corresponds to the Cryptol `[32]` type. +- `mir_tuple [, ..., ]`: Corresponds to the Cryptol tuple `(, ..., )`, where `` is the Cryptol type corresponding to `` for each `i` ranging from `1` to `n`. The following MIR types do _not_ correspond to Cryptol types: -* `mir_adt` -* `mir_f32` -* `mir_f64` -* `mir_ref` and `mir_ref_mut` -* `mir_slice` -* `mir_str` +- `mir_adt` +- `mir_f32` +- `mir_f64` +- `mir_ref` and `mir_ref_mut` +- `mir_slice` +- `mir_str` ## Executing @@ -345,18 +345,18 @@ Once the initial state has been configured, the `{llvm,jvm,mir}_execute_func` command specifies the parameters of the function being analyzed in terms of the state elements already configured. -* `llvm_execute_func : [SetupValue] -> LLVMSetup ()` -* `jvm_execute_func : [JVMValue] -> JVMSetup ()` -* `mir_execute_func : [MIRValue] -> MIRSetup ()` +- `llvm_execute_func : [SetupValue] -> LLVMSetup ()` +- `jvm_execute_func : [JVMValue] -> JVMSetup ()` +- `mir_execute_func : [MIRValue] -> MIRSetup ()` ## Return Values To specify the value that should be returned by the function being verified use the `{llvm,jvm,mir}_return` command. -* `llvm_return : SetupValue -> LLVMSetup ()` -* `jvm_return : JVMValue -> JVMSetup ()` -* `mir_return : MIRValue -> MIRSetup ()` +- `llvm_return : SetupValue -> LLVMSetup ()` +- `jvm_return : JVMValue -> JVMSetup ()` +- `mir_return : MIRValue -> MIRSetup ()` ## A First Simple Example @@ -364,31 +364,31 @@ The commands introuduced so far are sufficient to verify simple programs that do not use pointers (or that use them only internally). Consider, for instance the C program that adds its two arguments together: -~~~~ +:::{code-block} c #include uint32_t add(uint32_t x, uint32_t y) { return x + y; } -~~~~ +::: We can specify this function's expected behavior as follows: -~~~~ +:::{code-block} sawscript let add_setup = do { x <- llvm_fresh_var "x" (llvm_int 32); y <- llvm_fresh_var "y" (llvm_int 32); llvm_execute_func [llvm_term x, llvm_term y]; llvm_return (llvm_term {{ x + y : [32] }}); }; -~~~~ +::: We can then compile the C file `add.c` into the bitcode file `add.bc` and verify it with ABC: -~~~~ +:::{code-block} sawscript m <- llvm_load_module "add.bc"; add_ms <- llvm_verify m "add" [] false add_setup abc; -~~~~ +::: ## Compositional Verification @@ -411,37 +411,37 @@ specified by one of these parameters, the simulator will not follow calls to the associated target. Instead, it will perform the following steps: -* Check that all `llvm_points_to` and `llvm_precond` statements +- Check that all `llvm_points_to` and `llvm_precond` statements (or the corresponding JVM or MIR statements) in the specification are satisfied. -* Update the simulator state and optionally construct a return value as +- Update the simulator state and optionally construct a return value as described in the specification. More concretely, building on the previous example, say we have a doubling function written in terms of `add`: -~~~~ +:::{code-block} c uint32_t dbl(uint32_t x) { return add(x, x); } -~~~~ +::: It has a similar specification to `add`: -~~~~ +:::{code-block} sawscript let dbl_setup = do { x <- llvm_fresh_var "x" (llvm_int 32); llvm_execute_func [llvm_term x]; llvm_return (llvm_term {{ x + x : [32] }}); }; -~~~~ +::: And we can verify it using what we've already proved about `add`: -~~~~ +:::{code-block} sawscript llvm_verify m "dbl" [add_ms] false dbl_setup abc; -~~~~ +::: In this case, doing the verification compositionally doesn't save computational effort, since the functions are so simple, but it @@ -456,7 +456,7 @@ lengths to check for this. Here is an example of this pitfall in an LLVM verification. Given this C code: -~~~ c +::: c void side_effect(uint32_t *a) { *a = 0; } @@ -466,11 +466,11 @@ uint32_t foo(uint32_t x) { side_effect(&b); return b; } -~~~ +::: And the following SAW specifications: -~~~ +:::{code-block} sawscript let side_effect_spec = do { a_ptr <- llvm_alloc (llvm_int 32); a_val <- llvm_fresh_var "a_val" (llvm_int 32); @@ -486,15 +486,15 @@ let foo_spec = do { llvm_return (llvm_term x); }; -~~~ +::: Should SAW be able to verify the `foo` function against `foo_spec` using compositional verification? That is, should the following be expected to work? -~~~ +:::{code-block} sawscript side_effect_ov <- llvm_verify m "side_effect" [] false side_effect_spec z3; llvm_verify m "foo" [side_effect_ov] false foo_spec z3; -~~~ +::: A literal reading of `side_effect_spec` would suggest that the `side_effect` function allocates `a_ptr` but then does nothing with it, implying that `foo` @@ -514,14 +514,14 @@ postconditions. Attempting to read from invalidated memory constitutes an error, as can be seen in this portion of the error message when attempting to verify `foo` against `foo_spec`: -~~~ +:::{code-block} console invalidate (state of memory allocated in precondition (at side.saw:3:12) not described in postcondition) -~~~ +::: To fix this particular issue, add an `llvm_points_to` statement to `side_effect_spec`: -~~~ +:::{code-block} sawscript let side_effect_spec = do { a_ptr <- llvm_alloc (llvm_int 32); a_val <- llvm_fresh_var "a_val" (llvm_int 32); @@ -532,7 +532,7 @@ let side_effect_spec = do { // This is new llvm_points_to a_ptr (llvm_term {{ 0 : [32] }}); }; -~~~ +::: After making this change, SAW will reject `foo_spec` for a different reason, as it claims that `foo` returns its argument unchanged when it actually returns @@ -551,7 +551,7 @@ The same pitfalls apply to compositional MIR verification, with a couple of key differences. In MIR verification, mutable references are allocated using `mir_alloc_mut`. Here is a Rust version of the pitfall program above: -~~~ rust +:::{code-block} rust pub fn side_effect(a: &mut u32) { *a = 0; } @@ -561,9 +561,9 @@ pub fn foo(x: u32) -> u32 { side_effect(&mut b); b } -~~~ +::: -~~~ +:::{code-block} sawscript let side_effect_spec = do { a_ref <- mir_alloc_mut mir_u32; a_val <- mir_fresh_var "a_val" mir_u32; @@ -579,15 +579,15 @@ let foo_spec = do { mir_return (mir_term {{ x }}); }; -~~~ +::: Just like above, if you attempted to prove `foo` against `foo_spec` using compositional verification: -~~~ +:::{code-block} sawscript side_effect_ov <- mir_verify m "test::side_effect" [] false side_effect_spec z3; mir_verify m "test::foo" [side_effect_ov] false foo_spec z3; -~~~ +::: Then SAW would throw an error, as `side_effect_spec` underspecifies the value of `a_ref` in its postconditions. `side_effect_spec` can similarly be repaired @@ -605,13 +605,13 @@ _even if the function that calls the override never uses the allocations_. To illustrate this point more finely, suppose that the `foo` function had instead been defined like this: -~~~ rust +:::{code-block} rust pub fn foo(x: u32) -> u32 { let mut b: u32 = x; side_effect(&mut b); 42 } -~~~ +::: Here, it does not particularly matter what effects the `side_effect` function has on its argument, as `foo` will now return `42` regardless. Still, if you @@ -630,8 +630,7 @@ mutable global variables in their postconditions. To illustrate this using LLVM verification, here is a variant of the C program from the previous example that uses a mutable global variable `a`: -~~~ c - +:::{code-block} c uint32_t a = 42; void side_effect(void) { @@ -642,12 +641,12 @@ uint32_t foo(void) { side_effect(); return a; } -~~~ +::: If we attempted to verify `foo` against this `foo_spec` specification using compositional verification: -~~~ +:::{code-block} sawscript let side_effect_spec = do { llvm_alloc_global "a"; llvm_points_to (llvm_global "a") (llvm_global_initializer "a"); @@ -666,7 +665,7 @@ let foo_spec = do { side_effect_ov <- llvm_verify m "side_effect" [] false side_effect_spec z3; llvm_verify m "foo" [side_effect_ov] false foo_spec z3; -~~~ +::: Then SAW would reject it, as `side_effect_spec` does not specify what `a`'s value should be in its postconditions. Just as with local mutable allocations, @@ -680,7 +679,7 @@ referred to as `static mut` items. (See the [MIR static items](#mir-static-items) section for more information). Here is a Rust version of the program above: -~~~ rust +:::{code-block} rust static mut A: u32 = 42; pub fn side_effect() { @@ -693,9 +692,9 @@ pub fn foo() -> u32 { side_effect(); unsafe { A } } -~~~ +::: -~~~ +:::{code-block} sawscript let side_effect_spec = do { mir_points_to (mir_static "test::A") (mir_static_initializer "test::A"); @@ -712,7 +711,7 @@ let foo_spec = do { side_effect_ov <- mir_verify m "side_effect" [] false side_effect_spec z3; mir_verify m "foo" [side_effect_ov] false foo_spec z3; -~~~ +::: Just as above, we can repair this by adding a `mir_points_to` statement in `side_effect_spec`'s postconditions that specifies that `A` is set to `0`. @@ -726,12 +725,12 @@ postconditions, _even if the function that calls the override never uses the static items_. For example, if the `foo` function were instead defined like this: -~~~ rust +:::{code-block} rust pub fn foo() -> u32 { side_effect(); 42 } -~~~ +::: Then it is still required for `side_effect_spec` to specify what `A`'s value will be in its postconditions, despite the fact that this has no effect on the @@ -744,7 +743,7 @@ point to allocated memory before they are called. The `llvm_alloc` command allows you to specify that a function expects a particular pointer to refer to an allocated region appropriate for a specific type. -* `llvm_alloc : LLVMType -> LLVMSetup SetupValue` +- `llvm_alloc : LLVMType -> LLVMSetup SetupValue` This command returns a `SetupValue` consisting of a pointer to the allocated space, which can be used wherever a pointer-valued @@ -757,19 +756,19 @@ specifies that the function itself performs an allocation. When using the experimental Java implementation, separate functions exist for specifying that arrays or objects are allocated: -* `jvm_alloc_array : Int -> JavaType -> JVMSetup JVMValue` specifies an +- `jvm_alloc_array : Int -> JavaType -> JVMSetup JVMValue` specifies an array of the given concrete size, with elements of the given type. -* `jvm_alloc_object : String -> JVMSetup JVMValue` specifies an object +- `jvm_alloc_object : String -> JVMSetup JVMValue` specifies an object of the given class name. The experimental MIR implementation also has a `mir_alloc` function, which behaves similarly to `llvm_alloc`. `mir_alloc` creates an immutable reference, but there is also a `mir_alloc_mut` function for creating a mutable reference: -* `mir_alloc : MIRType -> MIRSetup MIRValue` +- `mir_alloc : MIRType -> MIRSetup MIRValue` -* `mir_alloc_mut : MIRType -> MIRSetup MIRValue` +- `mir_alloc_mut : MIRType -> MIRSetup MIRValue` MIR tracks whether references are mutable or immutable at the type level, so it is important to use the right allocation command for a given reference type. @@ -778,17 +777,17 @@ In LLVM, it's also possible to construct fresh pointers that do not point to allocated memory (which can be useful for functions that manipulate pointers but not the values they point to): -* `llvm_fresh_pointer : LLVMType -> LLVMSetup SetupValue` +- `llvm_fresh_pointer : LLVMType -> LLVMSetup SetupValue` The NULL pointer is called `llvm_null` in LLVM and `jvm_null` in JVM: -* `llvm_null : SetupValue` -* `jvm_null : JVMValue` +- `llvm_null : SetupValue` +- `jvm_null : JVMValue` One final, slightly more obscure command is the following: -* `llvm_alloc_readonly : LLVMType -> LLVMSetup SetupValue` +- `llvm_alloc_readonly : LLVMType -> LLVMSetup SetupValue` This works like `llvm_alloc` except that writes to the space allocated are forbidden. This can be useful for specifying that a @@ -812,7 +811,7 @@ the _points-to_ family of commands. LLVM verification primarily uses the `llvm_points_to` command: -* `llvm_points_to : SetupValue -> SetupValue -> LLVMSetup ()` +- `llvm_points_to : SetupValue -> SetupValue -> LLVMSetup ()` takes two `SetupValue` arguments, the first of which must be a pointer, and states that the memory specified by that pointer should contain the value given in the second argument (which may be any type of @@ -826,7 +825,7 @@ Occasionally, because C programs frequently reinterpret memory of one type as another through casts, it can be useful to specify that a pointer points to a value that does not agree with its static type. -* `llvm_points_to_untyped : SetupValue -> SetupValue -> +- `llvm_points_to_untyped : SetupValue -> SetupValue -> LLVMSetup ()` works like `llvm_points_to` but omits type checking. Rather than omitting type checking across the board, we introduced this additional function to make it clear when a type @@ -840,15 +839,15 @@ One category consists of the `jvm_*_is` commands, which allow users to directly specify what value a heap object points to. There are specific commands for each type of JVM heap object: -* `jvm_array_is : JVMValue -> Term -> JVMSetup ()` declares that an array (the +- `jvm_array_is : JVMValue -> Term -> JVMSetup ()` declares that an array (the first argument) contains a sequence of values (the second argument). -* `jvm_elem_is : JVMValue -> Int -> JVMValue -> JVMSetup ()` declares that an +- `jvm_elem_is : JVMValue -> Int -> JVMValue -> JVMSetup ()` declares that an array (the first argument) has an element at the given index (the second argument) containing the given value (the third argument). -* `jvm_field_is : JVMValue -> String -> JVMValue -> JVMSetup ()` declares that +- `jvm_field_is : JVMValue -> String -> JVMValue -> JVMSetup ()` declares that an object (the first argument) has a field (the second argument) containing the given value (the third argument). -* `jvm_static_field_is : String -> JVMValue -> JVMSetup ()` declares that a +- `jvm_static_field_is : String -> JVMValue -> JVMSetup ()` declares that a named static field (the first argument) contains the given value (the second argument). By default, the field name is assumed to belong to the same class as the method being specified. Static fields belonging to other classes can @@ -861,16 +860,16 @@ unspecified. These are useful for writing partial specifications for methods that modify some heap value, but without saying anything specific about the new value. -* `jvm_modifies_array : JVMValue -> JVMSetup ()` -* `jvm_modifies_elem : JVMValue -> Int -> JVMSetup ()` -* `jvm_modifies_field : JVMValue -> String -> JVMSetup ()` -* `jvm_modifies_static_field : String -> JVMSetup ()` +- `jvm_modifies_array : JVMValue -> JVMSetup ()` +- `jvm_modifies_elem : JVMValue -> Int -> JVMSetup ()` +- `jvm_modifies_field : JVMValue -> String -> JVMSetup ()` +- `jvm_modifies_static_field : String -> JVMSetup ()` ### MIR heap values MIR verification has a single `mir_points_to` command: -* `mir_points_to : MIRValue -> MIRValue -> MIRSetup ()` +- `mir_points_to : MIRValue -> MIRValue -> MIRSetup ()` takes two `SetupValue` arguments, the first of which must be a reference, and states that the memory specified by that reference should contain the value given in the second argument (which may be any type of @@ -882,11 +881,11 @@ The commands mentioned so far give us no way to specify the values of compound types (arrays or `struct`s). Compound values can be dealt with either piecewise or in their entirety. -* `llvm_elem : SetupValue -> Int -> SetupValue` yields a pointer to +- `llvm_elem : SetupValue -> Int -> SetupValue` yields a pointer to an internal element of a compound value. For arrays, the `Int` parameter is the array index. For `struct` values, it is the field index. -* `llvm_field : SetupValue -> String -> SetupValue` yields a pointer +- `llvm_field : SetupValue -> String -> SetupValue` yields a pointer to a particular named `struct` field, if debugging information is available in the bitcode. @@ -896,8 +895,8 @@ Sometimes, however, it is more convenient to specify all array elements or field values at once. The `llvm_array_value` and `llvm_struct_value` functions construct compound values from lists of element values. -* `llvm_array_value : [SetupValue] -> SetupValue` -* `llvm_struct_value : [SetupValue] -> SetupValue` +- `llvm_array_value : [SetupValue] -> SetupValue` +- `llvm_struct_value : [SetupValue] -> SetupValue` To specify an array or struct in which each element or field is symbolic, it would be possible, but tedious, to use a large combination @@ -905,7 +904,7 @@ of `llvm_fresh_var` and `llvm_elem` or `llvm_field` commands. However, the following function can simplify the common case where you want every element or field to have a fresh value. -* `llvm_fresh_expanded_val : LLVMType -> LLVMSetup SetupValue` +- `llvm_fresh_expanded_val : LLVMType -> LLVMSetup SetupValue` The `llvm_struct_value` function normally creates a `struct` whose layout obeys the alignment rules of the platform specified in the LLVM file @@ -913,14 +912,14 @@ being analyzed. Structs in LLVM can explicitly be "packed", however, so that every field immediately follows the previous in memory. The following command will create values of such types: -* `llvm_packed_struct_value : [SetupValue] -> SetupValue` +- `llvm_packed_struct_value : [SetupValue] -> SetupValue` C programs will sometimes make use of pointer casting to implement various kinds of polymorphic behaviors, either via direct pointer casts, or by using `union` types to codify the pattern. To reason about such cases, the following operation is useful. -* `llvm_cast_pointer : SetupValue -> LLVMType -> SetupValue` +- `llvm_cast_pointer : SetupValue -> LLVMType -> SetupValue` This function function casts the type of the input value (which must be a pointer) so that it points to values of the given type. This mainly @@ -933,7 +932,7 @@ cases. We can automate the process of applying pointer casts if we have debug information avaliable: -* `llvm_union : SetupValue -> String -> SetupValue` +- `llvm_union : SetupValue -> String -> SetupValue` Given a pointer setup value, this attempts to select the named union branch and cast the type of the pointer. For this to work, debug @@ -946,19 +945,19 @@ In the experimental Java verification implementation, the following functions can be used to state the equivalent of a combination of `llvm_points_to` and either `llvm_elem` or `llvm_field`. -* `jvm_elem_is : JVMValue -> Int -> JVMValue -> JVMSetup ()` specifies +- `jvm_elem_is : JVMValue -> Int -> JVMValue -> JVMSetup ()` specifies the value of an array element. -* `jvm_field_is : JVMValue -> String -> JVMValue -> JVMSetup ()` +- `jvm_field_is : JVMValue -> String -> JVMValue -> JVMSetup ()` specifies the name of an object field. In the experimental MIR verification implementation, the following functions construct compound values: -* `mir_array_value : MIRType -> [MIRValue] -> MIRValue` constructs an array +- `mir_array_value : MIRType -> [MIRValue] -> MIRValue` constructs an array of the given type whose elements consist of the given values. Supplying the element type is necessary to support length-0 arrays. -* `mir_enum_value : MIRAdt -> String -> [MIRValue] -> MIRValue` constructs an +- `mir_enum_value : MIRAdt -> String -> [MIRValue] -> MIRValue` constructs an enum using a particular enum variant. The `MIRAdt` arguments determines what enum type to create, the `String` value determines the name of the variant to use, and the `[MIRValue]` list are the values to use as elements in the @@ -967,20 +966,20 @@ construct compound values: See the "Finding MIR algebraic data types" section (as well as the "Enums" subsection) for more information on how to compute a `MIRAdt` value to pass to `mir_enum_value`. -* `mir_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section below. -* `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the +- `mir_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section below. +- `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the "MIR slices" section below. -* `mir_str_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section +- `mir_str_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section below. -* `mir_str_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the +- `mir_str_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the "MIR slices" section below. -* `mir_struct_value : MIRAdt -> [MIRValue] -> MIRValue` construct a struct +- `mir_struct_value : MIRAdt -> [MIRValue] -> MIRValue` construct a struct with the given list of values as elements. The `MIRAdt` argument determines what struct type to create. See the "Finding MIR algebraic data types" section for more information on how to compute a `MIRAdt` value to pass to `mir_struct_value`. -* `mir_tuple_value : [MIRValue] -> MIRValue` construct a tuple with the given +- `mir_tuple_value : [MIRValue] -> MIRValue` construct a tuple with the given list of values as elements. To specify a compound value in which each element or field is symbolic, it @@ -989,7 +988,7 @@ invocations in conjunction with the commands above. However, the following function can simplify the common case where you want every element or field to have a fresh value: -* `mir_fresh_expanded_value : String -> MIRType -> MIRSetup MIRValue` +- `mir_fresh_expanded_value : String -> MIRType -> MIRSetup MIRValue` The `String` argument denotes a prefix to use when generating the names of fresh symbolic variables. The `MIRType` can be any type, with the exception of @@ -1009,13 +1008,13 @@ SAW currently supports taking slices of arrays and strings. The following commands are used to construct slices of arrays: -* `mir_slice_value : MIRValue -> MIRValue`: the SAWScript expression +- `mir_slice_value : MIRValue -> MIRValue`: the SAWScript expression `mir_slice_value base` is equivalent to the Rust expression `&base[..]`, i.e., a slice of the entirety of `base`. `base` must be a reference to an array value (`&[T; N]` or `&mut [T; N]`), not an array itself. The type of `mir_slice_value base` will be `&[T]` (if `base` is an immutable reference) or `&mut [T]` (if `base` is a mutable reference). -* `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: the SAWScript +- `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: the SAWScript expression `mir_slice_range_value base start end` is equivalent to the Rust expression `&base[start..end]`, i.e., a slice over a part of `base` which ranges from `start` to `end`. `base` must be a reference to an array value @@ -1030,16 +1029,16 @@ The following commands are used to construct slices of arrays: As an example of how to use these functions, consider this Rust function, which accepts an arbitrary slice as an argument: -~~~~ rust +:::{code-block} rust pub fn f(s: &[u32]) -> u32 { s[0] + s[1] } -~~~~ +::: We can write a specification that passes a slice to the array `[1, 2, 3, 4, 5]` as an argument to `f`: -~~~~ +:::{code-block} sawscript let f_spec_1 = do { a <- mir_alloc (mir_array 5 mir_u32); mir_points_to a (mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}); @@ -1048,13 +1047,13 @@ let f_spec_1 = do { mir_return (mir_term {{ 3 : [32] }}); }; -~~~~ +::: Alternatively, we can write a specification that passes a part of this array over the range `[1..3]`, i.e., ranging from second element to the fourth. Because this is a half-open range, the resulting slice has length 2: -~~~~ +:::{code-block} sawscript let f_spec_2 = do { a <- mir_alloc (mir_array 5 mir_u32); mir_points_to a (mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}); @@ -1063,13 +1062,13 @@ let f_spec_2 = do { mir_return (mir_term {{ 5 : [32] }}); }; -~~~~ +::: Note that we are passing _references_ of arrays to `mir_slice_value` and `mir_slice_range_value`. It would be an error to pass a bare array to these functions, so the following specification would be invalid: -~~~~ +::: let f_fail_spec_ = do { let arr = mir_term {{ [1, 2, 3, 4, 5] : [5][32] }}; @@ -1077,7 +1076,7 @@ let f_fail_spec_ = do { mir_return (mir_term {{ 3 : [32] }}); }; -~~~~ +::: Note that The `mir_slice_range_value` function must accept bare `Int` arguments to specify the lower and upper bounds of the range. A consequence of this @@ -1090,13 +1089,13 @@ GitHub](https://github.com/GaloisInc/saw-script/issues). In addition to slices of arrays (i.e., of type `&[T]`), SAW also supports slices of strings (i.e., of type `&str`) through the following commands: -* `mir_str_slice_value : MIRValue -> MIRValue`: the SAWScript expression +- `mir_str_slice_value : MIRValue -> MIRValue`: the SAWScript expression `mir_str_slice_value base` is equivalent to the Rust expression `&base[..]`, i.e., a slice of the entirety of `base`. `base` must be a reference to an array of bytes (`&[u8; N]` or `&mut [u8; N]`), not an array itself. The type of `mir_str_slice_value base` will be `&str` (if `base` is an immutable reference) or `&mut str` (if `base` is a mutable reference). -* `mir_str_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: the +- `mir_str_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: the SAWScript expression `mir_slice_range_value base start end` is equivalent to the Rust expression `&base[start..end]`, i.e., a slice over a part of `base` which ranges from `start` to `end`. `base` must be a reference to an array of @@ -1113,22 +1112,22 @@ One unusual requirement about `mir_str_slice_value` and `&[u8; N]`, i.e., a reference to an array of bytes. This is an artifact of the way that strings are encoded in Cryptol. The following Cryptol expressions: -* `"A"` -* `"123"` -* `"Hello World"` +- `"A"` +- `"123"` +- `"Hello World"` Have the following types: -* `[1][8]` -* `[3][8]` -* `[11][8]` +- `[1][8]` +- `[3][8]` +- `[11][8]` This is because Cryptol strings are syntactic shorthand for sequences of bytes. The following Cryptol expressions are wholly equivalent: -* `[0x41]` -* `[0x31, 0x32, 0x33]` -* `[0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64]` +- `[0x41]` +- `[0x31, 0x32, 0x33]` +- `[0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64]` These represent the strings in the extended ASCII character encoding. The Cryptol sequence type `[N][8]` is equivalent to the Rust type `[u8; N]`, so the @@ -1148,16 +1147,16 @@ where a `&[u8]` value is expected (and vice versa). As an example of how to write specifications involving string slices, consider this Rust function: -~~~ rust +:::{code-block} rust pub fn my_len(s: &str) -> usize { s.len() } -~~~ +::: We can use `mir_str_slice_value` to write a specification for `my_len` when it is given the string `"hello"` as an argument: -~~~ +:::{code-block} sawscript let my_len_spec = do { s <- mir_alloc (mir_array 5 mir_u8); mir_points_to s (mir_term {{ "hello" }}); @@ -1166,7 +1165,7 @@ let my_len_spec = do { mir_return (mir_term {{ 5 : [32] }}); }; -~~~ +::: Currently, Cryptol only supports characters that can be encoded in a single byte. As a result, it is not currently possible to take slices of strings with @@ -1180,15 +1179,15 @@ SAW makes no attempt to ensure that string slices over a particular range aligns with UTF-8 character boundaries. For example, the following Rust code would panic: -~~~ rust +:::{code-block} rust let rosu: &str = "roșu"; let s: &str = &rosu[0..3]; println!("{:?}", s); -~~~ +::: -~~~ +:::{code-block} console thread 'main' panicked at 'byte index 3 is not a char boundary; it is inside 'ș' (bytes 2..4) of `roșu`' -~~~ +::: On the other hand, SAW will allow you define a slice of the form `mir_str_slice_range r 0 3`, where `r` is a reference to `"ro\200\153u"`. It is @@ -1202,7 +1201,7 @@ types_, or ADTs for short. ADTs have identifiers to tell them apart, and a single ADT declaration can give rise to multiple identifiers depending on how the declaration is used. For example: -~~~~ rust +:::{code-block} rust pub struct S { pub x: A, pub y: B, @@ -1221,7 +1220,7 @@ pub fn g() -> S { y: 4, } } -~~~~ +::: This program as a single `struct` declaration `S`, which is used in the functions `f` and `g`. Note that `S`'s declaration is _polymorphic_, as it uses @@ -1231,14 +1230,14 @@ of an ADT gives rise to its own identifier. In the example above, this might mean that the following identifiers are created when this code is compiled with `mir-json`: -* `S` gives rise to `example/abcd123::S::_adt456` -* `S` gives rise to `example/abcd123::S::_adt789` +- `S` gives rise to `example/abcd123::S::_adt456` +- `S` gives rise to `example/abcd123::S::_adt789` The suffix `_adt` is autogenerated by `mir-json` and is typically difficult for humans to guess. For this reason, we offer a command to look up an ADT more easily: -* `mir_find_adt : MIRModule -> String -> [MIRType] -> MIRAdt` consults the +- `mir_find_adt : MIRModule -> String -> [MIRType] -> MIRAdt` consults the given `MIRModule` to find an algebraic data type (`MIRAdt`). It uses the given `String` as an identifier and the given MIRTypes as the types to instantiate the type parameters of the ADT. If such a `MIRAdt` cannot be found in the @@ -1250,12 +1249,12 @@ is expected to adhere to the identifier conventions described in the "Running a MIR-based verification" section. For instance, the following two lines will look up `S` and `S` from the example above as `MIRAdt`s: -~~~~ +:::{code-block} sawscript m <- mir_load_module "example.linked-mir.json"; let s_8_16 = mir_find_adt m "example::S" [mir_u8, mir_u16]; let s_32_64 = mir_find_adt m "example::S" [mir_u32, mir_u64]; -~~~~ +::: The `mir_adt` command (for constructing a struct type), `mir_struct_value` (for constructing a struct value), and `mir_enum_value` (for constructing an enum @@ -1272,7 +1271,7 @@ enum's variants, so SAW will use this information to look up a variant's identifier from a short name. Here is an example of using `mir_enum_value` in practice: -~~~~ rust +:::{code-block} rust pub fn n() -> Option { None } @@ -1280,9 +1279,9 @@ pub fn n() -> Option { pub fn s(x: u32) -> Option { Some(x) } -~~~~ +::: -~~~~ +:::{code-block} sawscript m <- mir_load_module "example.linked-mir.json"; let option_u32 = mir_find_adt m "core::option::Option" [mir_u32]; @@ -1300,7 +1299,7 @@ let s_spec = do { mir_return (mir_enum_value option_u32 "Some" [mir_term x]); }; -~~~~ +::: Note that `mir_enum_value` can only be used to construct a specific variant. If you need to construct a symbolic enum value that can range over many potential @@ -1312,7 +1311,7 @@ Rust ADTs can have both type parameters as well as _lifetime_ parameters. The following Rust code declares a lifetime parameter `'a` on the struct `S`, as well on the function `f` that computes an `S` value: -~~~~ rust +:::{code-block} rust pub struct S<'a> { pub x: &'a u32, } @@ -1320,7 +1319,7 @@ pub struct S<'a> { pub fn f<'a>(y: &'a u32) -> S<'a> { S { x: y } } -~~~~ +::: When `mir-json` compiles a piece of Rust code that contains lifetime parameters, it will instantiate all of the lifetime parameters with a @@ -1330,9 +1329,9 @@ indicate to SAW that the lifetime parameter is instantiated with `lifetime`. In order to do so, use `mir_lifetime`. For example, here is how to look up `S` with `'a` instantiated to `lifetime`: -~~~~ +:::{code-block} sawscript s_adt = mir_find_adt m "example::S" [mir_lifetime] -~~~~ +::: Note that this part of SAW's design is subject to change in the future. Ideally, users would not have to care about lifetimes at all at the MIR level; @@ -1345,12 +1344,12 @@ discussion on this point. If that issue is fixed, then we will likely remove SAW has experimental support for specifying `struct`s with bitfields, such as in the following example: -~~~~ c +:::{code-block} c struct s { uint8_t x:1; uint8_t y:1; }; -~~~~ +::: Normally, a `struct` with two `uint8_t` fields would have an overall size of two bytes. However, because the `x` and `y` fields are declared with bitfield @@ -1361,17 +1360,17 @@ special care is required to write SAW specifications involving bitfields. For this reason, there is a dedicated `llvm_points_to_bitfield` function for this purpose: -* `llvm_points_to_bitfield : SetupValue -> String -> SetupValue -> LLVMSetup ()` +- `llvm_points_to_bitfield : SetupValue -> String -> SetupValue -> LLVMSetup ()` The type of `llvm_points_to_bitfield` is similar that of `llvm_points_to`, except that it takes the name of a field within a bitfield as an additional argument. For example, here is how to assert that the `y` field in the `struct` example above should be `0`: -~~~~ +:::{code-block} sawscript ss <- llvm_alloc (llvm_alias "struct.s"); llvm_points_to_bitfield ss "y" (llvm_term {{ 0 : [1] }}); -~~~~ +::: Note that the type of the right-hand side value (`0`, in this example) must be a bitvector whose length is equal to the size of the field within the @@ -1380,10 +1379,10 @@ must be of type `[1]`. Note that the following specification is _not_ equivalent to the one above: -~~~~ +:::{code-block} sawscript ss <- llvm_alloc (llvm_alias "struct.s"); llvm_points_to (llvm_field ss "y") (llvm_term {{ 0 : [1] }}); -~~~~ +::: `llvm_points_to` works quite differently from `llvm_points_to_bitfield` under the hood, so using `llvm_points_to` on bitfields will almost certainly not work @@ -1392,7 +1391,7 @@ as expected. In order to use `llvm_points_to_bitfield`, one must also use the `enable_lax_loads_and_stores` command: -* `enable_lax_loads_and_stores: TopLevel ()` +- `enable_lax_loads_and_stores: TopLevel ()` Both `llvm_points_to_bitfield` and `enable_lax_loads_and_stores` are experimental commands, so these also require using `enable_experimental` before @@ -1421,7 +1420,7 @@ SAW supports verifying LLVM and MIR specifications involving global variables. Mutable global variables that are accessed in a function must first be allocated by calling `llvm_alloc_global` on the name of the global. -* `llvm_alloc_global : String -> LLVMSetup ()` +- `llvm_alloc_global : String -> LLVMSetup ()` This ensures that all global variables that might influence the function are accounted for explicitly in the specification: if `llvm_alloc_global` is @@ -1438,7 +1437,7 @@ require a call to `llvm_alloc_global`. Pointers to global variables or functions can be accessed with `llvm_global`: -* `llvm_global : String -> SetupValue` +- `llvm_global : String -> SetupValue` Like the pointers returned by `llvm_alloc`, however, these aren't initialized at the beginning of symbolic -- setting global variables may @@ -1449,7 +1448,7 @@ To understand the issues surrounding global variables, consider the following C code: -~~~ +:::{code-block} c int x = 0; int f(int y) { @@ -1461,12 +1460,12 @@ int g(int z) { x = x + 2; return x + z; } -~~~ +::: One might initially write the following specifications for `f` and `g`: -~~~ +:::{code-block} sawscript m <- llvm_load_module "./test.bc"; f_spec <- llvm_verify m "f" [] true (do { @@ -1480,7 +1479,7 @@ g_spec <- llvm_llvm_verify m "g" [] true (do { llvm_execute_func [llvm_term z]; llvm_return (llvm_term {{ 2 + z : [32] }}); }) abc; -~~~ +::: If globals were always initialized at the beginning of verification, both of these specs would be provable. However, the results wouldn't @@ -1490,14 +1489,14 @@ z + 3` for all `z`, because both `f` and `g` modify the global variable To deal with this, we can use the following function: -* `llvm_global_initializer : String -> SetupValue` returns the value +- `llvm_global_initializer : String -> SetupValue` returns the value of the constant global initializer for the named global variable. Given this function, the specifications for `f` and `g` can make this reliance on the initial value of `x` explicit: -~~~ +:::{code-block} sawscript m <- llvm_load_module "./test.bc"; @@ -1514,7 +1513,7 @@ f_spec <- llvm_verify m "f" [] true (do { llvm_execute_func [llvm_term y]; llvm_return (llvm_term {{ 1 + y : [32] }}); }) abc; -~~~ +::: which initializes `x` to whatever it is initialized to in the C code at the beginning of verification. This specification is now safe for @@ -1532,7 +1531,7 @@ a `String` representing a static item's identifier, and this identifier is expected to adhere to the naming conventions outlined in the "Running a MIR-based verification" section: -* `mir_static : String -> MIRValue` +- `mir_static : String -> MIRValue` References to static values can be initialized with the `mir_points_to` command, just like with other forms of references. Immutable static items @@ -1545,12 +1544,12 @@ The `mir_static_initializer` function can be used to access the initial value of a static item in a MIR program. Like with `mir_static`, the `String` supplied as an argument must be a valid identifier: -* `mir_static_initializer : String -> MIRValue`. +- `mir_static_initializer : String -> MIRValue`. As an example of how to use these functions, here is a Rust program involving static items: -~~~ rust +:::{code-block} rust // statics.rs static S1: u8 = 1; static mut S2: u8 = 2; @@ -1562,11 +1561,11 @@ pub fn f() -> u8 { let s2 = unsafe { S2 }; S1 + s2 } -~~~ +::: We can write a specification for `f` like so: -~~~ +:::{code-block} sawscript // statics.saw enable_experimental; @@ -1584,7 +1583,7 @@ let f_spec = do { m <- mir_load_module "statics.linked-mir.json"; mir_verify m "statics::f" [] false f_spec z3; -~~~ +::: In order to use a specification involving mutable static items for compositional verification, it is required to specify the value of all mutable @@ -1601,15 +1600,15 @@ rise to specific final conditions. For these cases, you can specify an arbitrary predicate as a precondition or post-condition, using any values in scope at the time. -* `llvm_precond : Term -> LLVMSetup ()` -* `llvm_postcond : Term -> LLVMSetup ()` -* `llvm_assert : Term -> LLVMSetup ()` -* `jvm_precond : Term -> JVMSetup ()` -* `jvm_postcond : Term -> JVMSetup ()` -* `jvm_assert : Term -> JVMSetup ()` -* `mir_precond : Term -> MIRSetup ()` -* `mir_postcond : Term -> MIRSetup ()` -* `mir_assert : Term -> MIRSetup ()` +- `llvm_precond : Term -> LLVMSetup ()` +- `llvm_postcond : Term -> LLVMSetup ()` +- `llvm_assert : Term -> LLVMSetup ()` +- `jvm_precond : Term -> JVMSetup ()` +- `jvm_postcond : Term -> JVMSetup ()` +- `jvm_assert : Term -> JVMSetup ()` +- `mir_precond : Term -> MIRSetup ()` +- `mir_postcond : Term -> MIRSetup ()` +- `mir_assert : Term -> MIRSetup ()` These commands take `Term` arguments, and therefore cannot describe the values of pointers. The "assert" variants will work in either pre- or post-conditions, @@ -1618,9 +1617,9 @@ invariants that make sense in both phases. The `{llvm,jvm,mir}_equal` commands state that two values should be equal, and can be used in either the initial or the final state. -* `llvm_equal : SetupValue -> SetupValue -> LLVMSetup ()` -* `jvm_equal : JVMValue -> JVMValue -> JVMSetup ()` -* `mir_equal : MIRValue -> MIRValue -> MIRSetup ()` +- `llvm_equal : SetupValue -> SetupValue -> LLVMSetup ()` +- `jvm_equal : JVMValue -> JVMValue -> JVMSetup ()` +- `mir_equal : MIRValue -> MIRValue -> MIRSetup ()` The use of `{llvm,jvm,mir}_equal` can also sometimes lead to more efficient symbolic execution when the predicate of interest is an equality. @@ -1635,16 +1634,10 @@ tactic](proofs-about-terms.md#finishing-proofs-without-external-solvers) omits p simulation of the function. To skip simulation altogether, one can use one of the following commands: -~~~ -llvm_unsafe_assume_spec : - LLVMModule -> String -> LLVMSetup () -> TopLevel CrucibleMethodSpec - -jvm_unsafe_assume_spec : - JavaClass -> String -> JVMSetup () -> TopLevel JVMMethodSpec -mir_unsafe_assume_spec : - MIRModule -> String -> MIRSetup () -> TopLevel MIRSpec -~~~ +- `llvm_unsafe_assume_spec : LLVMModule -> String -> LLVMSetup () -> TopLevel CrucibleMethodSpec` +- `jvm_unsafe_assume_spec : JavaClass -> String -> JVMSetup () -> TopLevel JVMMethodSpec` +- `mir_unsafe_assume_spec : MIRModule -> String -> MIRSetup () -> TopLevel MIRSpec` ## A Heap-Based Example @@ -1655,19 +1648,19 @@ of each vector are encapsulated together in a `struct`. The dot product can be concisely specified in Cryptol as follows: -~~~~ +:::{code-block} cryptol dotprod : {n, a} (fin n, fin a) => [n][a] -> [n][a] -> [a] dotprod xs ys = sum (zip (*) xs ys) -~~~~ +::: To implement this in C, let's first consider the type of vectors: -~~~~ c +:::{code-block} c typedef struct { uint32_t *elts; uint32_t size; } vec_t; -~~~~ +::: This struct contains a pointer to an array of 32-bit elements, and a 32-bit value indicating how many elements that array has. @@ -1676,7 +1669,7 @@ We can compute the dot product of two of these vectors with the following C code (which uses the size of the shorter vector if they differ in size). -~~~~ c +:::{code-block} c uint32_t dotprod_struct(vec_t *x, vec_t *y) { uint32_t size = MIN(x->size, y->size); uint32_t res = 0; @@ -1685,7 +1678,7 @@ uint32_t dotprod_struct(vec_t *x, vec_t *y) { } return res; } -~~~~ +::: The entirety of this implementation can be found in the `examples/llvm/dotprod_struct.c` file in the `saw-script` repository. @@ -1695,13 +1688,13 @@ of utility functions (which are generally useful for many heap-manipulating programs). First, combining allocation and initialization to a specific value can make many scripts more concise: -~~~~ +:::{code-block} sawscript let alloc_init ty v = do { p <- llvm_alloc ty; llvm_points_to p v; return p; }; -~~~~ +::: This creates a pointer `p` pointing to enough space to store type `ty`, and then indicates that the pointer points to value `v` (which should be @@ -1710,13 +1703,13 @@ of that same type). A common case for allocation and initialization together is when the initial value should be entirely symbolic. -~~~~ +:::{code-block} sawscript let ptr_to_fresh n ty = do { x <- llvm_fresh_var n ty; p <- alloc_init ty (llvm_term x); return (x, p); }; -~~~~ +::: This function returns the pointer just allocated along with the fresh symbolic value it points to. @@ -1724,7 +1717,7 @@ symbolic value it points to. Given these two utility functions, the `dotprod_struct` function can be specified as follows: -~~~~ +:::{code-block} sawscript let dotprod_spec n = do { let nt = llvm_term {{ `n : [32] }}; (xs, xsp) <- ptr_to_fresh "xs" (llvm_array n (llvm_int 32)); @@ -1736,7 +1729,7 @@ let dotprod_spec n = do { llvm_execute_func [xp, yp]; llvm_return (llvm_term {{ dotprod xs ys }}); }; -~~~~ +::: Any instantiation of this specification is for a specific vector length `n`, and assumes that both input vectors have that length. That length @@ -1749,14 +1742,14 @@ alongside `dotprod_struct.c`. Running this script results in the following: -~~~~ +:::{code-block} console Loading file "dotprod_struct.saw" Proof succeeded! dotprod_struct Registering override for `dotprod_struct` variant `dotprod_struct` Symbolic simulation completed with side conditions. Proof succeeded! dotprod_wrap -~~~~ +::: ## Using Ghost State @@ -1764,11 +1757,11 @@ In some cases, information relevant to verification is not directly present in the concrete state of the program being verified. This can happen for at least two reasons: -* When providing specifications for external functions, for which source +- When providing specifications for external functions, for which source code is not present. The external code may read and write global state that is not directly accessible from the code being verified. -* When the abstract specification of the program naturally uses a +- When the abstract specification of the program naturally uses a different representation for some data than the concrete implementation in the code being verified does. @@ -1777,15 +1770,15 @@ thought of as additional global state that is visible only to the verifier. Ghost state with a given name can be declared at the top level with the following function: -* `declare_ghost_state : String -> TopLevel Ghost` +- `declare_ghost_state : String -> TopLevel Ghost` Ghost state variables do not initially have any particluar type, and can store data of any type. Given an existing ghost variable the following functions can be used to specify its value: -* `llvm_ghost_value : Ghost -> Term -> LLVMSetup ()` -* `jvm_ghost_value : Ghost -> Term -> JVMSetup ()` -* `mir_ghost_value : Ghost -> Term -> MIRSetup ()` +- `llvm_ghost_value : Ghost -> Term -> LLVMSetup ()` +- `jvm_ghost_value : Ghost -> Term -> JVMSetup ()` +- `mir_ghost_value : Ghost -> Term -> MIRSetup ()` These can be used in either the pre state or the post state, to specify the value of ghost state either before or after the execution of the function, @@ -1835,7 +1828,7 @@ We first define the function allocated and initialized to a value `v` of type `ty`. `alloc_init_readonly` does the same, except the memory allocated cannot be written to. -~~~~ +:::{code-block} sawscript import "Salsa20.cry"; let alloc_init ty v = do { @@ -1849,7 +1842,7 @@ let alloc_init_readonly ty v = do { llvm_points_to p (llvm_term v); return p; }; -~~~~ +::: We now define `ptr_to_fresh : String -> LLVMType -> LLVMSetup (Term, SetupValue)`. @@ -1859,7 +1852,7 @@ variable `x` of type `ty` and a pointer `p` to it. `n` specifies the name that SAW should use when printing `x`. `ptr_to_fresh_readonly` does the same, but returns a pointer to space that cannot be written to. -~~~~ +:::{code-block} sawscript let ptr_to_fresh n ty = do { x <- llvm_fresh_var n ty; p <- alloc_init ty x; @@ -1871,7 +1864,7 @@ let ptr_to_fresh_readonly n ty = do { p <- alloc_init_readonly ty x; return (x, p); }; -~~~~ +::: Finally, we define `oneptr_update_func : String -> LLVMType -> Term -> LLVMSetup ()`. @@ -1882,13 +1875,13 @@ value of type `ty` and mutates the contents of that memory. The specification asserts that the contents of this memory after execution are equal to the value given by the application of `f` to the value in that memory before execution. -~~~~ +:::{code-block} sawscript let oneptr_update_func n ty f = do { (x, p) <- ptr_to_fresh n ty; llvm_execute_func [p]; llvm_points_to p (llvm_term {{ f x }}); }; -~~~~ +::: #### The `quarterround` operation @@ -1902,7 +1895,7 @@ postcondition/return stage, the expected values are computed using the trusted Cryptol implementation and it is asserted that the pointers do in fact point to these expected values. -~~~~ +:::{code-block} sawscript let quarterround_setup : LLVMSetup () = do { (y0, p0) <- ptr_to_fresh "y0" (llvm_int 32); (y1, p1) <- ptr_to_fresh "y1" (llvm_int 32); @@ -1917,7 +1910,7 @@ let quarterround_setup : LLVMSetup () = do { llvm_points_to p2 (llvm_term {{ zs@2 }}); llvm_points_to p3 (llvm_term {{ zs@3 }}); }; -~~~~ +::: #### Simple Updating Functions @@ -1925,7 +1918,7 @@ The following functions can all have their specifications given by the utility function `oneptr_update_func` implemented above, so there isn't much to say about them. -~~~~ +:::{code-block} sawscript let rowround_setup = oneptr_update_func "y" (llvm_array 16 (llvm_int 32)) {{ rowround }}; @@ -1937,19 +1930,19 @@ let doubleround_setup = let salsa20_setup = oneptr_update_func "seq" (llvm_array 64 (llvm_int 8)) {{ Salsa20 }}; -~~~~ +::: #### 32-Bit Key Expansion The next function of substantial behavior that we wish to verify has the following prototype: -~~~~c +:::{code-block} c void s20_expand32( uint8_t *k , uint8_t n[static 16] , uint8_t keystream[static 64] ) -~~~~ +::: This function's specification follows a similar pattern to that of `s20_quarterround`, though for extra assurance we can make sure that the @@ -1960,7 +1953,7 @@ implementation specialized to `a=2`, which does 32-bit key expansion (since the Cryptol implementation can also specialize to `a=1` for 16-bit keys). This specification can easily be changed to work with 16-bit keys. -~~~~ +:::{code-block} sawscript let salsa20_expansion_32 = do { (k, pk) <- ptr_to_fresh_readonly "k" (llvm_array 32 (llvm_int 8)); (n, pn) <- ptr_to_fresh_readonly "n" (llvm_array 16 (llvm_int 8)); @@ -1972,21 +1965,21 @@ let salsa20_expansion_32 = do { let rks = {{ Salsa20_expansion`{a=2}(k, n) }}; llvm_points_to pks (llvm_term rks); }; -~~~~ +::: #### 32-bit Key Encryption Finally, we write a specification for the encryption function itself, which has type -~~~~c +:::{code-block} c enum s20_status_t s20_crypt32( uint8_t *key , uint8_t nonce[static 8] , uint32_t si , uint8_t *buf , uint32_t buflen ) -~~~~ +::: As before, we can ensure this function does not modify the memory pointed to by `key` or `nonce`. We take `si`, the stream index, to be 0. The specification is @@ -1995,7 +1988,7 @@ with the fact that this function returns a status code, we simply specify that we expect a success (status code 0) as the return value in the postcondition stage of the specification. -~~~~ +:::{code-block} sawscript let s20_encrypt32 n = do { (key, pkey) <- ptr_to_fresh_readonly "key" (llvm_array 32 (llvm_int 8)); (v, pv) <- ptr_to_fresh_readonly "nonce" (llvm_array 8 (llvm_int 8)); @@ -2011,7 +2004,7 @@ let s20_encrypt32 n = do { llvm_points_to pm (llvm_term {{ Salsa20_encrypt (key, v, m) }}); llvm_return (llvm_term {{ 0 : [32] }}); }; -~~~~ +::: ### Verifying Everything @@ -2022,7 +2015,7 @@ the top-level function for several sizes; this is due to the limitation that SAW can only operate on finite programs (while Salsa20 can operate on any input size.) -~~~~ +:::{code-block} sawscript let main : TopLevel () = do { m <- llvm_load_module "salsa20.bc"; qr <- llvm_verify m "s20_quarterround" [] false quarterround_setup abc; @@ -2037,7 +2030,7 @@ let main : TopLevel () = do { print "Done!"; }; -~~~~ +::: [^4]: @@ -2056,28 +2049,26 @@ generate a `LLVMSetup ()` spec directly from the type of a Cryptol which is experimental and requires `enable_experimental;` to be run beforehand. -``` -llvm_ffi_setup : Term -> LLVMSetup () -``` +- `llvm_ffi_setup : Term -> LLVMSetup ()` For instance, for the simple imported Cryptol foreign function `foreign add : [32] -> [32] -> [32]` we can obtain a `LLVMSetup` spec simply by writing -``` +:::{code-block} sawscript let add_setup = llvm_ffi_setup {{ add }}; -``` +::: which behind the scenes expands to something like -``` +:::{code-block} sawscript let add_setup = do { in0 <- llvm_fresh_var "in0" (llvm_int 32); in1 <- llvm_fresh_var "in1" (llvm_int 32); llvm_execute_func [llvm_term in0, llvm_term in1]; llvm_return (llvm_term {{ add in0 in1 }}); }; -``` +::: ### Polymorphism @@ -2092,9 +2083,9 @@ specification simply as a SAWScript function in the usual way. For example, for a function `foreign f : {n, m} (fin n, fin m) => [n][32] -> [m][32]`, we can obtain a parameterized `LLVMSetup` spec by -``` +:::{code-block} sawscript let f_setup (n : Int) (m : Int) = llvm_ffi_setup {{ f`{n, m} }}; -``` +::: Note that the `Term` parameter that `llvm_ffi_setup` takes is restricted syntactically to the format described above (``{{ fun`{tyArg0, tyArg1, @@ -2120,9 +2111,9 @@ The resulting `LLVMSetup ()` spec can be used with the existing `LLVMSpec` output from that can be used as an override as usual for further compositional verification. -``` +:::{code-block} sawscript f_ov <- llvm_verify mod "f" [] true (f_setup 3 5) z3; -``` +::: As with the Cryptol FFI itself, SAW does not manage the compilation of the C source implementations of `foreign` functions to LLVM bitcode. For diff --git a/doc/manual/structure-of-sawscript.md b/doc/manual/structure-of-sawscript.md index 9216dd16e7..7dc72dd9fb 100644 --- a/doc/manual/structure-of-sawscript.md +++ b/doc/manual/structure-of-sawscript.md @@ -6,50 +6,50 @@ semicolon. For example, the `print` command displays a textual representation of its argument. Suppose the following text is stored in the file `print.saw`: -~~~~ +:::{code-block} sawscript print 3; -~~~~ +::: The command `saw print.saw` will then yield output similar to the following: -~~~~ +:::{code-block} console Loading module Cryptol Loading file "print.saw" 3 -~~~~ +::: The same code can be run from the interactive REPL: -~~~~ +:::{code-block} console sawscript> print 3; 3 -~~~~ +::: At the REPL, terminating semicolons can be omitted: -~~~~ +:::{code-block} console sawscript> print 3 3 -~~~~ +::: To make common use cases simpler, bare values at the REPL are treated as if they were arguments to `print`: -~~~~ +:::{code-block} console sawscript> 3 3 -~~~~ +::: One SAWScript file can be included in another using the `include` command, which takes the name of the file to be included as an argument. For example: -~~~~ +:::{code-block} console sawscript> include "print.saw" Loading file "print.saw" 3 -~~~~ +::: Typically, included files are used to import definitions, not perform side effects like printing. However, as you can see, if any commands @@ -74,37 +74,37 @@ All values in SAWScript have types, and these types are determined and checked before a program runs (that is, SAWScript is statically typed). The basic types available are similar to those in many other languages. -* The `Int` type represents unbounded mathematical integers. Integer +- The `Int` type represents unbounded mathematical integers. Integer constants can be written in decimal notation (e.g., `42`), hexadecimal notation (`0x2a`), and binary (`0b00101010`). However, unlike many languages, integers in SAWScript are used primarily as constants. Arithmetic is usually encoded in Cryptol, as discussed in the next section. -* The Boolean type, `Bool`, contains the values `true` and `false`, like +- The Boolean type, `Bool`, contains the values `true` and `false`, like in many other languages. As with integers, computations on Boolean values usually occur in Cryptol. -* Values of any type can be aggregated into tuples. For example, the +- Values of any type can be aggregated into tuples. For example, the value `(true, 10)` has the type `(Bool, Int)`. -* Values of any type can also be aggregated into records, which are +- Values of any type can also be aggregated into records, which are exactly like tuples except that their components have names. For example, the value `{ b = true, n = 10 }` has the type `{ b : Bool, n : Int }`. -* A sequence of values of the same type can be stored in a list. For +- A sequence of values of the same type can be stored in a list. For example, the value `[true, false, true]` has the type `[Bool]`. -* Strings of textual characters can be represented in the `String` type. +- Strings of textual characters can be represented in the `String` type. For example, the value `"example"` has type `String`. -* The "unit" type, written `()`, is essentially a placeholder, similar +- The "unit" type, written `()`, is essentially a placeholder, similar to `void` in languages like C and Java. It has only one value, also written `()`. Values of type `()` convey no information. We will show in later sections several cases where this is useful. -* Functions are given types that indicate what type they consume and +- Functions are given types that indicate what type they consume and what type they produce. For example, the type `Int -> Bool` indicates a function that takes an `Int` as input and produces a `Bool` as output. Functions with multiple arguments use multiple arrows. For @@ -121,25 +121,25 @@ in later sections. ## Basic Expression Forms -One of the key forms of top-level command in SAWScript is a *binding*, +One of the key forms of top-level command in SAWScript is a _binding_, introduced with the `let` keyword, which gives a name to a value. For example: -~~~~ +:::{code-block} console sawscript> let x = 5 sawscript> x 5 -~~~~ +::: Bindings can have parameters, in which case they define functions. For instance, the following function takes one parameter and constructs a list containing that parameter as its single element. -~~~~ +:::{code-block} console sawscript> let f x = [x] sawscript> f "text" ["text"] -~~~~ +::: Functions themselves are values and have types. The type of a function that takes an argument of type `a` and returns a result of type `b` is @@ -149,40 +149,40 @@ Function types are typically inferred, as in the example `f` above. In this case, because `f` only creates a list with the given argument, and because it is possible to create a list of any element type, `f` can be applied to an argument of any type. We say, therefore, -that `f` is *polymorphic*. Concretely, we write the type of `f` as `{a} +that `f` is _polymorphic_. Concretely, we write the type of `f` as `{a} a -> [a]`, meaning it takes a value of any type (denoted `a`) and returns a list containing elements of that same type. This means we can also apply `f` to `10`: -~~~~ +:::{code-block} console sawscript> f 10 [10] -~~~~ +::: However, we may want to specify that a function has a more specific type. In this case, we could restrict `f` to operate only on `Int` parameters. -~~~~ +:::{code-block} console sawscript> let f (x : Int) = [x] -~~~~ +::: This will work identically to the original `f` on an `Int` parameter: -~~~~ +:::{code-block} console sawscript> f 10 [10] -~~~~ +::: However, it will fail for a `String` parameter: -~~~~ +:::{code-block} console sawscript> f "text" type mismatch: String -> t.0 and Int -> [Int] at "_" (REPL) mismatched type constructors: String and Int -~~~~ +::: Type annotations can be applied to any expression. The notation `(e : t)` indicates that expression `e` is expected to have type `t` and @@ -194,38 +194,38 @@ Because functions are values, functions can return other functions. We make use of this feature when writing functions of multiple arguments. Consider the function `g`, similar to `f` but with two arguments: -~~~~ +:::{code-block} console sawscript> let g x y = [x, y] -~~~~ +::: Like `f`, `g` is polymorphic. Its type is `{a} a -> a -> [a]`. This -means it takes an argument of type `a` and returns a *function* that +means it takes an argument of type `a` and returns a _function_ that takes an argument of the same type `a` and returns a list of `a` values. We can therefore apply `g` to any two arguments of the same type: -~~~~ +:::{code-block} console sawscript> g 2 3 [2,3] sawscript> g true false [true,false] -~~~~ +::: But type checking will fail if we apply it to two values of different types: -~~~~ +:::{code-block} console sawscript> g 2 false type mismatch: Bool -> t.0 and Int -> [Int] at "_" (REPL) mismatched type constructors: Bool and Int -~~~~ +::: -So far we have used two related terms, *function* and *command*, and we +So far we have used two related terms, _function_ and _command_, and we take these to mean slightly different things. A function is any value with a function type (e.g., `Int -> [Int]`). A command is any value with a special command type (e.g. `TopLevel ()`, as shown below). These special types allow us to restrict command usage to specific contexts, -and are also *parameterized* (like the list type). Most but not all +and are also _parameterized_ (like the list type). Most but not all commands are also functions. The most important command type is the `TopLevel` type, indicating a @@ -241,31 +241,31 @@ primary usage of the `()` type. It can sometimes be useful to bind a sequence of commands together. This can be accomplished with the `do { ... }` construct. For example: -~~~~ +:::{code-block} console sawscript> let print_two = do { print "first"; print "second"; } sawscript> print_two first second -~~~~ +::: The bound value, `print_two`, has type `TopLevel ()`, since that is the type of its last command. Note that in the previous example the printing doesn't occur until `print_two` directly appears at the REPL. The `let` expression does not -cause those commands to run. The construct that *runs* a command is +cause those commands to run. The construct that _runs_ a command is written using the `<-` operator. This operator works like `let` except that it says to run the command listed on the right hand side and bind the result, rather than binding the variable to the command itself. Using `<-` instead of `let` in the previous example yields: -~~~~ +:::{code-block} console sawscript> print_two <- do { print "first"; print "second"; } first second sawscript> print print_two () -~~~~ +::: Here, the `print` commands run first, and then `print_two` gets the value returned by the second `print` command, namely `()`. Any command @@ -279,7 +279,7 @@ example, say we wanted to write a function that would print a message before and after running some arbitrary command and then return the result of that command. We could write: -~~~~ +:::{code-block} sawscript let run_with_message msg c = do { print "Starting."; @@ -291,19 +291,19 @@ let run_with_message msg c = x <- run_with_message "Hello" (return 3); print x; -~~~~ +::: If we put this script in `run.saw` and run it with `saw`, we get something like: -~~~~ +:::{code-block} console Loading module Cryptol Loading file "run.saw" Starting. Hello Done. 3 -~~~~ +::: Note that it ran the first `print` command, then the caller-specified command, then the second `print` command. The result stored in `x` at @@ -317,55 +317,55 @@ with the operating system. The following functions work on lists: -* `concat : {a} [a] -> [a] -> [a]` takes two lists and returns the +- `concat : {a} [a] -> [a] -> [a]` takes two lists and returns the concatenation of the two. -* `head : {a} [a] -> a` returns the first element of a list. +- `head : {a} [a] -> a` returns the first element of a list. -* `tail : {a} [a] -> [a]` returns everything except the first element. +- `tail : {a} [a] -> [a]` returns everything except the first element. -* `length : {a} [a] -> Int` counts the number of elements in a list. +- `length : {a} [a] -> Int` counts the number of elements in a list. -* `null : {a} [a] -> Bool` indicates whether a list is empty (has zero +- `null : {a} [a] -> Bool` indicates whether a list is empty (has zero elements). -* `nth : {a} [a] -> Int -> a` returns the element at the given position, +- `nth : {a} [a] -> Int -> a` returns the element at the given position, with `nth l 0` being equivalent to `head l`. -* `for : {m, a, b} [a] -> (a -> m b) -> m [b]` takes a list and a +- `for : {m, a, b} [a] -> (a -> m b) -> m [b]` takes a list and a function that runs in some command context. The passed command will be called once for every element of the list, in order. Returns a list of all of the results produced by the command. For interacting with the operating system, we have: -* `get_opt : Int -> String` returns the command-line argument to `saw` +- `get_opt : Int -> String` returns the command-line argument to `saw` at the given index. Argument 0 is always the name of the `saw` executable itself, and higher indices represent later arguments. -* `exec : String -> [String] -> String -> TopLevel String` runs an +- `exec : String -> [String] -> String -> TopLevel String` runs an external program given, respectively, an executable name, a list of arguments, and a string to send to the standard input of the program. The `exec` command returns the standard output from the program it executes and prints standard error to the screen. -* `exit : Int -> TopLevel ()` stops execution of the current script and +- `exit : Int -> TopLevel ()` stops execution of the current script and returns the given exit code to the operating system. Finally, there are a few miscellaneous functions and commands: -* `show : {a} a -> String` computes the textual representation of its +- `show : {a} a -> String` computes the textual representation of its argument in the same way as `print`, but instead of displaying the value it returns it as a `String` value for later use in the program. This can be useful for constructing more detailed messages later. -* `str_concat : String -> String -> String` concatenates two `String` +- `str_concat : String -> String -> String` concatenates two `String` values, and can also be useful with `show`. -* `time : {a} TopLevel a -> TopLevel a` runs any other `TopLevel` +- `time : {a} TopLevel a -> TopLevel a` runs any other `TopLevel` command and prints out the time it took to execute. -* `with_time : {a} TopLevel a -> TopLevel (Int, a)` returns both the +- `with_time : {a} TopLevel a -> TopLevel (Int, a)` returns both the original result of the timed command and the time taken to execute it (in milliseconds), without printing anything in the process. @@ -374,38 +374,39 @@ original result of the timed command and the time taken to execute it There is an additional class of things that one may type at the REPL for interactive use: -* `:cd` changes the REPL's current directory. +- `:cd` changes the REPL's current directory. -* `:pwd` prints the REPL's current directory. +- `:pwd` prints the REPL's current directory. -* `:env` displays the values and types of all currently bound +- `:env` displays the values and types of all currently bound variables, including built-in functions and commands. -* `:tenv` displays the expansions of all currently defined type +- `:tenv` displays the expansions of all currently defined type aliases, including those that are built in. -* `:type` or `:t` checks and prints the type of an arbitrary SAWScript +- `:type` or `:t` checks and prints the type of an arbitrary SAWScript expression: -~~~~ +:::{code-block} console sawscript> :t show {a.0} a.0 -> String -~~~~ +::: -* `:help` or `:h` prints the help text for a built-in function or +- `:help` or `:h` prints the help text for a built-in function or command: -~~~~ +:::{code-block} console sawscript> :h show + Description ----------- show : {a} a -> String Convert the value of the given expression to a string. -~~~~ +::: -* `:quit` or `:q` exits the program. +- `:quit` or `:q` exits the program. ## Further built-in functions and commands diff --git a/doc/manual/symbolic-execution.md b/doc/manual/symbolic-execution.md index 532929790d..8f5305e325 100644 --- a/doc/manual/symbolic-execution.md +++ b/doc/manual/symbolic-execution.md @@ -13,7 +13,7 @@ of possible concrete executions. As a concrete example, consider the following C program that returns the maximum of two values: -~~~~ c +:::{code-block} c unsigned int max(unsigned int x, unsigned int y) { if (y > x) { return y; @@ -21,28 +21,28 @@ unsigned int max(unsigned int x, unsigned int y) { return x; } } -~~~~ +::: If you call this function with two concrete inputs, like this: -~~~~ c +:::{code-block} c int r = max(5, 4); -~~~~ +::: then it will assign the value `5` to `r`. However, we can also consider what it will do for *arbitrary* inputs. Consider the following example: -~~~~ c +:::{code-block} c int r = max(a, b); -~~~~ +::: where `a` and `b` are variables with unknown values. It is still possible to describe the result of the `max` function in terms of `a` and `b`. The following expression describes the value of `r`: -~~~~ +:::{code-block} text ite (b > a) b a -~~~~ +::: where `ite` is the "if-then-else" mathematical function, which based on the value of the first argument returns either the second or third. One @@ -65,24 +65,24 @@ is similar to building a test harness for that same code. More specifically, the setup process for a test harness typically takes the following form: -* Initialize or allocate any resources needed by the code. For Java and - LLVM code, this typically means allocating memory and setting the - initial values of variables. +1. Initialize or allocate any resources needed by the code. For Java and + LLVM code, this typically means allocating memory and setting the + initial values of variables. -* Execute the code. +2. Execute the code. -* Check the desired properties of the system state after the code - completes. +3. Check the desired properties of the system state after the code + completes. Accordingly, three pieces of information are particularly relevant to the symbolic execution process, and are therefore needed as input to the symbolic execution system: -* The initial (potentially symbolic) state of the system. +- The initial (potentially symbolic) state of the system. -* The code to execute. +- The code to execute. -* The final state of the system, and which parts of it are relevant to +- The final state of the system, and which parts of it are relevant to the properties being tested. In the following sections, we describe how the Java and LLVM analysis diff --git a/doc/manual/symbolic-termination.md b/doc/manual/symbolic-termination.md index fdd42df083..fdc9175ae3 100644 --- a/doc/manual/symbolic-termination.md +++ b/doc/manual/symbolic-termination.md @@ -18,11 +18,11 @@ Directly comparing the branch condition to a constant can sometimes be enough to ensure termination. For example, in simple, bounded loops like the following, comparison with a constant is sufficient. -~~~~ c +:::{code-block} c for (int i = 0; i < 10; i++) { // do something } -~~~~ +::: In this case, the value of `i` is always concrete, and will eventually reach the value `10`, at which point the branch corresponding to @@ -30,7 +30,7 @@ continuing the loop will be infeasible. As a more complex example, consider the following function: -~~~~ c +:::{code-block} c uint8_t f(uint8_t i) { int done = 0; while (!done) { @@ -39,14 +39,14 @@ uint8_t f(uint8_t i) { } return i; } -~~~~ +::: The loop in this function can only be determined to symbolically terminate if the analysis takes into account algebraic rules about common multiples. Similarly, it can be difficult to prove that a base case is eventually reached for all inputs to a recursive program. -In this particular case, however, the code *is* guaranteed to terminate +In this particular case, however, the code _is_ guaranteed to terminate after a fixed number of iterations (where the number of possible iterations is a function of the number of bits in the integers being used). To show that the last iteration is in fact the last possible one, @@ -54,7 +54,7 @@ it's necessary to do more than just compare the branch condition with a constant. Instead, we can use the same proof tools that we use to ultimately analyze the generated models to, early in the process, prove that certain branch conditions can never be true (i.e., are -*unsatisfiable*). +_unsatisfiable_). Normally, most of the Java and LLVM analysis commands simply compare branch conditions to the constant `True` or `False` to determine whether diff --git a/doc/manual/transforming-term-values.md b/doc/manual/transforming-term-values.md index b2cdc43334..a4237480a8 100644 --- a/doc/manual/transforming-term-values.md +++ b/doc/manual/transforming-term-values.md @@ -13,10 +13,10 @@ Rewriting a `Term` consists of applying one or more _rewrite rules_ to it, resulting in a new `Term`. A rewrite rule in SAW can be specified in multiple ways: - 1. as the definition of a function that can be unfolded, - 1. as a term of Boolean type (or a function returning a Boolean) that +- as the definition of a function that can be unfolded, +- as a term of Boolean type (or a function returning a Boolean) that is an equality statement, and - 1. as a term of _equality type_ with a body that encodes a proof that +- as a term of _equality type_ with a body that encodes a proof that the equality in the type is valid. In each case the term logically consists of two sides and describes a @@ -32,25 +32,25 @@ original term. For example, say we have the following Cryptol function: -~~~~ +:::{code-block} cryptol \(x:[8]) -> (x * 2) + 1 -~~~~ +::: We might for some reason want to replace multiplication by a power of two with a shift. We can describe this replacement using an equality statement in Cryptol (a rule of form 2 above): -~~~~ +:::{code-block} cryptol \(y:[8]) -> (y * 2) == (y << 1) -~~~~ +::: Interpreting this as a rewrite rule, it says that for any 8-bit vector (call it `y` for now), we can replace `y * 2` with `y << 1`. Using this rule to rewrite the earlier expression would then yield: -~~~~ +:::{code-block} cryptol \(x:[8]) -> (x << 1) + 1 -~~~~ +::: The general philosophy of rewriting is that the left and right patterns, while syntactically different, should be semantically equivalent. @@ -72,14 +72,14 @@ available to the automated provers. In practical use, rewrite rules can be aggregated into `Simpset` values in SAWScript. A few pre-defined `Simpset` values exist: -* `empty_ss : Simpset` is the empty set of rules. Rewriting with it +- `empty_ss : Simpset` is the empty set of rules. Rewriting with it should have no effect, but it is useful as an argument to some of the functions that construct larger `Simpset` values. -* `basic_ss : Simpset` is a collection of rules that are useful in most +- `basic_ss : Simpset` is a collection of rules that are useful in most proof scripts. -* `cryptol_ss : () -> Simpset` includes a collection of Cryptol-specific +- `cryptol_ss : () -> Simpset` includes a collection of Cryptol-specific rules. Some of these simplify away the abstractions introduced in the translation from Cryptol to SAWCore, which can be useful when proving equivalence between Cryptol and non-Cryptol code. Leaving these @@ -88,13 +88,13 @@ however, so `cryptol_ss` is not included in `basic_ss`. The next set of functions can extend or apply a `Simpset`: -* `addsimp' : Term -> Simpset -> Simpset` adds a single `Term` to an +- `addsimp' : Term -> Simpset -> Simpset` adds a single `Term` to an existing `Simpset. -* `addsimps' : [Term] -> Simpset -> Simpset` adds a list of `Term`s to +- `addsimps' : [Term] -> Simpset -> Simpset` adds a list of `Term`s to an existing `Simpset`. -* `rewrite : Simpset -> Term -> Term` applies a `Simpset` to an existing +- `rewrite : Simpset -> Term -> Term` applies a `Simpset` to an existing `Term` to produce a new `Term`. To make this more concrete, we examine how the rewriting example @@ -103,17 +103,17 @@ practice. We simplify everything with `cryptol_ss` as we go along so that the `Term`s don't get too cluttered. First, we declare the term to be transformed: -~~~~ +:::{code-block} console sawscript> let term = rewrite (cryptol_ss ()) {{ \(x:[8]) -> (x * 2) + 1 }} sawscript> print_term term \(x : Prelude.Vec 8 Prelude.Bool) -> Prelude.bvAdd 8 (Prelude.bvMul 8 x (Prelude.bvNat 8 2)) (Prelude.bvNat 8 1) -~~~~ +::: Next, we declare the rewrite rule: -~~~~ +:::{code-block} console sawscript> let rule = rewrite (cryptol_ss ()) {{ \(y:[8]) -> (y * 2) == (y << 1) }} sawscript> print_term rule let { x@1 = Prelude.Vec 8 Prelude.Bool @@ -123,11 +123,11 @@ let { x@1 = Prelude.Vec 8 Prelude.Bool (Prelude.bvMul 8 y (Prelude.bvNat 8 2)) (Prelude.bvShiftL 8 Prelude.Bool 1 Prelude.False y (Prelude.bvNat 1 1)) -~~~~ +::: Finally, we apply the rule to the target term: -~~~~ +:::{code-block} console sawscript> let result = rewrite (addsimp' rule empty_ss) term sawscript> print_term result \(x : Prelude.Vec 8 Prelude.Bool) -> @@ -135,7 +135,7 @@ sawscript> print_term result (Prelude.bvShiftL 8 Prelude.Bool 1 Prelude.False x (Prelude.bvNat 1 1)) (Prelude.bvNat 8 1) -~~~~ +::: Note that `addsimp'` and `addsimps'` take a `Term` or list of `Term`s; these could in principle be anything, and are not necessarily terms @@ -148,10 +148,10 @@ The primary interface to rewriting uses the `Theorem` type instead of the `Term` type, as shown in the signatures for `addsimp` and `addsimps`. -* `addsimp : Theorem -> Simpset -> Simpset` adds a single `Theorem` to a +- `addsimp : Theorem -> Simpset -> Simpset` adds a single `Theorem` to a `Simpset`. -* `addsimps : [Theorem] -> Simpset -> Simpset` adds several `Theorem` +- `addsimps : [Theorem] -> Simpset -> Simpset` adds several `Theorem` values to a `Simpset`. A `Theorem` is essentially a `Term` that is proven correct in some way. @@ -167,25 +167,25 @@ sometimes be helpful or essential. The `cryptol_ss` simpset includes rewrite rules to unfold all definitions in the `Cryptol` SAWCore module, but does not include any of the terms of equality type. -* `add_cryptol_defs : [String] -> Simpset -> Simpset` adds unfolding +- `add_cryptol_defs : [String] -> Simpset -> Simpset` adds unfolding rules for functions with the given names from the SAWCore `Cryptol` module to the given `Simpset`. -* `add_cryptol_eqs : [String] -> Simpset -> Simpset` adds the terms of +- `add_cryptol_eqs : [String] -> Simpset -> Simpset` adds the terms of equality type with the given names from the SAWCore `Cryptol` module to the given `Simpset`. -* `add_prelude_defs : [String] -> Simpset -> Simpset` adds unfolding +- `add_prelude_defs : [String] -> Simpset -> Simpset` adds unfolding rules from the SAWCore `Prelude` module to a `Simpset`. -* `add_prelude_eqs : [String] -> Simpset -> Simpset` adds equality-typed +- `add_prelude_eqs : [String] -> Simpset -> Simpset` adds equality-typed terms from the SAWCore `Prelude` module to a `Simpset`. Finally, it's possible to construct a theorem from an arbitrary SAWCore expression (rather than a Cryptol expression), using the `core_axiom` function. -* `core_axiom : String -> Theorem` creates a `Theorem` from a `String` +- `core_axiom : String -> Theorem` creates a `Theorem` from a `String` in SAWCore syntax. Any `Theorem` introduced by this function is assumed to be correct, so use it with caution. @@ -195,13 +195,13 @@ A SAWCore term can be given a name using the `define` function, and is then by default printed as that name alone. A named subterm can be "unfolded" so that the original definition appears again. -* `define : String -> Term -> TopLevel Term` +- `define : String -> Term -> TopLevel Term` -* `unfold_term : [String] -> Term -> Term` +- `unfold_term : [String] -> Term -> Term` For example: -~~~~ +:::{code-block} console sawscript> let t = {{ 0x22 }} sawscript> print_term t Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) @@ -213,7 +213,7 @@ sawscript> let t'' = unfold_term ["t"] t' sawscript> print_term t'' Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) (Cryptol.PLiteralSeqBool (Cryptol.TCNum 8)) -~~~~ +::: This process of folding and unfolding is useful both to make large terms easier for humans to work with and to make automated proofs more @@ -223,7 +223,7 @@ interacting with external provers. In some cases, folding happens automatically when constructing Cryptol expressions. Consider the following example: -~~~~ +:::{code-block} console sawscript> let t = {{ 0x22 }} sawscript> print_term t Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) @@ -231,7 +231,7 @@ Cryptol.ecNumber (Cryptol.TCNum 34) (Prelude.Vec 8 Prelude.Bool) sawscript> let {{ t' = 0x22 }} sawscript> print_term {{ t' }} t' -~~~~ +::: This illustrates that a bare expression in Cryptol braces gets translated directly to a SAWCore term. However, a Cryptol _definition_ @@ -246,23 +246,23 @@ unfolded as needed. In addition to the `Term` transformation functions described so far, a variety of others also exist. -* `beta_reduce_term : Term -> Term` takes any sub-expression of the form +- `beta_reduce_term : Term -> Term` takes any sub-expression of the form `(\x -> t) v` in the given `Term` and replaces it with a transformed version of `t` in which all instances of `x` are replaced by `v`. -* `replace : Term -> Term -> Term -> TopLevel Term` replaces arbitrary +- `replace : Term -> Term -> Term -> TopLevel Term` replaces arbitrary subterms. A call to `replace x y t` replaces any instance of `x` inside `t` with `y`. Assessing the size of a term can be particularly useful during benchmarking. SAWScript provides two mechanisms for this. -* `term_size : Term -> Int` calculates the number of nodes in the +- `term_size : Term -> Int` calculates the number of nodes in the Directed Acyclic Graph (DAG) representation of a `Term` used internally by SAW. This is the most appropriate way of determining the resource use of a particular term. -* `term_tree_size : Term -> Int` calculates how large a `Term` would be +- `term_tree_size : Term -> Int` calculates how large a `Term` would be if it were represented by a tree instead of a DAG. This can, in general, be much, much larger than the number returned by `term_size`, and serves primarily as a way of assessing, for a specific term, how much benefit @@ -271,11 +271,11 @@ there is to the term sharing used by the DAG representation. Finally, there are a few commands related to the internal SAWCore type of a `Term`. -* `check_term : Term -> TopLevel ()` checks that the internal structure +- `check_term : Term -> TopLevel ()` checks that the internal structure of a `Term` is well-formed and that it passes all of the rules of the SAWCore type checker. -* `type : Term -> Type` returns the type of a particular `Term`, which +- `type : Term -> Type` returns the type of a particular `Term`, which can then be used to, for example, construct a new fresh variable with `fresh_symbolic`. @@ -285,18 +285,18 @@ Most frequently, `Term` values in SAWScript come from Cryptol, JVM, or LLVM programs, or some transformation thereof. However, it is also possible to obtain them from various other sources. -* `parse_core : String -> Term` parses a `String` containing a term in +- `parse_core : String -> Term` parses a `String` containing a term in SAWCore syntax, returning a `Term`. -* `read_core : String -> TopLevel Term` is like `parse_core`, but +- `read_core : String -> TopLevel Term` is like `parse_core`, but obtains the text from the given file and expects it to be in the simpler SAWCore external representation format, rather than the human-readable syntax shown so far. -* `read_aig : String -> TopLevel Term` returns a `Term` representation +- `read_aig : String -> TopLevel Term` returns a `Term` representation of an And-Inverter-Graph (AIG) file in AIGER format. -* `read_bytes : String -> TopLevel Term` reads a constant sequence of +- `read_bytes : String -> TopLevel Term` reads a constant sequence of bytes from a file and represents it as a `Term`. Its result will always have Cryptol type `[n][8]` for some `n`. @@ -305,10 +305,10 @@ formats, including: AIGER (`write_aig`), CNF (`write_cnf`), SAWCore external representation (`write_core`), and SMT-Lib version 2 (`write_smtlib2`). -* `write_aig : String -> Term -> TopLevel ()` +- `write_aig : String -> Term -> TopLevel ()` -* `write_cnf : String -> Term -> TopLevel ()` +- `write_cnf : String -> Term -> TopLevel ()` -* `write_core : String -> Term -> TopLevel ()` +- `write_core : String -> Term -> TopLevel ()` -* `write_smtlib2 : String -> Term -> TopLevel ()` +- `write_smtlib2 : String -> Term -> TopLevel ()` From dba1454869b1f39deb98fa0a73a6809a1c198df7 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 23:38:09 -0800 Subject: [PATCH 21/67] Rename manual -> saw-user-manual. For consistency with the actual title of this resource. --- .../analyzing-hardware-circuits-using-yosys.md | 0 doc/{manual => saw-user-manual}/bisimulation-prover.md | 0 doc/{manual => saw-user-manual}/creating-symbolic-variables.md | 0 doc/{manual => saw-user-manual}/cryptol-and-its-role-in-saw.md | 0 doc/{manual => saw-user-manual}/direct-extraction.md | 0 .../extraction-to-the-coq-theorem-prover.md | 0 doc/{manual => saw-user-manual}/formal-deprecation-process.md | 0 doc/{manual => saw-user-manual}/introduction.md | 0 doc/{manual => saw-user-manual}/invoking-saw.md | 0 doc/{manual => saw-user-manual}/loading-code.md | 0 doc/{manual => saw-user-manual}/proofs-about-terms.md | 0 .../specification-based-verification.md | 0 doc/{manual => saw-user-manual}/structure-of-sawscript.md | 0 doc/{manual => saw-user-manual}/symbolic-execution.md | 0 doc/{manual => saw-user-manual}/symbolic-termination.md | 0 doc/{manual => saw-user-manual}/the-term-type.md | 0 doc/{manual => saw-user-manual}/transforming-term-values.md | 0 17 files changed, 0 insertions(+), 0 deletions(-) rename doc/{manual => saw-user-manual}/analyzing-hardware-circuits-using-yosys.md (100%) rename doc/{manual => saw-user-manual}/bisimulation-prover.md (100%) rename doc/{manual => saw-user-manual}/creating-symbolic-variables.md (100%) rename doc/{manual => saw-user-manual}/cryptol-and-its-role-in-saw.md (100%) rename doc/{manual => saw-user-manual}/direct-extraction.md (100%) rename doc/{manual => saw-user-manual}/extraction-to-the-coq-theorem-prover.md (100%) rename doc/{manual => saw-user-manual}/formal-deprecation-process.md (100%) rename doc/{manual => saw-user-manual}/introduction.md (100%) rename doc/{manual => saw-user-manual}/invoking-saw.md (100%) rename doc/{manual => saw-user-manual}/loading-code.md (100%) rename doc/{manual => saw-user-manual}/proofs-about-terms.md (100%) rename doc/{manual => saw-user-manual}/specification-based-verification.md (100%) rename doc/{manual => saw-user-manual}/structure-of-sawscript.md (100%) rename doc/{manual => saw-user-manual}/symbolic-execution.md (100%) rename doc/{manual => saw-user-manual}/symbolic-termination.md (100%) rename doc/{manual => saw-user-manual}/the-term-type.md (100%) rename doc/{manual => saw-user-manual}/transforming-term-values.md (100%) diff --git a/doc/manual/analyzing-hardware-circuits-using-yosys.md b/doc/saw-user-manual/analyzing-hardware-circuits-using-yosys.md similarity index 100% rename from doc/manual/analyzing-hardware-circuits-using-yosys.md rename to doc/saw-user-manual/analyzing-hardware-circuits-using-yosys.md diff --git a/doc/manual/bisimulation-prover.md b/doc/saw-user-manual/bisimulation-prover.md similarity index 100% rename from doc/manual/bisimulation-prover.md rename to doc/saw-user-manual/bisimulation-prover.md diff --git a/doc/manual/creating-symbolic-variables.md b/doc/saw-user-manual/creating-symbolic-variables.md similarity index 100% rename from doc/manual/creating-symbolic-variables.md rename to doc/saw-user-manual/creating-symbolic-variables.md diff --git a/doc/manual/cryptol-and-its-role-in-saw.md b/doc/saw-user-manual/cryptol-and-its-role-in-saw.md similarity index 100% rename from doc/manual/cryptol-and-its-role-in-saw.md rename to doc/saw-user-manual/cryptol-and-its-role-in-saw.md diff --git a/doc/manual/direct-extraction.md b/doc/saw-user-manual/direct-extraction.md similarity index 100% rename from doc/manual/direct-extraction.md rename to doc/saw-user-manual/direct-extraction.md diff --git a/doc/manual/extraction-to-the-coq-theorem-prover.md b/doc/saw-user-manual/extraction-to-the-coq-theorem-prover.md similarity index 100% rename from doc/manual/extraction-to-the-coq-theorem-prover.md rename to doc/saw-user-manual/extraction-to-the-coq-theorem-prover.md diff --git a/doc/manual/formal-deprecation-process.md b/doc/saw-user-manual/formal-deprecation-process.md similarity index 100% rename from doc/manual/formal-deprecation-process.md rename to doc/saw-user-manual/formal-deprecation-process.md diff --git a/doc/manual/introduction.md b/doc/saw-user-manual/introduction.md similarity index 100% rename from doc/manual/introduction.md rename to doc/saw-user-manual/introduction.md diff --git a/doc/manual/invoking-saw.md b/doc/saw-user-manual/invoking-saw.md similarity index 100% rename from doc/manual/invoking-saw.md rename to doc/saw-user-manual/invoking-saw.md diff --git a/doc/manual/loading-code.md b/doc/saw-user-manual/loading-code.md similarity index 100% rename from doc/manual/loading-code.md rename to doc/saw-user-manual/loading-code.md diff --git a/doc/manual/proofs-about-terms.md b/doc/saw-user-manual/proofs-about-terms.md similarity index 100% rename from doc/manual/proofs-about-terms.md rename to doc/saw-user-manual/proofs-about-terms.md diff --git a/doc/manual/specification-based-verification.md b/doc/saw-user-manual/specification-based-verification.md similarity index 100% rename from doc/manual/specification-based-verification.md rename to doc/saw-user-manual/specification-based-verification.md diff --git a/doc/manual/structure-of-sawscript.md b/doc/saw-user-manual/structure-of-sawscript.md similarity index 100% rename from doc/manual/structure-of-sawscript.md rename to doc/saw-user-manual/structure-of-sawscript.md diff --git a/doc/manual/symbolic-execution.md b/doc/saw-user-manual/symbolic-execution.md similarity index 100% rename from doc/manual/symbolic-execution.md rename to doc/saw-user-manual/symbolic-execution.md diff --git a/doc/manual/symbolic-termination.md b/doc/saw-user-manual/symbolic-termination.md similarity index 100% rename from doc/manual/symbolic-termination.md rename to doc/saw-user-manual/symbolic-termination.md diff --git a/doc/manual/the-term-type.md b/doc/saw-user-manual/the-term-type.md similarity index 100% rename from doc/manual/the-term-type.md rename to doc/saw-user-manual/the-term-type.md diff --git a/doc/manual/transforming-term-values.md b/doc/saw-user-manual/transforming-term-values.md similarity index 100% rename from doc/manual/transforming-term-values.md rename to doc/saw-user-manual/transforming-term-values.md From 92e1d9b6f56fd0d2ffda2c5886e8ca836f78ee9b Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 23:49:56 -0800 Subject: [PATCH 22/67] Rename llvm-java-tutorial -> llvm-java-verification-with-saw. Analogous to dba145486 - more consistent with the title of the book whose sources are contained within. --- .../code/Add.class | Bin .../code/Add.java | 0 .../code/Cipher.cry | 0 .../code/DES.cry | 0 .../code/FFS.class | Bin .../code/FFS.java | 0 .../code/Makefile | 0 .../code/NQueens.cry | 0 .../code/WARNING | 0 .../code/basic.bc | Bin .../code/basic.c | 0 .../code/des-cryptol2.saw | 0 .../code/des3.saw | 0 .../code/dotprod.bc | Bin .../code/dotprod.c | 0 .../code/dotprod.cry | 0 .../code/dotprod.saw | 0 .../code/double.bc | Bin .../code/double.c | 0 .../code/double.saw | 0 .../code/ffs.bc | Bin .../code/ffs.c | 0 .../code/ffs.cry | 0 .../code/ffs_compare.saw | 0 .../code/ffs_compare_aig.saw | 0 .../code/ffs_gen_aig.saw | 0 .../code/ffs_java.saw | 0 .../code/ffs_java_crucible.saw | 0 .../code/ffs_llvm.saw | 0 .../code/java_add.saw | 0 .../code/nqueens.saw | 0 .../code/picosat.saw | 0 .../compositional-proofs.md | 0 .../example-find-first-set.md | 0 .../external-sat-solvers.md | 0 .../interactive-interpreter.md | 0 .../introduction.md | 0 .../other-examples.md | 0 .../using-smt-lib-solvers.md | 0 39 files changed, 0 insertions(+), 0 deletions(-) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/Add.class (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/Add.java (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/Cipher.cry (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/DES.cry (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/FFS.class (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/FFS.java (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/Makefile (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/NQueens.cry (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/WARNING (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/basic.bc (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/basic.c (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/des-cryptol2.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/des3.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/dotprod.bc (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/dotprod.c (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/dotprod.cry (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/dotprod.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/double.bc (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/double.c (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/double.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs.bc (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs.c (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs.cry (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs_compare.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs_compare_aig.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs_gen_aig.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs_java.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs_java_crucible.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/ffs_llvm.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/java_add.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/nqueens.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/code/picosat.saw (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/compositional-proofs.md (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/example-find-first-set.md (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/external-sat-solvers.md (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/interactive-interpreter.md (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/introduction.md (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/other-examples.md (100%) rename doc/{llvm-java-tutorial => llvm-java-verification-with-saw}/using-smt-lib-solvers.md (100%) diff --git a/doc/llvm-java-tutorial/code/Add.class b/doc/llvm-java-verification-with-saw/code/Add.class similarity index 100% rename from doc/llvm-java-tutorial/code/Add.class rename to doc/llvm-java-verification-with-saw/code/Add.class diff --git a/doc/llvm-java-tutorial/code/Add.java b/doc/llvm-java-verification-with-saw/code/Add.java similarity index 100% rename from doc/llvm-java-tutorial/code/Add.java rename to doc/llvm-java-verification-with-saw/code/Add.java diff --git a/doc/llvm-java-tutorial/code/Cipher.cry b/doc/llvm-java-verification-with-saw/code/Cipher.cry similarity index 100% rename from doc/llvm-java-tutorial/code/Cipher.cry rename to doc/llvm-java-verification-with-saw/code/Cipher.cry diff --git a/doc/llvm-java-tutorial/code/DES.cry b/doc/llvm-java-verification-with-saw/code/DES.cry similarity index 100% rename from doc/llvm-java-tutorial/code/DES.cry rename to doc/llvm-java-verification-with-saw/code/DES.cry diff --git a/doc/llvm-java-tutorial/code/FFS.class b/doc/llvm-java-verification-with-saw/code/FFS.class similarity index 100% rename from doc/llvm-java-tutorial/code/FFS.class rename to doc/llvm-java-verification-with-saw/code/FFS.class diff --git a/doc/llvm-java-tutorial/code/FFS.java b/doc/llvm-java-verification-with-saw/code/FFS.java similarity index 100% rename from doc/llvm-java-tutorial/code/FFS.java rename to doc/llvm-java-verification-with-saw/code/FFS.java diff --git a/doc/llvm-java-tutorial/code/Makefile b/doc/llvm-java-verification-with-saw/code/Makefile similarity index 100% rename from doc/llvm-java-tutorial/code/Makefile rename to doc/llvm-java-verification-with-saw/code/Makefile diff --git a/doc/llvm-java-tutorial/code/NQueens.cry b/doc/llvm-java-verification-with-saw/code/NQueens.cry similarity index 100% rename from doc/llvm-java-tutorial/code/NQueens.cry rename to doc/llvm-java-verification-with-saw/code/NQueens.cry diff --git a/doc/llvm-java-tutorial/code/WARNING b/doc/llvm-java-verification-with-saw/code/WARNING similarity index 100% rename from doc/llvm-java-tutorial/code/WARNING rename to doc/llvm-java-verification-with-saw/code/WARNING diff --git a/doc/llvm-java-tutorial/code/basic.bc b/doc/llvm-java-verification-with-saw/code/basic.bc similarity index 100% rename from doc/llvm-java-tutorial/code/basic.bc rename to doc/llvm-java-verification-with-saw/code/basic.bc diff --git a/doc/llvm-java-tutorial/code/basic.c b/doc/llvm-java-verification-with-saw/code/basic.c similarity index 100% rename from doc/llvm-java-tutorial/code/basic.c rename to doc/llvm-java-verification-with-saw/code/basic.c diff --git a/doc/llvm-java-tutorial/code/des-cryptol2.saw b/doc/llvm-java-verification-with-saw/code/des-cryptol2.saw similarity index 100% rename from doc/llvm-java-tutorial/code/des-cryptol2.saw rename to doc/llvm-java-verification-with-saw/code/des-cryptol2.saw diff --git a/doc/llvm-java-tutorial/code/des3.saw b/doc/llvm-java-verification-with-saw/code/des3.saw similarity index 100% rename from doc/llvm-java-tutorial/code/des3.saw rename to doc/llvm-java-verification-with-saw/code/des3.saw diff --git a/doc/llvm-java-tutorial/code/dotprod.bc b/doc/llvm-java-verification-with-saw/code/dotprod.bc similarity index 100% rename from doc/llvm-java-tutorial/code/dotprod.bc rename to doc/llvm-java-verification-with-saw/code/dotprod.bc diff --git a/doc/llvm-java-tutorial/code/dotprod.c b/doc/llvm-java-verification-with-saw/code/dotprod.c similarity index 100% rename from doc/llvm-java-tutorial/code/dotprod.c rename to doc/llvm-java-verification-with-saw/code/dotprod.c diff --git a/doc/llvm-java-tutorial/code/dotprod.cry b/doc/llvm-java-verification-with-saw/code/dotprod.cry similarity index 100% rename from doc/llvm-java-tutorial/code/dotprod.cry rename to doc/llvm-java-verification-with-saw/code/dotprod.cry diff --git a/doc/llvm-java-tutorial/code/dotprod.saw b/doc/llvm-java-verification-with-saw/code/dotprod.saw similarity index 100% rename from doc/llvm-java-tutorial/code/dotprod.saw rename to doc/llvm-java-verification-with-saw/code/dotprod.saw diff --git a/doc/llvm-java-tutorial/code/double.bc b/doc/llvm-java-verification-with-saw/code/double.bc similarity index 100% rename from doc/llvm-java-tutorial/code/double.bc rename to doc/llvm-java-verification-with-saw/code/double.bc diff --git a/doc/llvm-java-tutorial/code/double.c b/doc/llvm-java-verification-with-saw/code/double.c similarity index 100% rename from doc/llvm-java-tutorial/code/double.c rename to doc/llvm-java-verification-with-saw/code/double.c diff --git a/doc/llvm-java-tutorial/code/double.saw b/doc/llvm-java-verification-with-saw/code/double.saw similarity index 100% rename from doc/llvm-java-tutorial/code/double.saw rename to doc/llvm-java-verification-with-saw/code/double.saw diff --git a/doc/llvm-java-tutorial/code/ffs.bc b/doc/llvm-java-verification-with-saw/code/ffs.bc similarity index 100% rename from doc/llvm-java-tutorial/code/ffs.bc rename to doc/llvm-java-verification-with-saw/code/ffs.bc diff --git a/doc/llvm-java-tutorial/code/ffs.c b/doc/llvm-java-verification-with-saw/code/ffs.c similarity index 100% rename from doc/llvm-java-tutorial/code/ffs.c rename to doc/llvm-java-verification-with-saw/code/ffs.c diff --git a/doc/llvm-java-tutorial/code/ffs.cry b/doc/llvm-java-verification-with-saw/code/ffs.cry similarity index 100% rename from doc/llvm-java-tutorial/code/ffs.cry rename to doc/llvm-java-verification-with-saw/code/ffs.cry diff --git a/doc/llvm-java-tutorial/code/ffs_compare.saw b/doc/llvm-java-verification-with-saw/code/ffs_compare.saw similarity index 100% rename from doc/llvm-java-tutorial/code/ffs_compare.saw rename to doc/llvm-java-verification-with-saw/code/ffs_compare.saw diff --git a/doc/llvm-java-tutorial/code/ffs_compare_aig.saw b/doc/llvm-java-verification-with-saw/code/ffs_compare_aig.saw similarity index 100% rename from doc/llvm-java-tutorial/code/ffs_compare_aig.saw rename to doc/llvm-java-verification-with-saw/code/ffs_compare_aig.saw diff --git a/doc/llvm-java-tutorial/code/ffs_gen_aig.saw b/doc/llvm-java-verification-with-saw/code/ffs_gen_aig.saw similarity index 100% rename from doc/llvm-java-tutorial/code/ffs_gen_aig.saw rename to doc/llvm-java-verification-with-saw/code/ffs_gen_aig.saw diff --git a/doc/llvm-java-tutorial/code/ffs_java.saw b/doc/llvm-java-verification-with-saw/code/ffs_java.saw similarity index 100% rename from doc/llvm-java-tutorial/code/ffs_java.saw rename to doc/llvm-java-verification-with-saw/code/ffs_java.saw diff --git a/doc/llvm-java-tutorial/code/ffs_java_crucible.saw b/doc/llvm-java-verification-with-saw/code/ffs_java_crucible.saw similarity index 100% rename from doc/llvm-java-tutorial/code/ffs_java_crucible.saw rename to doc/llvm-java-verification-with-saw/code/ffs_java_crucible.saw diff --git a/doc/llvm-java-tutorial/code/ffs_llvm.saw b/doc/llvm-java-verification-with-saw/code/ffs_llvm.saw similarity index 100% rename from doc/llvm-java-tutorial/code/ffs_llvm.saw rename to doc/llvm-java-verification-with-saw/code/ffs_llvm.saw diff --git a/doc/llvm-java-tutorial/code/java_add.saw b/doc/llvm-java-verification-with-saw/code/java_add.saw similarity index 100% rename from doc/llvm-java-tutorial/code/java_add.saw rename to doc/llvm-java-verification-with-saw/code/java_add.saw diff --git a/doc/llvm-java-tutorial/code/nqueens.saw b/doc/llvm-java-verification-with-saw/code/nqueens.saw similarity index 100% rename from doc/llvm-java-tutorial/code/nqueens.saw rename to doc/llvm-java-verification-with-saw/code/nqueens.saw diff --git a/doc/llvm-java-tutorial/code/picosat.saw b/doc/llvm-java-verification-with-saw/code/picosat.saw similarity index 100% rename from doc/llvm-java-tutorial/code/picosat.saw rename to doc/llvm-java-verification-with-saw/code/picosat.saw diff --git a/doc/llvm-java-tutorial/compositional-proofs.md b/doc/llvm-java-verification-with-saw/compositional-proofs.md similarity index 100% rename from doc/llvm-java-tutorial/compositional-proofs.md rename to doc/llvm-java-verification-with-saw/compositional-proofs.md diff --git a/doc/llvm-java-tutorial/example-find-first-set.md b/doc/llvm-java-verification-with-saw/example-find-first-set.md similarity index 100% rename from doc/llvm-java-tutorial/example-find-first-set.md rename to doc/llvm-java-verification-with-saw/example-find-first-set.md diff --git a/doc/llvm-java-tutorial/external-sat-solvers.md b/doc/llvm-java-verification-with-saw/external-sat-solvers.md similarity index 100% rename from doc/llvm-java-tutorial/external-sat-solvers.md rename to doc/llvm-java-verification-with-saw/external-sat-solvers.md diff --git a/doc/llvm-java-tutorial/interactive-interpreter.md b/doc/llvm-java-verification-with-saw/interactive-interpreter.md similarity index 100% rename from doc/llvm-java-tutorial/interactive-interpreter.md rename to doc/llvm-java-verification-with-saw/interactive-interpreter.md diff --git a/doc/llvm-java-tutorial/introduction.md b/doc/llvm-java-verification-with-saw/introduction.md similarity index 100% rename from doc/llvm-java-tutorial/introduction.md rename to doc/llvm-java-verification-with-saw/introduction.md diff --git a/doc/llvm-java-tutorial/other-examples.md b/doc/llvm-java-verification-with-saw/other-examples.md similarity index 100% rename from doc/llvm-java-tutorial/other-examples.md rename to doc/llvm-java-verification-with-saw/other-examples.md diff --git a/doc/llvm-java-tutorial/using-smt-lib-solvers.md b/doc/llvm-java-verification-with-saw/using-smt-lib-solvers.md similarity index 100% rename from doc/llvm-java-tutorial/using-smt-lib-solvers.md rename to doc/llvm-java-verification-with-saw/using-smt-lib-solvers.md From c4444d1c48736cfc4097a59218df975f56c37f2d Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 25 Jan 2025 23:53:43 -0800 Subject: [PATCH 23/67] Rename rust-tutorial -> rust-verification-with-saw. See 92e1d9b6f and dba145486 (analogous changes). --- .../a-final-word.md | 0 .../about-mir-json.md | 0 .../case-study-salsa20.md | 0 .../code/.gitignore | 0 .../code/Makefile | 0 .../code/arrays-fail.saw | 0 .../code/arrays.linked-mir.json | 0 .../code/arrays.rs | 0 .../code/arrays.saw | 0 .../code/enums.linked-mir.json | 0 .../code/enums.rs | 0 .../code/enums.saw | 0 .../code/first-example.linked-mir.json | 0 .../code/first-example.rs | 0 .../code/generics-take-1.linked-mir.json | 0 .../code/generics-take-1.rs | 0 .../code/generics-take-2.linked-mir.json | 0 .../code/generics-take-2.rs | 0 .../code/overrides-fail.saw | 0 .../code/overrides-mut-fail.saw | 0 .../code/overrides-mut.linked-mir.json | 0 .../code/overrides-mut.rs | 0 .../code/overrides-mut.saw | 0 .../code/overrides-unsafe.saw | 0 .../code/overrides.linked-mir.json | 0 .../code/overrides.rs | 0 .../code/overrides.saw | 0 .../code/ref-basics-fail.saw | 0 .../code/ref-basics.linked-mir.json | 0 .../code/ref-basics.rs | 0 .../code/ref-basics.saw | 0 .../code/salsa20/.gitignore | 0 .../code/salsa20/CHANGELOG.md | 0 .../code/salsa20/Cargo.lock | 0 .../code/salsa20/Cargo.toml | 0 .../code/salsa20/LICENSE-APACHE | 0 .../code/salsa20/LICENSE-MIT | 0 .../code/salsa20/README.md | 0 .../code/salsa20/Salsa20.cry | 0 .../code/salsa20/Salsa20Extras.cry | 0 .../salsa20/salsa20-apply_keystream_alt-fail1.saw | 0 .../code/salsa20/salsa20-new_raw-fail1.saw | 0 .../code/salsa20/salsa20-new_raw-fail2.saw | 0 .../code/salsa20/salsa20-quarter_round-fail1.saw | 0 .../code/salsa20/salsa20-quarter_round-fail2.saw | 0 .../code/salsa20/salsa20-quarter_round-fail3.saw | 0 .../code/salsa20/salsa20-quarter_round-fail4.saw | 0 .../code/salsa20/salsa20-reference.saw | 0 .../code/salsa20/salsa20-rounds-take-1.saw | 0 .../code/salsa20/salsa20-rounds-take-2.saw | 0 .../code/salsa20/salsa20-rounds-take-3.saw | 0 .../code/salsa20/salsa20.linked-mir.json.tar.gz | Bin .../code/salsa20/src/core.rs | 0 .../code/salsa20/src/lib.rs | 0 .../code/salsa20/src/rounds.rs | 0 .../code/salsa20/src/salsa.rs | 0 .../code/salsa20/src/xsalsa.rs | 0 .../code/saw-basics.linked-mir.json | 0 .../code/saw-basics.rs | 0 .../code/saw-basics.saw | 0 .../code/slices.linked-mir.json | 0 .../code/slices.rs | 0 .../code/slices.saw | 0 .../code/statics-compositional-fail.saw | 0 .../code/statics-compositional.linked-mir.json | 0 .../code/statics-compositional.rs | 0 .../code/statics-compositional.saw | 0 .../code/statics-fail.saw | 0 .../code/statics.linked-mir.json | 0 .../code/statics.rs | 0 .../code/statics.saw | 0 .../code/structs.linked-mir.json | 0 .../code/structs.rs | 0 .../code/structs.saw | 0 .../code/times-two-ref-fail.saw | 0 .../code/times-two.linked-mir.json | 0 .../code/times-two.rs | 0 .../code/times-two.saw | 0 .../code/tuples.linked-mir.json | 0 .../code/tuples.rs | 0 .../code/tuples.saw | 0 .../compound-data-types.md | 0 .../introduction.md | 0 .../overrides-and-compositional-verification.md | 0 .../prerequisites.md | 0 .../reference-types.md | 0 .../saw-basics.md | 0 .../static-items.md | 0 88 files changed, 0 insertions(+), 0 deletions(-) rename doc/{rust-tutorial => rust-verification-with-saw}/a-final-word.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/about-mir-json.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/case-study-salsa20.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/.gitignore (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/Makefile (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/arrays-fail.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/arrays.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/arrays.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/arrays.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/enums.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/enums.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/enums.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/first-example.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/first-example.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/generics-take-1.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/generics-take-1.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/generics-take-2.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/generics-take-2.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides-fail.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides-mut-fail.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides-mut.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides-mut.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides-mut.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides-unsafe.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/overrides.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/ref-basics-fail.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/ref-basics.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/ref-basics.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/ref-basics.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/.gitignore (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/CHANGELOG.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/Cargo.lock (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/Cargo.toml (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/LICENSE-APACHE (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/LICENSE-MIT (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/README.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/Salsa20.cry (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/Salsa20Extras.cry (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-apply_keystream_alt-fail1.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-new_raw-fail1.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-new_raw-fail2.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-quarter_round-fail1.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-quarter_round-fail2.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-quarter_round-fail3.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-quarter_round-fail4.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-reference.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-rounds-take-1.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-rounds-take-2.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20-rounds-take-3.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/salsa20.linked-mir.json.tar.gz (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/src/core.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/src/lib.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/src/rounds.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/src/salsa.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/salsa20/src/xsalsa.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/saw-basics.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/saw-basics.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/saw-basics.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/slices.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/slices.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/slices.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/statics-compositional-fail.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/statics-compositional.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/statics-compositional.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/statics-compositional.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/statics-fail.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/statics.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/statics.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/statics.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/structs.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/structs.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/structs.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/times-two-ref-fail.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/times-two.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/times-two.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/times-two.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/tuples.linked-mir.json (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/tuples.rs (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/code/tuples.saw (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/compound-data-types.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/introduction.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/overrides-and-compositional-verification.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/prerequisites.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/reference-types.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/saw-basics.md (100%) rename doc/{rust-tutorial => rust-verification-with-saw}/static-items.md (100%) diff --git a/doc/rust-tutorial/a-final-word.md b/doc/rust-verification-with-saw/a-final-word.md similarity index 100% rename from doc/rust-tutorial/a-final-word.md rename to doc/rust-verification-with-saw/a-final-word.md diff --git a/doc/rust-tutorial/about-mir-json.md b/doc/rust-verification-with-saw/about-mir-json.md similarity index 100% rename from doc/rust-tutorial/about-mir-json.md rename to doc/rust-verification-with-saw/about-mir-json.md diff --git a/doc/rust-tutorial/case-study-salsa20.md b/doc/rust-verification-with-saw/case-study-salsa20.md similarity index 100% rename from doc/rust-tutorial/case-study-salsa20.md rename to doc/rust-verification-with-saw/case-study-salsa20.md diff --git a/doc/rust-tutorial/code/.gitignore b/doc/rust-verification-with-saw/code/.gitignore similarity index 100% rename from doc/rust-tutorial/code/.gitignore rename to doc/rust-verification-with-saw/code/.gitignore diff --git a/doc/rust-tutorial/code/Makefile b/doc/rust-verification-with-saw/code/Makefile similarity index 100% rename from doc/rust-tutorial/code/Makefile rename to doc/rust-verification-with-saw/code/Makefile diff --git a/doc/rust-tutorial/code/arrays-fail.saw b/doc/rust-verification-with-saw/code/arrays-fail.saw similarity index 100% rename from doc/rust-tutorial/code/arrays-fail.saw rename to doc/rust-verification-with-saw/code/arrays-fail.saw diff --git a/doc/rust-tutorial/code/arrays.linked-mir.json b/doc/rust-verification-with-saw/code/arrays.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/arrays.linked-mir.json rename to doc/rust-verification-with-saw/code/arrays.linked-mir.json diff --git a/doc/rust-tutorial/code/arrays.rs b/doc/rust-verification-with-saw/code/arrays.rs similarity index 100% rename from doc/rust-tutorial/code/arrays.rs rename to doc/rust-verification-with-saw/code/arrays.rs diff --git a/doc/rust-tutorial/code/arrays.saw b/doc/rust-verification-with-saw/code/arrays.saw similarity index 100% rename from doc/rust-tutorial/code/arrays.saw rename to doc/rust-verification-with-saw/code/arrays.saw diff --git a/doc/rust-tutorial/code/enums.linked-mir.json b/doc/rust-verification-with-saw/code/enums.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/enums.linked-mir.json rename to doc/rust-verification-with-saw/code/enums.linked-mir.json diff --git a/doc/rust-tutorial/code/enums.rs b/doc/rust-verification-with-saw/code/enums.rs similarity index 100% rename from doc/rust-tutorial/code/enums.rs rename to doc/rust-verification-with-saw/code/enums.rs diff --git a/doc/rust-tutorial/code/enums.saw b/doc/rust-verification-with-saw/code/enums.saw similarity index 100% rename from doc/rust-tutorial/code/enums.saw rename to doc/rust-verification-with-saw/code/enums.saw diff --git a/doc/rust-tutorial/code/first-example.linked-mir.json b/doc/rust-verification-with-saw/code/first-example.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/first-example.linked-mir.json rename to doc/rust-verification-with-saw/code/first-example.linked-mir.json diff --git a/doc/rust-tutorial/code/first-example.rs b/doc/rust-verification-with-saw/code/first-example.rs similarity index 100% rename from doc/rust-tutorial/code/first-example.rs rename to doc/rust-verification-with-saw/code/first-example.rs diff --git a/doc/rust-tutorial/code/generics-take-1.linked-mir.json b/doc/rust-verification-with-saw/code/generics-take-1.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/generics-take-1.linked-mir.json rename to doc/rust-verification-with-saw/code/generics-take-1.linked-mir.json diff --git a/doc/rust-tutorial/code/generics-take-1.rs b/doc/rust-verification-with-saw/code/generics-take-1.rs similarity index 100% rename from doc/rust-tutorial/code/generics-take-1.rs rename to doc/rust-verification-with-saw/code/generics-take-1.rs diff --git a/doc/rust-tutorial/code/generics-take-2.linked-mir.json b/doc/rust-verification-with-saw/code/generics-take-2.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/generics-take-2.linked-mir.json rename to doc/rust-verification-with-saw/code/generics-take-2.linked-mir.json diff --git a/doc/rust-tutorial/code/generics-take-2.rs b/doc/rust-verification-with-saw/code/generics-take-2.rs similarity index 100% rename from doc/rust-tutorial/code/generics-take-2.rs rename to doc/rust-verification-with-saw/code/generics-take-2.rs diff --git a/doc/rust-tutorial/code/overrides-fail.saw b/doc/rust-verification-with-saw/code/overrides-fail.saw similarity index 100% rename from doc/rust-tutorial/code/overrides-fail.saw rename to doc/rust-verification-with-saw/code/overrides-fail.saw diff --git a/doc/rust-tutorial/code/overrides-mut-fail.saw b/doc/rust-verification-with-saw/code/overrides-mut-fail.saw similarity index 100% rename from doc/rust-tutorial/code/overrides-mut-fail.saw rename to doc/rust-verification-with-saw/code/overrides-mut-fail.saw diff --git a/doc/rust-tutorial/code/overrides-mut.linked-mir.json b/doc/rust-verification-with-saw/code/overrides-mut.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/overrides-mut.linked-mir.json rename to doc/rust-verification-with-saw/code/overrides-mut.linked-mir.json diff --git a/doc/rust-tutorial/code/overrides-mut.rs b/doc/rust-verification-with-saw/code/overrides-mut.rs similarity index 100% rename from doc/rust-tutorial/code/overrides-mut.rs rename to doc/rust-verification-with-saw/code/overrides-mut.rs diff --git a/doc/rust-tutorial/code/overrides-mut.saw b/doc/rust-verification-with-saw/code/overrides-mut.saw similarity index 100% rename from doc/rust-tutorial/code/overrides-mut.saw rename to doc/rust-verification-with-saw/code/overrides-mut.saw diff --git a/doc/rust-tutorial/code/overrides-unsafe.saw b/doc/rust-verification-with-saw/code/overrides-unsafe.saw similarity index 100% rename from doc/rust-tutorial/code/overrides-unsafe.saw rename to doc/rust-verification-with-saw/code/overrides-unsafe.saw diff --git a/doc/rust-tutorial/code/overrides.linked-mir.json b/doc/rust-verification-with-saw/code/overrides.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/overrides.linked-mir.json rename to doc/rust-verification-with-saw/code/overrides.linked-mir.json diff --git a/doc/rust-tutorial/code/overrides.rs b/doc/rust-verification-with-saw/code/overrides.rs similarity index 100% rename from doc/rust-tutorial/code/overrides.rs rename to doc/rust-verification-with-saw/code/overrides.rs diff --git a/doc/rust-tutorial/code/overrides.saw b/doc/rust-verification-with-saw/code/overrides.saw similarity index 100% rename from doc/rust-tutorial/code/overrides.saw rename to doc/rust-verification-with-saw/code/overrides.saw diff --git a/doc/rust-tutorial/code/ref-basics-fail.saw b/doc/rust-verification-with-saw/code/ref-basics-fail.saw similarity index 100% rename from doc/rust-tutorial/code/ref-basics-fail.saw rename to doc/rust-verification-with-saw/code/ref-basics-fail.saw diff --git a/doc/rust-tutorial/code/ref-basics.linked-mir.json b/doc/rust-verification-with-saw/code/ref-basics.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/ref-basics.linked-mir.json rename to doc/rust-verification-with-saw/code/ref-basics.linked-mir.json diff --git a/doc/rust-tutorial/code/ref-basics.rs b/doc/rust-verification-with-saw/code/ref-basics.rs similarity index 100% rename from doc/rust-tutorial/code/ref-basics.rs rename to doc/rust-verification-with-saw/code/ref-basics.rs diff --git a/doc/rust-tutorial/code/ref-basics.saw b/doc/rust-verification-with-saw/code/ref-basics.saw similarity index 100% rename from doc/rust-tutorial/code/ref-basics.saw rename to doc/rust-verification-with-saw/code/ref-basics.saw diff --git a/doc/rust-tutorial/code/salsa20/.gitignore b/doc/rust-verification-with-saw/code/salsa20/.gitignore similarity index 100% rename from doc/rust-tutorial/code/salsa20/.gitignore rename to doc/rust-verification-with-saw/code/salsa20/.gitignore diff --git a/doc/rust-tutorial/code/salsa20/CHANGELOG.md b/doc/rust-verification-with-saw/code/salsa20/CHANGELOG.md similarity index 100% rename from doc/rust-tutorial/code/salsa20/CHANGELOG.md rename to doc/rust-verification-with-saw/code/salsa20/CHANGELOG.md diff --git a/doc/rust-tutorial/code/salsa20/Cargo.lock b/doc/rust-verification-with-saw/code/salsa20/Cargo.lock similarity index 100% rename from doc/rust-tutorial/code/salsa20/Cargo.lock rename to doc/rust-verification-with-saw/code/salsa20/Cargo.lock diff --git a/doc/rust-tutorial/code/salsa20/Cargo.toml b/doc/rust-verification-with-saw/code/salsa20/Cargo.toml similarity index 100% rename from doc/rust-tutorial/code/salsa20/Cargo.toml rename to doc/rust-verification-with-saw/code/salsa20/Cargo.toml diff --git a/doc/rust-tutorial/code/salsa20/LICENSE-APACHE b/doc/rust-verification-with-saw/code/salsa20/LICENSE-APACHE similarity index 100% rename from doc/rust-tutorial/code/salsa20/LICENSE-APACHE rename to doc/rust-verification-with-saw/code/salsa20/LICENSE-APACHE diff --git a/doc/rust-tutorial/code/salsa20/LICENSE-MIT b/doc/rust-verification-with-saw/code/salsa20/LICENSE-MIT similarity index 100% rename from doc/rust-tutorial/code/salsa20/LICENSE-MIT rename to doc/rust-verification-with-saw/code/salsa20/LICENSE-MIT diff --git a/doc/rust-tutorial/code/salsa20/README.md b/doc/rust-verification-with-saw/code/salsa20/README.md similarity index 100% rename from doc/rust-tutorial/code/salsa20/README.md rename to doc/rust-verification-with-saw/code/salsa20/README.md diff --git a/doc/rust-tutorial/code/salsa20/Salsa20.cry b/doc/rust-verification-with-saw/code/salsa20/Salsa20.cry similarity index 100% rename from doc/rust-tutorial/code/salsa20/Salsa20.cry rename to doc/rust-verification-with-saw/code/salsa20/Salsa20.cry diff --git a/doc/rust-tutorial/code/salsa20/Salsa20Extras.cry b/doc/rust-verification-with-saw/code/salsa20/Salsa20Extras.cry similarity index 100% rename from doc/rust-tutorial/code/salsa20/Salsa20Extras.cry rename to doc/rust-verification-with-saw/code/salsa20/Salsa20Extras.cry diff --git a/doc/rust-tutorial/code/salsa20/salsa20-apply_keystream_alt-fail1.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-apply_keystream_alt-fail1.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-apply_keystream_alt-fail1.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-apply_keystream_alt-fail1.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-new_raw-fail1.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-new_raw-fail1.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-new_raw-fail1.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-new_raw-fail1.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-new_raw-fail2.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-new_raw-fail2.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-new_raw-fail2.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-new_raw-fail2.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-quarter_round-fail1.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-quarter_round-fail1.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-quarter_round-fail1.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-quarter_round-fail1.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-quarter_round-fail2.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-quarter_round-fail2.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-quarter_round-fail2.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-quarter_round-fail2.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-quarter_round-fail3.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-quarter_round-fail3.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-quarter_round-fail3.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-quarter_round-fail3.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-quarter_round-fail4.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-quarter_round-fail4.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-quarter_round-fail4.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-quarter_round-fail4.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-reference.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-reference.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-reference.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-reference.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-rounds-take-1.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-rounds-take-1.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-rounds-take-1.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-rounds-take-1.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-rounds-take-2.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-rounds-take-2.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-rounds-take-2.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-rounds-take-2.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20-rounds-take-3.saw b/doc/rust-verification-with-saw/code/salsa20/salsa20-rounds-take-3.saw similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20-rounds-take-3.saw rename to doc/rust-verification-with-saw/code/salsa20/salsa20-rounds-take-3.saw diff --git a/doc/rust-tutorial/code/salsa20/salsa20.linked-mir.json.tar.gz b/doc/rust-verification-with-saw/code/salsa20/salsa20.linked-mir.json.tar.gz similarity index 100% rename from doc/rust-tutorial/code/salsa20/salsa20.linked-mir.json.tar.gz rename to doc/rust-verification-with-saw/code/salsa20/salsa20.linked-mir.json.tar.gz diff --git a/doc/rust-tutorial/code/salsa20/src/core.rs b/doc/rust-verification-with-saw/code/salsa20/src/core.rs similarity index 100% rename from doc/rust-tutorial/code/salsa20/src/core.rs rename to doc/rust-verification-with-saw/code/salsa20/src/core.rs diff --git a/doc/rust-tutorial/code/salsa20/src/lib.rs b/doc/rust-verification-with-saw/code/salsa20/src/lib.rs similarity index 100% rename from doc/rust-tutorial/code/salsa20/src/lib.rs rename to doc/rust-verification-with-saw/code/salsa20/src/lib.rs diff --git a/doc/rust-tutorial/code/salsa20/src/rounds.rs b/doc/rust-verification-with-saw/code/salsa20/src/rounds.rs similarity index 100% rename from doc/rust-tutorial/code/salsa20/src/rounds.rs rename to doc/rust-verification-with-saw/code/salsa20/src/rounds.rs diff --git a/doc/rust-tutorial/code/salsa20/src/salsa.rs b/doc/rust-verification-with-saw/code/salsa20/src/salsa.rs similarity index 100% rename from doc/rust-tutorial/code/salsa20/src/salsa.rs rename to doc/rust-verification-with-saw/code/salsa20/src/salsa.rs diff --git a/doc/rust-tutorial/code/salsa20/src/xsalsa.rs b/doc/rust-verification-with-saw/code/salsa20/src/xsalsa.rs similarity index 100% rename from doc/rust-tutorial/code/salsa20/src/xsalsa.rs rename to doc/rust-verification-with-saw/code/salsa20/src/xsalsa.rs diff --git a/doc/rust-tutorial/code/saw-basics.linked-mir.json b/doc/rust-verification-with-saw/code/saw-basics.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/saw-basics.linked-mir.json rename to doc/rust-verification-with-saw/code/saw-basics.linked-mir.json diff --git a/doc/rust-tutorial/code/saw-basics.rs b/doc/rust-verification-with-saw/code/saw-basics.rs similarity index 100% rename from doc/rust-tutorial/code/saw-basics.rs rename to doc/rust-verification-with-saw/code/saw-basics.rs diff --git a/doc/rust-tutorial/code/saw-basics.saw b/doc/rust-verification-with-saw/code/saw-basics.saw similarity index 100% rename from doc/rust-tutorial/code/saw-basics.saw rename to doc/rust-verification-with-saw/code/saw-basics.saw diff --git a/doc/rust-tutorial/code/slices.linked-mir.json b/doc/rust-verification-with-saw/code/slices.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/slices.linked-mir.json rename to doc/rust-verification-with-saw/code/slices.linked-mir.json diff --git a/doc/rust-tutorial/code/slices.rs b/doc/rust-verification-with-saw/code/slices.rs similarity index 100% rename from doc/rust-tutorial/code/slices.rs rename to doc/rust-verification-with-saw/code/slices.rs diff --git a/doc/rust-tutorial/code/slices.saw b/doc/rust-verification-with-saw/code/slices.saw similarity index 100% rename from doc/rust-tutorial/code/slices.saw rename to doc/rust-verification-with-saw/code/slices.saw diff --git a/doc/rust-tutorial/code/statics-compositional-fail.saw b/doc/rust-verification-with-saw/code/statics-compositional-fail.saw similarity index 100% rename from doc/rust-tutorial/code/statics-compositional-fail.saw rename to doc/rust-verification-with-saw/code/statics-compositional-fail.saw diff --git a/doc/rust-tutorial/code/statics-compositional.linked-mir.json b/doc/rust-verification-with-saw/code/statics-compositional.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/statics-compositional.linked-mir.json rename to doc/rust-verification-with-saw/code/statics-compositional.linked-mir.json diff --git a/doc/rust-tutorial/code/statics-compositional.rs b/doc/rust-verification-with-saw/code/statics-compositional.rs similarity index 100% rename from doc/rust-tutorial/code/statics-compositional.rs rename to doc/rust-verification-with-saw/code/statics-compositional.rs diff --git a/doc/rust-tutorial/code/statics-compositional.saw b/doc/rust-verification-with-saw/code/statics-compositional.saw similarity index 100% rename from doc/rust-tutorial/code/statics-compositional.saw rename to doc/rust-verification-with-saw/code/statics-compositional.saw diff --git a/doc/rust-tutorial/code/statics-fail.saw b/doc/rust-verification-with-saw/code/statics-fail.saw similarity index 100% rename from doc/rust-tutorial/code/statics-fail.saw rename to doc/rust-verification-with-saw/code/statics-fail.saw diff --git a/doc/rust-tutorial/code/statics.linked-mir.json b/doc/rust-verification-with-saw/code/statics.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/statics.linked-mir.json rename to doc/rust-verification-with-saw/code/statics.linked-mir.json diff --git a/doc/rust-tutorial/code/statics.rs b/doc/rust-verification-with-saw/code/statics.rs similarity index 100% rename from doc/rust-tutorial/code/statics.rs rename to doc/rust-verification-with-saw/code/statics.rs diff --git a/doc/rust-tutorial/code/statics.saw b/doc/rust-verification-with-saw/code/statics.saw similarity index 100% rename from doc/rust-tutorial/code/statics.saw rename to doc/rust-verification-with-saw/code/statics.saw diff --git a/doc/rust-tutorial/code/structs.linked-mir.json b/doc/rust-verification-with-saw/code/structs.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/structs.linked-mir.json rename to doc/rust-verification-with-saw/code/structs.linked-mir.json diff --git a/doc/rust-tutorial/code/structs.rs b/doc/rust-verification-with-saw/code/structs.rs similarity index 100% rename from doc/rust-tutorial/code/structs.rs rename to doc/rust-verification-with-saw/code/structs.rs diff --git a/doc/rust-tutorial/code/structs.saw b/doc/rust-verification-with-saw/code/structs.saw similarity index 100% rename from doc/rust-tutorial/code/structs.saw rename to doc/rust-verification-with-saw/code/structs.saw diff --git a/doc/rust-tutorial/code/times-two-ref-fail.saw b/doc/rust-verification-with-saw/code/times-two-ref-fail.saw similarity index 100% rename from doc/rust-tutorial/code/times-two-ref-fail.saw rename to doc/rust-verification-with-saw/code/times-two-ref-fail.saw diff --git a/doc/rust-tutorial/code/times-two.linked-mir.json b/doc/rust-verification-with-saw/code/times-two.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/times-two.linked-mir.json rename to doc/rust-verification-with-saw/code/times-two.linked-mir.json diff --git a/doc/rust-tutorial/code/times-two.rs b/doc/rust-verification-with-saw/code/times-two.rs similarity index 100% rename from doc/rust-tutorial/code/times-two.rs rename to doc/rust-verification-with-saw/code/times-two.rs diff --git a/doc/rust-tutorial/code/times-two.saw b/doc/rust-verification-with-saw/code/times-two.saw similarity index 100% rename from doc/rust-tutorial/code/times-two.saw rename to doc/rust-verification-with-saw/code/times-two.saw diff --git a/doc/rust-tutorial/code/tuples.linked-mir.json b/doc/rust-verification-with-saw/code/tuples.linked-mir.json similarity index 100% rename from doc/rust-tutorial/code/tuples.linked-mir.json rename to doc/rust-verification-with-saw/code/tuples.linked-mir.json diff --git a/doc/rust-tutorial/code/tuples.rs b/doc/rust-verification-with-saw/code/tuples.rs similarity index 100% rename from doc/rust-tutorial/code/tuples.rs rename to doc/rust-verification-with-saw/code/tuples.rs diff --git a/doc/rust-tutorial/code/tuples.saw b/doc/rust-verification-with-saw/code/tuples.saw similarity index 100% rename from doc/rust-tutorial/code/tuples.saw rename to doc/rust-verification-with-saw/code/tuples.saw diff --git a/doc/rust-tutorial/compound-data-types.md b/doc/rust-verification-with-saw/compound-data-types.md similarity index 100% rename from doc/rust-tutorial/compound-data-types.md rename to doc/rust-verification-with-saw/compound-data-types.md diff --git a/doc/rust-tutorial/introduction.md b/doc/rust-verification-with-saw/introduction.md similarity index 100% rename from doc/rust-tutorial/introduction.md rename to doc/rust-verification-with-saw/introduction.md diff --git a/doc/rust-tutorial/overrides-and-compositional-verification.md b/doc/rust-verification-with-saw/overrides-and-compositional-verification.md similarity index 100% rename from doc/rust-tutorial/overrides-and-compositional-verification.md rename to doc/rust-verification-with-saw/overrides-and-compositional-verification.md diff --git a/doc/rust-tutorial/prerequisites.md b/doc/rust-verification-with-saw/prerequisites.md similarity index 100% rename from doc/rust-tutorial/prerequisites.md rename to doc/rust-verification-with-saw/prerequisites.md diff --git a/doc/rust-tutorial/reference-types.md b/doc/rust-verification-with-saw/reference-types.md similarity index 100% rename from doc/rust-tutorial/reference-types.md rename to doc/rust-verification-with-saw/reference-types.md diff --git a/doc/rust-tutorial/saw-basics.md b/doc/rust-verification-with-saw/saw-basics.md similarity index 100% rename from doc/rust-tutorial/saw-basics.md rename to doc/rust-verification-with-saw/saw-basics.md diff --git a/doc/rust-tutorial/static-items.md b/doc/rust-verification-with-saw/static-items.md similarity index 100% rename from doc/rust-tutorial/static-items.md rename to doc/rust-verification-with-saw/static-items.md From c3eed8f2d84948a2fcb97a9f46b1855b7eee884e Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 26 Jan 2025 12:18:05 -0800 Subject: [PATCH 24/67] Rename internal -> development. These documents may not be intended for most users, but they ought to be available to read in a nicer format than Markdown files in the repository. Since we control which documents are rendered to PDF (i.e. when we `make latexpdf`) explicitly, these developer documents will only be rendered as part of the HTML (that will eventually be our GitHub Pages site for saw-script). This change reflects that these are documents related to the development of SAW (rather than generically 'internal'). Additional restructuring will follow in additional commits. --- doc/{internal => development}/extcore.md | 0 doc/{internal => development}/limitations.md | 0 doc/{internal => development}/releasing.md | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename doc/{internal => development}/extcore.md (100%) rename doc/{internal => development}/limitations.md (100%) rename doc/{internal => development}/releasing.md (100%) diff --git a/doc/internal/extcore.md b/doc/development/extcore.md similarity index 100% rename from doc/internal/extcore.md rename to doc/development/extcore.md diff --git a/doc/internal/limitations.md b/doc/development/limitations.md similarity index 100% rename from doc/internal/limitations.md rename to doc/development/limitations.md diff --git a/doc/internal/releasing.md b/doc/development/releasing.md similarity index 100% rename from doc/internal/releasing.md rename to doc/development/releasing.md From e815bc929555f10ca9f1fe82d5506da5d34ab7bb Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 26 Jan 2025 15:58:00 -0800 Subject: [PATCH 25/67] Use explicit targets and internal references. This maintains the original internal linking of the affected documents while using explicit _reference labels_ rather than links based on document names / headers. In addition to removing dependence on references generated from headers, which are subject to change during content editing (thereby breaking links), reference labels allow all documents (eventually managed by Sphinx) to straightforwardly cross-reference one another, and are one of the documentation engine's most compelling features. There is, however, a catch: For Sphinx to correctly render cross-referenced documents, reference labels must be unique _to the entirety of the documentation_. In other words, the SAW User Manual and Rust Verification with SAW tutorial could not both define a reference label `my-reference`. There is no local scoping mechanism for reference labels, so there is necessarily a tradeoff between creating a highly-connected, wiki-like documentation (where items are given reference labels more often than not), and having a massive namespace of reference labels to manage. This is something to consider for the future, but certainly not our biggest concern regarding documentation at the moment. --- doc/rust-verification-with-saw/about-mir-json.md | 1 + doc/rust-verification-with-saw/case-study-salsa20.md | 2 +- doc/saw-user-manual/loading-code.md | 2 ++ doc/saw-user-manual/proofs-about-terms.md | 1 + doc/saw-user-manual/specification-based-verification.md | 5 ++++- 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/rust-verification-with-saw/about-mir-json.md b/doc/rust-verification-with-saw/about-mir-json.md index a826294da4..ce0576c6ed 100644 --- a/doc/rust-verification-with-saw/about-mir-json.md +++ b/doc/rust-verification-with-saw/about-mir-json.md @@ -69,6 +69,7 @@ important to understand everything that is going on there. This is machine-generated JSON, and as such, it is not meant to be particularly readable by human eyes. +(saw-rust-lib-path-env-var)= ## The `SAW_RUST_LIBRARY_PATH` environment variable Rust has a large set of standard libraries that ship with the compiler, and diff --git a/doc/rust-verification-with-saw/case-study-salsa20.md b/doc/rust-verification-with-saw/case-study-salsa20.md index d299e7c681..5f99f2eeb4 100644 --- a/doc/rust-verification-with-saw/case-study-salsa20.md +++ b/doc/rust-verification-with-saw/case-study-salsa20.md @@ -193,7 +193,7 @@ up to this point, which have been self-contained Rust files, `salsa20` is a saw-build`, an extension to the `cargo` package manager that integrates with `mir-json`. Before you proceed, make sure that you have defined the `SAW_RUST_LIBRARY_PATH` environment variable as described in [this -section](./about-mir-json.md#the-saw_rust_library_path-environment-variable). +section](#saw-rust-lib-path-env-var). To build the `salsa20` crate, perform the following steps: diff --git a/doc/saw-user-manual/loading-code.md b/doc/saw-user-manual/loading-code.md index 54b65c11d9..117731aefe 100644 --- a/doc/saw-user-manual/loading-code.md +++ b/doc/saw-user-manual/loading-code.md @@ -61,6 +61,7 @@ unresolved issues in verifying code involving classes such as `String`. For more information on these issues, refer to [this GitHub issue](https://github.com/GaloisInc/crucible/issues/641). +(loading-mir)= ## Loading MIR To load a piece of Rust code, first compile it to a MIR JSON file, as described @@ -121,6 +122,7 @@ For Java, the only compilation flag that tends to be valuable is `-g` to retain information about the names of function arguments and local variables. +(compiling-mir)= ### Compiling MIR In order to verify Rust code, SAW analyzes Rust's MIR (mid-level intermediate diff --git a/doc/saw-user-manual/proofs-about-terms.md b/doc/saw-user-manual/proofs-about-terms.md index 5de4966873..ee244368f4 100644 --- a/doc/saw-user-manual/proofs-about-terms.md +++ b/doc/saw-user-manual/proofs-about-terms.md @@ -314,6 +314,7 @@ repository](https://github.com/GaloisInc/saw-script/blob/master/doc/extcore.md). The `offline_unint_smtlib2` command represents the folded subterms listed in its first argument as uninterpreted functions. +(finishing-proofs-without-external-solvers)= ## Finishing Proofs without External Solvers Some proofs can be completed using unsound placeholders, or using diff --git a/doc/saw-user-manual/specification-based-verification.md b/doc/saw-user-manual/specification-based-verification.md index 31a0e056ca..0f029c25a7 100644 --- a/doc/saw-user-manual/specification-based-verification.md +++ b/doc/saw-user-manual/specification-based-verification.md @@ -390,6 +390,7 @@ m <- llvm_load_module "add.bc"; add_ms <- llvm_verify m "add" [] false add_setup abc; ::: +(compositional-verification)= ## Compositional Verification The primary advantage of the specification-based approach to @@ -622,6 +623,7 @@ by this. This is in contrast with LLVM verification, where one could get away without specifying `side_effect`'s argument in this example, as the invalidated memory in `b` would never be read. +(compositional-verification-and-mutable-global-variables)= ### Compositional Verification and Mutable Global Variables Just like with local mutable allocations (see the previous section), @@ -1523,6 +1525,7 @@ point of a call to `f`. This specification also constrains `y` to prevent signed integer overflow resulting from the `x + y` expression in `f`, which is undefined behavior in C. +(mir-static-items)= ### MIR static items Rust's static items are the MIR version of global variables. A reference to a @@ -1630,7 +1633,7 @@ Normally, a `MethodSpec` is the result of both simulation and proof of the target code. However, in some cases, it can be useful to use a `MethodSpec` to specify some code that either doesn't exist or is hard to prove. The previously-mentioned [`assume_unsat` -tactic](proofs-about-terms.md#finishing-proofs-without-external-solvers) omits proof but does not prevent +tactic](#finishing-proofs-without-external-solvers) omits proof but does not prevent simulation of the function. To skip simulation altogether, one can use one of the following commands: From 66aaa4b05badb1d5744c6f1299bf30e028586134 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 26 Jan 2025 19:13:50 -0800 Subject: [PATCH 26/67] development: Split up extcore.md. And normalize the Markdown formatting in the process. This is analogous to earlier commits relating to the manual and tutorials (but simpler, since there was no existing infrastructure around this document). --- doc/development/extcore.md | 316 ------------------ .../sawcore-external-format/applications.md | 27 ++ .../arrays-tuples-and-records.md | 28 ++ .../booleans-and-bit-vectors.md | 26 ++ .../custom-data-types.md | 39 +++ .../function-abstractions.md | 32 ++ .../inputs-and-scalar-constants.md | 20 ++ .../sawcore-external-format/introduction.md | 79 +++++ .../sawcore-external-format/reference.md | 50 +++ 9 files changed, 301 insertions(+), 316 deletions(-) delete mode 100644 doc/development/extcore.md create mode 100644 doc/development/sawcore-external-format/applications.md create mode 100644 doc/development/sawcore-external-format/arrays-tuples-and-records.md create mode 100644 doc/development/sawcore-external-format/booleans-and-bit-vectors.md create mode 100644 doc/development/sawcore-external-format/custom-data-types.md create mode 100644 doc/development/sawcore-external-format/function-abstractions.md create mode 100644 doc/development/sawcore-external-format/inputs-and-scalar-constants.md create mode 100644 doc/development/sawcore-external-format/introduction.md create mode 100644 doc/development/sawcore-external-format/reference.md diff --git a/doc/development/extcore.md b/doc/development/extcore.md deleted file mode 100644 index c1450b52c2..0000000000 --- a/doc/development/extcore.md +++ /dev/null @@ -1,316 +0,0 @@ -Introduction -============ - -Consider the following example SAWScript program: - -``` -main = do { - let excluded_middle x = x || not x; - print_term excluded_middle; - write_core "excluded_middle.extcore" excluded_middle; -}; -``` - -The `print_term` command pretty prints the representation of -`excluded_middle` as a term in the core language. - -``` -\(x::Prelude.Bool) -> Prelude.or x (Prelude.not x) -``` - -The `write_core` command outputs a file in a more easily -computer-readable `extcore` format. (The format can then be read in by -the `read_core` command.) - -``` -SAWCoreTerm 8 -1 Data Prelude.Bool -2 Global Prelude.or -3 Var 0 -4 App 2 3 -5 Global Prelude.not -6 App 5 3 -7 App 4 6 -8 Lam x 1 7 -``` - -An `extcore` file encodes a single term of the core language by -assigning a numeric index to each of its unique subterms. - -Each line in an `extcore` file consists of a sequence of tokens -separated by whitespace. The tokens may be names (alphanumeric -identifiers, possibly including dot-separated qualifiers), numeric -indexes, or literals. The first line is a header containing the magic -string `SAWCoreTerm` followed by the index of the final term (i.e., -the output term). - -Each subsequent line defines a new term, following a standard format: -First is the new index to be defined, then a keyword indicating what -kind of term, and finally a sequence of tokens (the number and type of -which determined by the keyword). Each line can refer to any -previously defined index. - -In the following table, angle brackets enclose descriptions of each -argument. Parentheses and asterisks are used to describe patterns of -valid arguments, and will not show up in files. - -Form Description ------------------------------------------------------ ----------- -`ExtCns ` External input -`Lam ` Function abstraction -`Pi ` Function type -`Var ` Bound variable (de Bruijn indexed) -`Global ` Toplevel constant -`App ` Function application -`Tuple *` Tuple value -`TupleT *` Tuple type -`TupleSel ` Tuple component selector (`x.1`) -`Record ( )*` Record value -`RecordT ( )*` Record type -`RecordSel ` Record component selector (`x.foo`) -`Ctor *` Data constructor value -`Data *` Datatype -`Sort ` Sort -`Nat ` Non-negative integer literal -`Array *` Array value (e.g. `[1, 2, 3]`) -`Float ` Literal of type `Float` -`Double ` Literal of type `Double` -`String ` Literal of type `String` - -The following sections describe each of these keywords in more detail. - -Inputs and Scalar Constants -=========================== - -The simplest terms in `extcore` refer to external inputs and constant -values. Two types of external inputs exist. - -The `ExtCns` keyword indicates an input identified by index, with a -declared type, and a name that exists primarily as a comment. Inputs -of this type are most appropriate when thinking of the term as a -representation of a circuit. - -The `Global` keyword indicates a global term identified by name. This -keyword is primarily used to refer to built-in operators, such as -prelude functions that operate on bit vectors. - -Constants can be written with one of the keywords `Nat`, `Float`, -`Double`, or `String`, followed by the value of the constant. Bit -vector constants can be created by applying the function described in -the "Bit Vectors" section that converts a natural number to a bit -vector. Later sections describe how to write aggregated or structured -constants. - -Applications -============ - -Computations in SAWCore are accomplished by applying operators (or any -term of function type) to operands. Application is structured in -"curried" form: each application node applies a node of function type -to one argument. Functions that take multiple arguments require -multiple application nodes. For example, to add two 8-bit bit vectors, -we can use the following code: - -``` -1 Global Prelude.bitvector -2 Nat 8 -3 App 1 2 -4 ExtCns 0 "x" 3 -5 ExtCns 1 "y" 3 -6 Global Prelude.bvAdd -7 App 6 2 -8 App 7 4 -9 App 8 5 -``` - -This snippet applies the builtin `bitvector` type to the natural -number 8, to form the type of the input variables. These inputs are -then declared on lines 4 and 5. Line 7 then applies the builtin -`bvAdd` to the natural number 8 (to tell it the size of the following -bit vectors). Finally, lines 8 and 9 continue the application to -include the two input variables. - -Booleans and Bit Vectors -======================== - -The previous section gave an example of a bit vector operation. The -SAWCore prelude contains a number of built-in operations on both bit -vectors and booleans. - -Th `bvNat` function constructs a constant bit vector, of a given size, -from the given natural number. Conversely, the `bvToNat` function -takes a bit vector length, a vector of this length, and returns the -corresponding natural number. - -The usual bit vector operators work on one or more bit vectors of a -single vector size. These functions take a natural number as their -first argument, indicating the size of the following bit vectors. - -There are a few exceptions to this general pattern. The unsigned bit -vector shifting operations take a natural number as their second -operand. All signed bit vector operations take a natural number one -smaller than the size of their remaining arguments (to ensure that -their arguments have non-zero size). The `bvAppend` operator takes two -natural numbers, corresponding to the lengths of its two bit vector -arguments, and returns a bit vector with length correponding to the -sum of the lengths of its arguments. - -The complete collection of bit vector operations appears in the -Reference section at the end of this document. - -Arrays, Tuples and Records -========================== - -SAWCore allows aggregation of arbitrary data types into composite -types: arrays, tuples, and records. Arrays are collections, of known -size, containing multiple values of the same type. Tuples contain a -list of values that match, in order, a given list of types. Records -are like tuples with named rather than numbered fields. - -For each of these composite forms, SAWCore includes constructs for -building both types and values. - -To construct an array type, apply the builtin `prelude.Vec` to the -desired size followed by the type of its elements. To construct an -array value, use the keyword `Array` followed by the node index of its -type, and then all of the node indices of its elements. Bit vectors in -SAWCore are actually just arrays of boolean values. - -To construct a tuple type, use the `TupleT` keyword followed by the -indices of the individual element types. To construct a tuple value, -use the `Tuple` keyword followed by the indices of the individual -element values. Finally, to select an element from a tuple value, use -the `TupleSel` keyword followed by the index of the tuple value and -then the element number to extract. - -Record types and values are like tuple types and values, except that -each type or value index is preceded by a field name. Record field -selection is identical to tuple element selection except that it uses -a field name instead of an element index. - -Function Abstractions -===================== - -SAWCore allows the creation of function abstractions. The construct -`Lam ` causes a function argument value of the given type -to be bound within the term specified by the second argument. -Functions with multiple arguments are constructed with multiple nested -`Lam` nodes. Within the term, an argument can be accessed by the -construct `Var ` where an index of `0` corresponds to the -variable bound by the most recent enclosing `Lam`, an index of `1` -corresponds to the variable bound by a `Lam` one level removed, and so -on. Function abstractions can allow code to be abstracted over -different arguments, and applied multiple times in multiple contexts. -They can also be used as an alternative to the `ExtCns` inputs -described previously. - -As an example, the code presented earlier in the Application section, -to add two 8-bit bit vector arguments, could be restructured to use -`Lam` and `Var` as follows: - -``` -1 Global Prelude.bitvector -2 Nat 8 -3 App 1 2 -4 Global Prelude.bvAdd -5 App 4 2 -6 Var 0 3 -7 Var 1 3 -8 App 5 6 -9 App 8 7 -10 Lam x 3 9 -11 Lam x 3 10 -``` - -Custom Data Types -================= - -Several built-in data types, such as records and tuples, have -dedicated syntax within the language. Other data types, however, -including vectors and booleans, are defined as a set of type -constructors and data constructors. - -Type constructors, including `Vec` and `Bool`, take zero or more -arguments inline (i.e., they are not applied with the `App` form), and -create a node corresponding to a data type. The `Bool` type -constructor takes no arguments, while the `Vec` constructor takes two, -a natural number representing its size followed by the type index of -its elements. - -To create a value of a type specified by one of these type -constructors, apply one of the zero or more data constructors -associated with the type. Each data constructor may take zero or more -arguments. - -Boolean values (corresponding to type constructor `Bool`) can be -constructed with the two data constructors `True` and `False`, both of -which take zero arguments. - -Values of vector type can be constructed in two ways. The built-in form -`Array` takes a type index (corresponding to the element type) as its -first argument, followed by a sequence of element expression indices. - -Alternatively, vector values can be constructed piece-by-piece using -the two data constructors: - - * `EmptyVec` which takes a type as an argument and produces a vector - with zero elements of that type, and - - * `ConsVec` which takes a type, a value, a size, and an existing - vector of that given size, and produces a new vector of size one - larger, with the given element value at the beginning. - -Other type and data constructors exist in the SAWCore prelude, but -they rarely occur in terms exported for analysis by third-party tools. - -Reference -========= - -This section summarizes the built-in types, boolean functions, and bit -vector functions defined in the SAWCore prelude. These types and -functions will apppear in `extcore` files in the form -`Prelude.`, but are listed below in the form ``, without -the `Prelude` prefix, for brevity and readability. - -Prelude types: - -Name Kind Comments ----- ---- -------- -`Bool` `Type` -`Nat` `Type` -`bitvector` `Nat -> Type` Abbreviation for `Vec n Bool` -`Vec` `Nat -> Type -> Type` -`String` `Type` - -Prelude boolean functions: - -Name Type ----- ---- -`and` `Bool -> Bool -> Bool` -`or` `Bool -> Bool -> Bool` -`xor` `Bool -> Bool -> Bool` -`boolEq` `Bool -> Bool -> Bool` -`not` `Bool -> Bool` -`ite` `(a:Type) -> Bool -> a -> a -> a` - -Prelude bit vector functions: - -Name Type ----- ---- -`msb` `(n:Nat) -> bitvector (n + 1) -> Bool` -`bvNat` `(n:Nat) -> Nat -> bitvector n` -`bvToNat` `(n:Nat) -> bitvector n -> Nat` -`bvAdd` `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` -`bvSub` `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` -`bvMul` `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` -`bvUDiv` `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` -`bvURem` `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` -`bvSDiv` `(n:Nat) -> bitvector (n + 1) -> bitvector (n + 1) -> bitvector (n + 1)` -`bvSRem` `(n:Nat) -> bitvector (n + 1) -> bitvector (n + 1) -> bitvector (n + 1)` -`bvAnd` `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` -`bvOr` `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` -`bvXor` `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` -`bvNot` `(n:Nat) -> bitvector n -> bitvector n` -`bvShl` `(n:Nat) -> bitvector n -> Nat -> bitvector n` -`bvShr` `(n:Nat) -> bitvector n -> Nat -> bitvector n` -`bvSShr` `(n:Nat) -> bitvector (n + 1) -> bitvector n -> bitvector (n + 1)` diff --git a/doc/development/sawcore-external-format/applications.md b/doc/development/sawcore-external-format/applications.md new file mode 100644 index 0000000000..6e79d79419 --- /dev/null +++ b/doc/development/sawcore-external-format/applications.md @@ -0,0 +1,27 @@ +# Applications + +Computations in SAWCore are accomplished by applying operators (or any +term of function type) to operands. Application is structured in +"curried" form: each application node applies a node of function type +to one argument. Functions that take multiple arguments require +multiple application nodes. For example, to add two 8-bit bit vectors, +we can use the following code: + +:::{code-block} text +1 Global Prelude.bitvector +2 Nat 8 +3 App 1 2 +4 ExtCns 0 "x" 3 +5 ExtCns 1 "y" 3 +6 Global Prelude.bvAdd +7 App 6 2 +8 App 7 4 +9 App 8 5 +::: + +This snippet applies the builtin `bitvector` type to the natural +number 8, to form the type of the input variables. These inputs are +then declared on lines 4 and 5. Line 7 then applies the builtin +`bvAdd` to the natural number 8 (to tell it the size of the following +bit vectors). Finally, lines 8 and 9 continue the application to +include the two input variables. diff --git a/doc/development/sawcore-external-format/arrays-tuples-and-records.md b/doc/development/sawcore-external-format/arrays-tuples-and-records.md new file mode 100644 index 0000000000..1f92b01900 --- /dev/null +++ b/doc/development/sawcore-external-format/arrays-tuples-and-records.md @@ -0,0 +1,28 @@ +# Arrays, Tuples and Records + +SAWCore allows aggregation of arbitrary data types into composite +types: arrays, tuples, and records. Arrays are collections, of known +size, containing multiple values of the same type. Tuples contain a +list of values that match, in order, a given list of types. Records +are like tuples with named rather than numbered fields. + +For each of these composite forms, SAWCore includes constructs for +building both types and values. + +To construct an array type, apply the builtin `prelude.Vec` to the +desired size followed by the type of its elements. To construct an +array value, use the keyword `Array` followed by the node index of its +type, and then all of the node indices of its elements. Bit vectors in +SAWCore are actually just arrays of boolean values. + +To construct a tuple type, use the `TupleT` keyword followed by the +indices of the individual element types. To construct a tuple value, +use the `Tuple` keyword followed by the indices of the individual +element values. Finally, to select an element from a tuple value, use +the `TupleSel` keyword followed by the index of the tuple value and +then the element number to extract. + +Record types and values are like tuple types and values, except that +each type or value index is preceded by a field name. Record field +selection is identical to tuple element selection except that it uses +a field name instead of an element index. diff --git a/doc/development/sawcore-external-format/booleans-and-bit-vectors.md b/doc/development/sawcore-external-format/booleans-and-bit-vectors.md new file mode 100644 index 0000000000..0a3d9c84b7 --- /dev/null +++ b/doc/development/sawcore-external-format/booleans-and-bit-vectors.md @@ -0,0 +1,26 @@ +# Booleans and Bit Vectors + +The previous section gave an example of a bit vector operation. The +SAWCore prelude contains a number of built-in operations on both bit +vectors and booleans. + +Th `bvNat` function constructs a constant bit vector, of a given size, +from the given natural number. Conversely, the `bvToNat` function +takes a bit vector length, a vector of this length, and returns the +corresponding natural number. + +The usual bit vector operators work on one or more bit vectors of a +single vector size. These functions take a natural number as their +first argument, indicating the size of the following bit vectors. + +There are a few exceptions to this general pattern. The unsigned bit +vector shifting operations take a natural number as their second +operand. All signed bit vector operations take a natural number one +smaller than the size of their remaining arguments (to ensure that +their arguments have non-zero size). The `bvAppend` operator takes two +natural numbers, corresponding to the lengths of its two bit vector +arguments, and returns a bit vector with length correponding to the +sum of the lengths of its arguments. + +The complete collection of bit vector operations appears in the +Reference section at the end of this document. diff --git a/doc/development/sawcore-external-format/custom-data-types.md b/doc/development/sawcore-external-format/custom-data-types.md new file mode 100644 index 0000000000..d9a87d2d9f --- /dev/null +++ b/doc/development/sawcore-external-format/custom-data-types.md @@ -0,0 +1,39 @@ +# Custom Data Types + +Several built-in data types, such as records and tuples, have +dedicated syntax within the language. Other data types, however, +including vectors and booleans, are defined as a set of type +constructors and data constructors. + +Type constructors, including `Vec` and `Bool`, take zero or more +arguments inline (i.e., they are not applied with the `App` form), and +create a node corresponding to a data type. The `Bool` type +constructor takes no arguments, while the `Vec` constructor takes two, +a natural number representing its size followed by the type index of +its elements. + +To create a value of a type specified by one of these type +constructors, apply one of the zero or more data constructors +associated with the type. Each data constructor may take zero or more +arguments. + +Boolean values (corresponding to type constructor `Bool`) can be +constructed with the two data constructors `True` and `False`, both of +which take zero arguments. + +Values of vector type can be constructed in two ways. The built-in form +`Array` takes a type index (corresponding to the element type) as its +first argument, followed by a sequence of element expression indices. + +Alternatively, vector values can be constructed piece-by-piece using +the two data constructors: + +- `EmptyVec` which takes a type as an argument and produces a vector + with zero elements of that type, and + +- `ConsVec` which takes a type, a value, a size, and an existing + vector of that given size, and produces a new vector of size one + larger, with the given element value at the beginning. + +Other type and data constructors exist in the SAWCore prelude, but +they rarely occur in terms exported for analysis by third-party tools. diff --git a/doc/development/sawcore-external-format/function-abstractions.md b/doc/development/sawcore-external-format/function-abstractions.md new file mode 100644 index 0000000000..1bf1890101 --- /dev/null +++ b/doc/development/sawcore-external-format/function-abstractions.md @@ -0,0 +1,32 @@ +# Function Abstractions + +SAWCore allows the creation of function abstractions. The construct +`Lam ` causes a function argument value of the given type +to be bound within the term specified by the second argument. +Functions with multiple arguments are constructed with multiple nested +`Lam` nodes. Within the term, an argument can be accessed by the +construct `Var ` where an index of `0` corresponds to the +variable bound by the most recent enclosing `Lam`, an index of `1` +corresponds to the variable bound by a `Lam` one level removed, and so +on. Function abstractions can allow code to be abstracted over +different arguments, and applied multiple times in multiple contexts. +They can also be used as an alternative to the `ExtCns` inputs +described previously. + +As an example, the code presented earlier in the Application section, +to add two 8-bit bit vector arguments, could be restructured to use +`Lam` and `Var` as follows: + +:::{code-block} text +1 Global Prelude.bitvector +2 Nat 8 +3 App 1 2 +4 Global Prelude.bvAdd +5 App 4 2 +6 Var 0 3 +7 Var 1 3 +8 App 5 6 +9 App 8 7 +10 Lam x 3 9 +11 Lam x 3 10 +::: diff --git a/doc/development/sawcore-external-format/inputs-and-scalar-constants.md b/doc/development/sawcore-external-format/inputs-and-scalar-constants.md new file mode 100644 index 0000000000..37152359ce --- /dev/null +++ b/doc/development/sawcore-external-format/inputs-and-scalar-constants.md @@ -0,0 +1,20 @@ +# Inputs and Scalar Constants + +The simplest terms in `extcore` refer to external inputs and constant +values. Two types of external inputs exist. + +The `ExtCns` keyword indicates an input identified by index, with a +declared type, and a name that exists primarily as a comment. Inputs +of this type are most appropriate when thinking of the term as a +representation of a circuit. + +The `Global` keyword indicates a global term identified by name. This +keyword is primarily used to refer to built-in operators, such as +prelude functions that operate on bit vectors. + +Constants can be written with one of the keywords `Nat`, `Float`, +`Double`, or `String`, followed by the value of the constant. Bit +vector constants can be created by applying the function described in +the "Bit Vectors" section that converts a natural number to a bit +vector. Later sections describe how to write aggregated or structured +constants. diff --git a/doc/development/sawcore-external-format/introduction.md b/doc/development/sawcore-external-format/introduction.md new file mode 100644 index 0000000000..7bbbcb154a --- /dev/null +++ b/doc/development/sawcore-external-format/introduction.md @@ -0,0 +1,79 @@ +# Introduction + +Consider the following example SAWScript program: + +:::{code-block} sawscript +main = do { + let excluded_middle x = x || not x; + print_term excluded_middle; + write_core "excluded_middle.extcore" excluded_middle; +}; +::: + +The `print_term` command pretty prints the representation of +`excluded_middle` as a term in the core language. + +:::{code-block} text +\(x::Prelude.Bool) -> Prelude.or x (Prelude.not x) +::: + +The `write_core` command outputs a file in a more easily +computer-readable `extcore` format. (The format can then be read in by +the `read_core` command.) + +:::{code-block} text +SAWCoreTerm 8 +1 Data Prelude.Bool +2 Global Prelude.or +3 Var 0 +4 App 2 3 +5 Global Prelude.not +6 App 5 3 +7 App 4 6 +8 Lam x 1 7 +::: + +An `extcore` file encodes a single term of the core language by +assigning a numeric index to each of its unique subterms. + +Each line in an `extcore` file consists of a sequence of tokens +separated by whitespace. The tokens may be names (alphanumeric +identifiers, possibly including dot-separated qualifiers), numeric +indexes, or literals. The first line is a header containing the magic +string `SAWCoreTerm` followed by the index of the final term (i.e., +the output term). + +Each subsequent line defines a new term, following a standard format: +First is the new index to be defined, then a keyword indicating what +kind of term, and finally a sequence of tokens (the number and type of +which determined by the keyword). Each line can refer to any +previously defined index. + +In the following table, angle brackets enclose descriptions of each +argument. Parentheses and asterisks are used to describe patterns of +valid arguments, and will not show up in files. + +| Form | Description | +| ------------------------------------------------------- | ------------------------------------| +| `ExtCns ` | External input | +| `Lam ` | Function abstraction | +| `Pi ` | Function type | +| `Var ` | Bound variable (de Bruijn indexed) | +| `Global ` | Toplevel constant | +| `App ` | Function application | +| `Tuple *` | Tuple value | +| `TupleT *` | Tuple type | +| `TupleSel ` | Tuple component selector (`x.1`) | +| `Record ( )*` | Record value | +| `RecordT ( )*` | Record type | +| `RecordSel ` | Record component selector (`x.foo`) | +| `Ctor *` | Data constructor value | +| `Data *` | Datatype | +| `Sort ` | Sort | +| `Nat ` | Non-negative integer literal | +| `Array *` | Array value (e.g. `[1, 2, 3]`) | +| `Float ` | Literal of type `Float` | +| `Double ` | Literal of type `Double` | +| `String ` | Literal of type `String` | + +The following sections describe each of these keywords in more detail. diff --git a/doc/development/sawcore-external-format/reference.md b/doc/development/sawcore-external-format/reference.md new file mode 100644 index 0000000000..ff57f0b5ce --- /dev/null +++ b/doc/development/sawcore-external-format/reference.md @@ -0,0 +1,50 @@ +# Reference + +This section summarizes the built-in types, boolean functions, and bit +vector functions defined in the SAWCore prelude. These types and +functions will apppear in `extcore` files in the form +`Prelude.`, but are listed below in the form ``, without +the `Prelude` prefix, for brevity and readability. + +## Prelude types + +| Name | Kind | Comments | +| ----------- | --------------------- | ----------------------------- | +| `Bool` | `Type` | | +| `Nat` | `Type` | | +| `bitvector` | `Nat -> Type` | Abbreviation for `Vec n Bool` | +| `Vec` | `Nat -> Type -> Type` | | +| `String` | `Type` | | + +## Prelude boolean functions + +| Name | Type | +| -------- | --------------------------------- | +| `and` | `Bool -> Bool -> Bool` | +| `or` | `Bool -> Bool -> Bool` | +| `xor` | `Bool -> Bool -> Bool` | +| `boolEq` | `Bool -> Bool -> Bool` | +| `not` | `Bool -> Bool` | +| `ite` | `(a:Type) -> Bool -> a -> a -> a` | + +## Prelude bit vector functions + +| Name | Type | +| --------- | ------------------------------------------------------------------------ | +| `msb` | `(n:Nat) -> bitvector (n + 1) -> Bool` | +| `bvNat` | `(n:Nat) -> Nat -> bitvector n` | +| `bvToNat` | `(n:Nat) -> bitvector n -> Nat` | +| `bvAdd` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvSub` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvMul` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvUDiv` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvURem` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvSDiv` | `(n:Nat) -> bitvector (n + 1) -> bitvector (n + 1) -> bitvector (n + 1)` | +| `bvSRem` | `(n:Nat) -> bitvector (n + 1) -> bitvector (n + 1) -> bitvector (n + 1)` | +| `bvAnd` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvOr` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvXor` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvNot` | `(n:Nat) -> bitvector n -> bitvector n` | +| `bvShl` | `(n:Nat) -> bitvector n -> Nat -> bitvector n` | +| `bvShr` | `(n:Nat) -> bitvector n -> Nat -> bitvector n` | +| `bvSShr` | `(n:Nat) -> bitvector (n + 1) -> bitvector n -> bitvector (n + 1)` | From cf1560ff2b0de88dae28885972ce6f06a2c563e1 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 26 Jan 2025 19:23:55 -0800 Subject: [PATCH 27/67] limitations: Remove redundant table of contents. Sphinx will take care of it! --- doc/development/limitations.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/doc/development/limitations.md b/doc/development/limitations.md index 8fe289174c..ec96ddcbe3 100644 --- a/doc/development/limitations.md +++ b/doc/development/limitations.md @@ -1,21 +1,5 @@ # Limitations - -**Table of Contents** - -- [Limitations](#limitations) - - [Overview](#overview) - - [Finite Loops](#finite-loops) - - [Identifying and Resolving Non-Termination](#identifying-and-resolving-non-termination) - - [Fixed-size Inputs and Outputs](#fixed-size-inputs-and-outputs) - - [Other Generic Limitations](#other-generic-limitations) - - [Other Java Limitations](#other-java-limitations) - - [Other LLVM Limitations](#other-llvm-limitations) - - [Crucible LLVM Limitations](#crucible-llvm-limitations) - - - - ## Overview There are a few limitations on the types of code that SAW can process. From 226b5ca5e7738134b6f8e863b1a2290d2a3e8e83 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 26 Jan 2025 20:36:43 -0800 Subject: [PATCH 28/67] releasing: Fix link to `CHANGES.md`. And by 'fix', I mean: Add a document containing a verbatim rendering of the 'real' `CHANGES.md` at the SAWScript repository root, and link to that. An alternative that was considered that would have resulted in the 'real' `CHANGES.md` being rendered directly was the `{include}` directive. Not only is it the case that "the include directive represents a potential security hole"[^1], Sphinx will attempt (and fail) to resolve the links within, which will fail fantastically since most of them are outside of the doc/ root. [^1]: https://docutils.sourceforge.io/docs/ref/rst/directives.html#include --- doc/development/changes.md | 10 ++++++++++ doc/development/releasing.md | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 doc/development/changes.md diff --git a/doc/development/changes.md b/doc/development/changes.md new file mode 100644 index 0000000000..97e36ef79e --- /dev/null +++ b/doc/development/changes.md @@ -0,0 +1,10 @@ +# `CHANGES.md` + +:::{note} +This document is automatically generated from `CHANGES.md` maintained in the +`saw-script` repo. +::: + +:::{literalinclude} ../../CHANGES.md +:language: markdown +::: diff --git a/doc/development/releasing.md b/doc/development/releasing.md index 69a9cfbbd9..1d98eeab63 100644 --- a/doc/development/releasing.md +++ b/doc/development/releasing.md @@ -24,7 +24,7 @@ The release process is: 1. Make sure the `release-n.n` branch is in a release/ready state, including: - successful build artifacts across all platforms, - successful tests on all test suites, and - - an up-to-date [CHANGES.md](CHANGES.md) file. + - an up-to-date [CHANGES.md](changes) file. 1. Create a draft release on GitHub 1. Make a commit on the `release-n.n` branch updating the version in the `saw-script.cabal` file to `n.n`. This will trigger a build. From 8739b2922687b558e1a7c72aa35d9c6fb7301579 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 26 Jan 2025 20:36:56 -0800 Subject: [PATCH 29/67] Preemptively add a useful reference label to the SAW user manual. It will be a convenient place to link to from the index of the SAWCore external format description in the developer materials. --- doc/saw-user-manual/transforming-term-values.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/saw-user-manual/transforming-term-values.md b/doc/saw-user-manual/transforming-term-values.md index a4237480a8..8f153805a0 100644 --- a/doc/saw-user-manual/transforming-term-values.md +++ b/doc/saw-user-manual/transforming-term-values.md @@ -279,6 +279,7 @@ SAWCore type checker. can then be used to, for example, construct a new fresh variable with `fresh_symbolic`. +(loading-and-storing-terms)= ## Loading and Storing Terms Most frequently, `Term` values in SAWScript come from Cryptol, JVM, or From c318c83303c2c3fa8cfa587d56e6059fc09de24a Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 26 Jan 2025 20:51:10 -0800 Subject: [PATCH 30/67] releasing: Clean whitespace, remove outdated saw.galois.com link. --- doc/development/releasing.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/doc/development/releasing.md b/doc/development/releasing.md index 1d98eeab63..19ddd76858 100644 --- a/doc/development/releasing.md +++ b/doc/development/releasing.md @@ -22,22 +22,23 @@ environment of a release consistent. The release process is: 1. Make sure the `release-n.n` branch is in a release/ready state, including: + - successful build artifacts across all platforms, - successful tests on all test suites, and - an up-to-date [CHANGES.md](changes) file. -1. Create a draft release on GitHub -1. Make a commit on the `release-n.n` branch updating the version in the + +2. Create a draft release on GitHub +3. Make a commit on the `release-n.n` branch updating the version in the `saw-script.cabal` file to `n.n`. This will trigger a build. -1. Once the build is done, download the release artifacts from the +4. Once the build is done, download the release artifacts from the outputs of the build. These are `.zip` files containing `.tar.gz` and `.sig` files. -1. Unpack the `.zip` files and attach the `.tar.gz` and `.sig` files to +5. Unpack the `.zip` files and attach the `.tar.gz` and `.sig` files to the draft release. -1. Publish the release. This will add a tag to the release branch, as +6. Publish the release. This will add a tag to the release branch, as well. -1. Announce the release and update release-relevant information in the following places: +7. Announce the release and update release-relevant information in the following places: - - - - - - - - @galois on Twitter (for major releases) + - + - + - @galois on Twitter (for major releases) From a235e056b3e5eb71314a0e857582e811fa9cadf4 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Mon, 27 Jan 2025 19:43:26 -0800 Subject: [PATCH 31/67] Add indices for all SAW documentation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In Sphinx, document hierarchy is determined by the toctree directive. That is the most important function of these new files -- defining the structure of each SAW 'book', and giving an overall structure to the documentation as a whole. In particular, these indices result in the following document tree: SAW Documentation/ ├─ LLVM/Java Verification with SAW/ │ ├─ Introduction │ ├─ ... ├─ Rust Verification with SAW/ ├─ SAW User Manual/ ├─ SAW Developer Documentation/ │ ├─ SAWCore External Format/ │ ├─ Limitations │ ├─ Releasing Additional 'books' can be added to SAW Documentation; each will have its own toctree(s) defining its internal structure in an index.md file (see doc/index.md, the "root" of the eventual Sphinx project, to better understand how this might be done). --- doc/development/index.md | 33 +++++++++++++++ .../sawcore-external-format/index.md | 22 ++++++++++ doc/index.md | 41 +++++++++++++++++++ doc/llvm-java-verification-with-saw/index.md | 25 +++++++++++ doc/rust-verification-with-saw/index.md | 33 +++++++++++++++ doc/saw-user-manual/index.md | 36 ++++++++++++++++ 6 files changed, 190 insertions(+) create mode 100644 doc/development/index.md create mode 100644 doc/development/sawcore-external-format/index.md create mode 100644 doc/index.md create mode 100644 doc/llvm-java-verification-with-saw/index.md create mode 100644 doc/rust-verification-with-saw/index.md create mode 100644 doc/saw-user-manual/index.md diff --git a/doc/development/index.md b/doc/development/index.md new file mode 100644 index 0000000000..1c5b580d8d --- /dev/null +++ b/doc/development/index.md @@ -0,0 +1,33 @@ +# SAW Developer Documentation + +These resources are mainly intended for developers working on the internals of +[SAWScript](https://github.com/GaloisInc/saw-script). + +Currently, we document: + +- The [SAWCore external format, `extcore`](sawcore-external-format/index), which + is a text-based serialization of the low-level representation of SAWScript + `Term`s. + + :::{warning} + This document has not been updated for many years, and may be incomplete or + inaccurate to the version of SAW for which this documentation was built. + ::: +- The fact that SAW has some [limitations](limitations). + + :::{warning} + This document has not been updated for many years, and may be incomplete or + inaccurate to the version of SAW for which this documentation was built. + ::: +- The `saw-script` [release process](releasing), such that any developer with + merge-to-default access can easily create and reproduce SAW releases. +- [Changes](changes) to `saw-script`. + +:::{toctree} +:hidden: + +sawcore-external-format/index +limitations +releasing +changes +::: diff --git a/doc/development/sawcore-external-format/index.md b/doc/development/sawcore-external-format/index.md new file mode 100644 index 0000000000..1e45cec8cb --- /dev/null +++ b/doc/development/sawcore-external-format/index.md @@ -0,0 +1,22 @@ +# SAWCore External Format + +SAWCore is an intermediate representation for software/hardware semantics, used +internally to implement SAWScript `Term`s. + +This document describes a text-based representation of SAWCore. +This representation can be [read and written by +SAWScript](#loading-and-storing-terms). + +:::{toctree} +:maxdepth: 2 +:caption: Contents + +introduction +inputs-and-scalar-constants +applications +booleans-and-bit-vectors +arrays-tuples-and-records +function-abstractions +custom-data-types +reference +::: diff --git a/doc/index.md b/doc/index.md new file mode 100644 index 0000000000..2d648e94be --- /dev/null +++ b/doc/index.md @@ -0,0 +1,41 @@ +# SAW Documentation + +Welcome to the Software Analysis Workbench (SAW)! + +If you are a new SAW user: + +- [**LLVM/Java Verification with SAW**](llvm-java-verification-with-saw/index) + introduces the core ideas of using SAW to verify LLVM/Java programs. + This is the fastest way to get started with SAW for most use-cases. +- [**Rust Verification with SAW**](rust-verification-with-saw/index) introduces + SAW's experimental support for Rust/MIR verification. + If you would like to be introduced to SAW at the cutting-edge, this is the + right place to start (the LLVM/Java material is _not_ prerequisite). + +If you are looking for SAW/SAWScript reference materials: + +- The [**SAW User Manual**](saw-user-manual/index) is an attempt at + comprehensive user-level documentation of SAW's features. + If the tutorials above don't introduce something you've encountered while + reading or writing SAWScript, it is worth searching the manual to see if it is + covered there. + +If you are a SAW developer: + +- [**SAW Developer Documentation**](development/index) is the home of a few + resources related to the development/maintenance of SAW, such as an overview + of the SAWCore external format and our release process. + +If you encounter any bugs, please [open an +issue](https://github.com/GaloisInc/saw-script/issues) following the +[contributing +guidelines](https://github.com/GaloisInc/saw-script/blob/master/CONTRIBUTING.md#issue-tracking). + +:::{toctree} +:hidden: + +llvm-java-verification-with-saw/index +rust-verification-with-saw/index +saw-user-manual/index +development/index +::: diff --git a/doc/llvm-java-verification-with-saw/index.md b/doc/llvm-java-verification-with-saw/index.md new file mode 100644 index 0000000000..475d95b6a9 --- /dev/null +++ b/doc/llvm-java-verification-with-saw/index.md @@ -0,0 +1,25 @@ +# LLVM/Java Verification with SAW + +This tutorial introduces SAW's LLVM/Java verification capabilities. +After completing this tutorial, you will be able to: + +- Show that alternative implementations of a function, even across languages, + are equivalent +- Use external SMT/SAT solvers to augment SAW's internal proof system +- Write proofs in SAW _compositionally_ +- Use the SAW REPL to interactively run proofs + +You can download the tutorial files: + +```{toctree} +:maxdepth: 2 +:caption: Contents + +introduction +example-find-first-set +using-smt-lib-solvers +external-sat-solvers +compositional-proofs +interactive-interpreter +other-examples +``` diff --git a/doc/rust-verification-with-saw/index.md b/doc/rust-verification-with-saw/index.md new file mode 100644 index 0000000000..596dc4bfdf --- /dev/null +++ b/doc/rust-verification-with-saw/index.md @@ -0,0 +1,33 @@ +# Rust Verification with SAW + +This tutorial introduces SAW's Rust/MIR verification capabilities. +After completing this tutorial, you will be able to: + +- Use `saw-rustc` and `cargo-saw-build` to extract SAW-ready MIR from Rust +- Use SAW's MIR capabilities to verify code that utilizes references and + compound data types (i.e. `struct`s and `enum`s) +- Write proofs _compositionally_, even when the subtleties of mutable references + are involved +- Verify code that utilizes _static items_ + +Additionally, you will step through the process of verifying an implementation +of the Salsa20 stream cipher against a Cryptol reference specification, showing +how SAW's MIR capabilities may be used on a more realistic codebase. + +You can download the tutorial files: + +```{toctree} +:maxdepth: 2 +:caption: Contents + +introduction +prerequisites +about-mir-json +saw-basics +reference-types +compound-data-types +overrides-and-compositional-verification +static-items +case-study-salsa20 +a-final-word +``` diff --git a/doc/saw-user-manual/index.md b/doc/saw-user-manual/index.md new file mode 100644 index 0000000000..e868c0816c --- /dev/null +++ b/doc/saw-user-manual/index.md @@ -0,0 +1,36 @@ +# SAW User Manual + +:::{warning} +The SAW User Manual is currently being restructured/rewritten in large chunks. + +It is likely that you will encounter typos, omissions, and otherwise incorrect +or incomplete information about SAW and SAWScript's features and operation. + +Your help identifying these [documentation +issues](https://github.com/GaloisInc/saw-script/issues?q=is%3Aissue%20state%3Aopen%20label%3Adocumentation) +is deeply appreciated, as it helps us prioritize and resolve them more quickly. +Thanks for helping to make SAW better for everyone! +::: + +```{toctree} +:maxdepth: 2 +:caption: Contents + +introduction +invoking-saw +structure-of-sawscript +the-term-type +cryptol-and-its-role-in-saw +transforming-term-values +proofs-about-terms +symbolic-execution +symbolic-termination +loading-code +direct-extraction +creating-symbolic-variables +specification-based-verification +extraction-to-the-coq-theorem-prover +analyzing-hardware-circuits-using-yosys +bisimulation-prover +formal-deprecation-process +``` From f808628563d1da2d29e12026bccf796e8dd2e6ae Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Mon, 27 Jan 2025 20:02:14 -0800 Subject: [PATCH 32/67] saw-lexer: Add a simple pygments lexer for SAWScript. This is (mostly) based on the SAWScript Alex lexer; because pygments is quite a bit more simplistic, we have to be more careful when defining its states. I did not test this beyond the context of inline SAWScript in the documentation, and don't really plan on testing further at this time. As long as we have a passably-functional way to lex SAWScript for documentation, we should be fine. Ideally, this code wouldn't live here - it would be added to pygments. That said, the accompanying pyproject.toml means that, when installed, saw-lexer acts as a seamless extension of pygments; we won't have to do anything special when running Sphinx to tell it about this lexer. Additionally, if/when the lexer is added to the official pygments release, the changes required to the documentation build will be extremely small. Note in particular that the matching for builtins is lackluster, in that it is both liberal (based on basic prefix-matching) and incomplete (I am certain I missed things). I don't think it is anywhere close to our top priority, so for now I'm happy with what I saw in generated (HTML/PDF) documentation. --- doc/saw-lexer/pyproject.toml | 13 +++++ doc/saw-lexer/src/saw_lexer.py | 91 ++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 doc/saw-lexer/pyproject.toml create mode 100644 doc/saw-lexer/src/saw_lexer.py diff --git a/doc/saw-lexer/pyproject.toml b/doc/saw-lexer/pyproject.toml new file mode 100644 index 0000000000..d4a437374d --- /dev/null +++ b/doc/saw-lexer/pyproject.toml @@ -0,0 +1,13 @@ +[build-system] +requires = [ + "setuptools", +] +build-backend = "setuptools.build_meta" + +[project] +name = "saw-lexer" +version = "0.0.1" +dependencies = ["pygments"] + +[project.entry-points."pygments.lexers"] +saw_lexer = "saw_lexer:SAWScriptLexer" diff --git a/doc/saw-lexer/src/saw_lexer.py b/doc/saw-lexer/src/saw_lexer.py new file mode 100644 index 0000000000..cdac1c5131 --- /dev/null +++ b/doc/saw-lexer/src/saw_lexer.py @@ -0,0 +1,91 @@ +import sys +import re + + +import pygments +from pygments.lexer import RegexLexer, bygroups, using +from pygments.lexers.haskell import CryptolLexer +from pygments.token import ( + Punctuation, + Literal, + Comment, + Operator, + Keyword, + Name, + String, + Number, + Whitespace, +) + + +class SAWScriptLexer(RegexLexer): + name = "SAWScript" + aliases = ["sawscript", "saw-script"] + filenames = ["*.saw"] + tokens = { + "root": [ + # Whitespace-like tokens + (r"\s+", Whitespace), + (r"//.*?$", Comment.Singleline), + (r"/\*", Comment.Multiline, "comment"), + # String literals + (r"\"", String.Double, "string"), + # Embedded Cryptol + (r"\{\{|\{\|", Literal, "cryptol"), + # Symbols + (r"<-|->|==>", Operator.Word), + (r"~|-|\*|\+|/|%|\^|#|>>|>=|>|<<|<=|<|==|!=|&&|&|\|\||\||@", Operator), + (r"=", Operator.Word), + (r",|;|\(|\)|::|:|\[|\]|\{|\}|\.|\\", Punctuation), + # Reserved words (Keywords, types, constants, builtins) + # These require at least a space after (so we don't eat part of some + # other identifier) + ( + r"(import|and|let|rec|in|do|if|then|else|as|hiding|typedef)(\s+)", + bygroups(Keyword.Reserved, Whitespace), + ), + ( + ( + r"(CryptolSetup|JavaSetup|LLVMSetup|MIRSetup|ProofScript|" + r"TopLevel|CrucibleSetup|Int|String|Term|Type|Bool|AIG|" + r"CFG|CrucibleMethodSpec|LLVMSpec|JVMMethodSpec|JVMSpec|" + r"MIRSpec)(\s+)" + ), + bygroups(Keyword.Type, Whitespace), + ), + (r"(true|false|abc|z3)(\s+)", bygroups(Keyword.Constant, Whitespace)), + # N.b. The following is very liberal, but also missing many things. + # There is no centralized list of all builtins/primitives/initial + # basis elements... + ( + ( + r"((?:assume|external|goal|offline|load|print|prove|read|sat|save|write|llvm|jvm|mir|crucible|w4|sbv|unint)_?\w*|" + r"admit|beta_reduce_goal|enable_experimental|java_load_class|quickcheck|return|simplify|split_goal|trivial|unfolding)(\s+)" + ), + bygroups(Name.Builtin, Whitespace), + ), + # All other identifiers + (r"[a-zA-Z_][\w']*", Name), + # Number literals + (r"0[bB][0-1]+", Number.Bin), + (r"0[oO][0-7]+", Number.Oct), + (r"0[xX][0-9a-fA-F]", Number.Hex), + (r"\d+", Number.Integer), + ], + "comment": [ + (r"[^*/]", Comment.Multiline), + # Allows for arbitrary nesting + (r"/\*", Comment.Multiline, "#push"), + (r"\*/", Comment.Multiline, "#pop"), + (r"[*/]", Comment.Multiline), + ], + "string": [ + ('[^"]+', String.Double), + ('"', String.Double, "#pop"), + ], + "cryptol": [ + (r"[^|}]", using(CryptolLexer)), + (r"\|\}|\}\}", Literal, "#pop"), + (r"[|}]", using(CryptolLexer)), + ], + } From 71a2d4a71ebbd882786fe234470219c795350e82 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Mon, 27 Jan 2025 22:38:57 -0800 Subject: [PATCH 33/67] Prepare doc/ for Sphinx. - .gitignore hides Python junk, the Sphinx _build directory, and code.tar.gz archives (anticipating their creation as part of the document build) - Makefile ships with Sphinx; it's the default you get with a new project - requirements.txt is slightly cheated, sinced I built it in my already-working Sphinx setup (to get the version pins for reproducibility). Note also the commented final line that includes the local saw-lexer package as editable (for SAW developer convenience). Once this package has been added to a pygments release, we can remove this line entirely/update the versions of pygments and its dependencies. - conf.py is the most interesting addition, and the subject of the rest of this commit message conf.py is the Sphinx configuration file -- it is where basic information (such as the project title and author) are configured, as well as extensions, themes, and control over how the rendering engines behave. Notable elements of our configuration: - The extensions, in order of appearance: 1. Add a button to code blocks allowing content to be copied. Very useful for examples in the tutorials/manual! 2. There are no uses of this yet, but: Add a special type of reference that renders the target in a small window when you hover (useful for glossaries and other references) 3. A properly-themed 404 page, in case of accidental inclusion of broken links/references 4. Markdown parsing, with the following additional extensions: 1. AMSMath block element parsing (for nicely-rendered equation lists, matrices, etc.) 2. `:::` code-fencing, for compatibility with directive options 3. Definition lists 4. `$$` and `$$$$` LaTeX math rendering 5. 'Smart' replacements for certain special characters (e.g. (c)) 6. Typographically-correct quotation marks 7. The ability to render struck-through text, with ~~ - nitpicky mode, so reference validation is stricter - The exclusion of .venv (the build will be handled in a Python virutal environment), **/code directories (so books can place code source files in such directories), and the `doc/README.md` file from source files. - Use of the ReadTheDocs theme, which has been used at Galois for other documentation (including the Cryptol reference manual) - Some relatively complicated configuration for LaTeX. To make it easier to decide which books turn into PDFs, I added a `pdfs` variable referencing a list holding 3-tuples of strings of the following form: (, , "howto"|"manual") To start, the two tutorials and user manual are included in this list. This variable feeds the latex_documents configuration parameter of Sphinx. All documents are assumed to have an index (see a235e056b), and (other than the hierarchy it defines), the contents of this index will _not_ be included in the output. These contents can, for our purposes, be thought of us Web-exclusive. All PDFs will start with the Galois logo, render any URLs inline (in case someone wants a printed copy), and the font/chapter titles for manuals are adjusted slightly for readability and style. With a suitable Python environment, this is enough to build the documentation. --- doc/.gitignore | 5 +++ doc/Makefile | 20 ++++++++++ doc/conf.py | 94 ++++++++++++++++++++++++++++++++++++++++++++ doc/requirements.txt | 35 +++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 doc/.gitignore create mode 100644 doc/Makefile create mode 100644 doc/conf.py create mode 100644 doc/requirements.txt diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 0000000000..60c8dfeb07 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,5 @@ +__pycache__ +*.egg-info + +_build +code.tar.gz diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000000..d4bb2cbb9e --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000000..d79a1e51ad --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,94 @@ +# -- Project information ----------------------------------------------------- + +project = "SAW Documentation" +copyright = "2025, Galois, Inc" +author = "The SAW Development Team" + +# -- General configuration --------------------------------------------------- + +extensions = [ + "sphinx_copybutton", + "hoverxref.extension", + "notfound.extension", + "myst_parser", +] + +myst_enable_extensions = [ + "amsmath", + "colon_fence", + "deflist", + "dollarmath", + "replacements", + "smartquotes", + "strikethrough", +] + +# -- Options for markup ------------------------------------------------------ + +primary_domain = None + +# -- Options for the nitpicky mode ------------------------------------------- + +nitpicky = True + +# -- Options for source files ------------------------------------------------ + +exclude_patterns = [ + "_build", + "Thumbs.db", + ".DS_Store", + ".venv", + "**/code", + "README.md", +] + +# -- Options for HTML output ------------------------------------------------- + +html_theme = "sphinx_rtd_theme" + +# -- Options for LaTeX output ------------------------------------------------ + +pdfs: list[tuple[str, str, str]] = [ + ("llvm-java-verification-with-saw", "LLVM/Java Verification with SAW", "howto"), + ("rust-verification-with-saw", "Rust Verification with SAW", "howto"), + ("saw-user-manual", "SAW User Manual", "manual"), +] +"""Documents we wish to render to separate PDFs. + +These documents are given as 3-tuples of strings: + +(, , 'howto'|'manual') + +Usually, if you add something to the toctree in index.md, it will get an entry +here (or vice-versa). +The most notable exception is development/, where developer documentation (e.g. +the SAWCore external format reference) is stored. + +The document root directory is assumed to contain a document named index, +defining the toctree for that document. +The contents of this index (other than the table of contents it defines) will +_not_ be included in the rendered PDF, so can be used for Web-specific +materials. + +The title is what will render on the PDF's cover page. +This will usually match the title/first heading of the index document. + +'howto' will use \\section as the highest level of organization, while 'manual' +will use \\chapter. +Generally speaking, the former is more appropriate for shorter/tutorial-style +documents, while the latter is best for longer/reference-style documents. +When adding new materials to the SAW documentation, it is worth testing both +styles to see what flows more naturally. +""" + +latex_engine = "xelatex" +latex_documents = [ + (f"{doc_dir}/index", f"{doc_dir}.tex", title, author, style, True) + for doc_dir, title, style in pdfs +] +latex_logo = "figures/galois.pdf" +latex_show_urls = "inline" +latex_elements = { + "pointsize": "12pt", + "fncychap": r"\usepackage[Sonny]{fncychap}", +} diff --git a/doc/requirements.txt b/doc/requirements.txt new file mode 100644 index 0000000000..58931f0b7b --- /dev/null +++ b/doc/requirements.txt @@ -0,0 +1,35 @@ +alabaster==1.0.0 +babel==2.16.0 +certifi==2024.12.14 +charset-normalizer==3.4.1 +docutils==0.21.2 +idna==3.10 +imagesize==1.4.1 +Jinja2==3.1.5 +markdown-it-py==3.0.0 +MarkupSafe==3.0.2 +mdit-py-plugins==0.4.2 +mdurl==0.1.2 +myst-parser==4.0.0 +packaging==24.2 +pip==24.3.1 +Pygments==2.19.1 +PyYAML==6.0.2 +requests==2.32.3 +snowballstemmer==2.2.0 +Sphinx==8.1.3 +sphinx-copybutton==0.5.2 +sphinx-hoverxref==1.4.2 +sphinx-notfound-page==1.0.4 +sphinx-rtd-theme==3.0.2 +sphinxcontrib-applehelp==2.0.0 +sphinxcontrib-devhelp==2.0.0 +sphinxcontrib-htmlhelp==2.1.0 +sphinxcontrib-jquery==4.1 +sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-qthelp==2.0.0 +sphinxcontrib-serializinghtml==2.0.0 +urllib3==2.3.0 + +# Until we get SAWScriptLexer added to pygments +-e ./saw-lexer From b7e0232a6a303551a4bf2e79337335ee863054fd Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Mon, 27 Jan 2025 22:59:56 -0800 Subject: [PATCH 34/67] Add a Script that creates a Python virtual environment for SAW docs. Most documentation authors need not be concerned with the minutiae of the Python setup; while it is simple/typical of other Python projects, it's annoying to have to think about if your job is to be writing or maintaining documentation. This commit adds a script to help. First and foremost, if python3 is not available, it bails right away. Then, we handle an existing .venv: If it's ended up in some kind of botched state without an activation script, we run python3 -m venv .venv to try to fix it. Note that this is not robust to an ill-formed but existing .venv/bin/activate; that really didn't seem worth the effort here. We then activate this mystery environment, and check whether or not it has the proper dependencies installed (as given by requirements.txt, see 71a2d4a71 for more detail). If any are "not installed" (according to pip freeze output), we simply install from requirements.txt to resolve the issue. Finally, if no .venv was found to begin with: We combine the essence of these cases to create the environment. There is probably more error-handling than necessary in this script, but it's nice to have something that handles most of the likely scenarios one may find themself in. Additionally, with the exception of the case described above (where .venv/bin/activate does exist, but isn't the right thing), this script has the property that, after being run, a ready-to-go Python virtual environment is available at the .venv directory, i.e., sourcing .venv/bin/activate will get you into a state ready to build SAW documentation (or hack on the documentation build process itself). --- doc/setup_env.sh | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100755 doc/setup_env.sh diff --git a/doc/setup_env.sh b/doc/setup_env.sh new file mode 100755 index 0000000000..3dec68ca51 --- /dev/null +++ b/doc/setup_env.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Set up a new or existing .venv directory as a Python virtual environment +# suitable for building SAW documentation, particularly with make_docs.sh. + +echo "Checking for python3..." +if ! [ -x "$(command -v python3)" ]; +then + echo "Error: python3 is not installed." >&2 + return 1 +fi + +if [ -d ".venv" ]; +then + echo "Found a '.venv' directory." + + if ! [ -e .venv/bin/activate ] + then + echo -e "\033[1;33mWARNING:\033[0m '.venv/bin/activate' not found." + echo "Running python3 -m venv .venv to repair..." + python3 -m venv .venv + fi + + # We want to check _the virtual environment's_ pip list, so activate here. + . .venv/bin/activate + + if pip freeze -r requirements.txt 2>&1 | grep -q "not installed" + then + echo -e "\033[1;33mWARNING:\033[0m 'requirements.txt' not satisfied." + echo "Installing dependencies..." + pip install -qr requirements.txt + fi + + echo -e "\033[1;32mEnvironment updated successfully!\033[0m" + exit +fi + +echo "No '.venv' directory found." +echo "Running python3 -m venv .venv..." +python3 -m venv .venv + +. .venv/bin/activate + +echo "Installing dependencies..." +pip install -qr requirements.txt + +echo -e "\033[1;32mEnvironment created successfully!\033[0m" From 954ab67a2b18d09bb76e004095ce0d56d1baebbb Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Tue, 28 Jan 2025 01:30:08 -0800 Subject: [PATCH 35/67] Add helper script to build HTML/PDF documents with Sphinx. Sphinx's Makefile (doc/Makefile) is actually enough to build our documentation, if one has run setup_env.sh and activated the Python venv (with e.g. `source .venv/bin/activate). This script is a marriage of the two: Because setup_env.sh does no unnecessary work (if it finds a .venv with all the dependencies Sphinx/SAW docs need, it exits immediately), this script can combine running it, activating the resulting venv, performing the Sphinx build, and handling any auxilliary work that needs to be done outside the scope of Sphinx. The primary motivation was "avoid having to mess with the Python environment at all costs" - you'll never know there's a virtual environment if you always build the documentation using this script! The script is also extensible: Additional document formats we may wish to support can be easily added, as can commands to do other things (like cleanup). Document generation proceeds as follows: 1. setup_env.sh is run, giving a ready-to-go Python venv, which is activated 2. Probable code sample directories (i.e. directories named code/ in the tree rooted at doc/) are archived/compressed, so download links can be added to documents (when rendered to HTML, at least) 3. Use Sphinx's Makefile to do the actual building 4. When building PDFs, put them in a convenient spot (since we check in the PDF versions of materials for the time being) Note that this particular thing uses an optional shell feature, to avoid including the galois.pdf figure used as the logo in PDF renders. The 'clean' command cleans up all of Sphinx's output _and_ the generated code sample archives. The only thing not cleaned up by the script is .venv/ -- this is typically the thing whose maintenance slows things down, so it's best to only wipe it away when things get extremely gnarly. --- doc/make_docs.sh | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 doc/make_docs.sh diff --git a/doc/make_docs.sh b/doc/make_docs.sh new file mode 100755 index 0000000000..4715fe1ff2 --- /dev/null +++ b/doc/make_docs.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Add sphinx-build targets to this pattern as appropriate. +SUPPORTED_DOCS="html|latexpdf" + +# Commands that do other work / exit before attempting doc generation. +AUX_COMMANDS="clean" + +COMMANDS="${SUPPORTED_DOCS}|${AUX_COMMANDS}" +if [[ "${#}" -ne 1 ]] || [[ ! "${1}" =~ ^(${COMMANDS})$ ]]; then + echo "Usage: ${0} <${COMMANDS}>" + exit 1 +fi + +# N.b. Other ${AUX_COMMANDS} should be handled similarly. +if [[ "${1}" == "clean" ]]; then + echo "Removing '_build'..." + rm -rf _build + echo "Removing packaged code examples ('**/code.tar.gz')..." + rm -rf **/code.tar.gz + exit +fi + +# Begin document generation +DOC_TYPE="${1}" + +bash setup_env.sh +. .venv/bin/activate + +# For any directories named 'code', create a corresponding code.tar.gz. +# This can be used to provide a download for the entire directory, which is +# useful for tutorials in particular. +for i in **/code; do + if ! [ -d "${i}" ]; + then + continue + fi + + if ! [ -e "${i}/../code.tar.gz" ]; + then + echo "Packaging probable code example (${i})..." + tar -czvf "${i}/../code.tar.gz" -C "${i}" . + fi +done + +echo "Generating ${DOC_TYPE}..." +make "${DOC_TYPE}" + +shopt -s extglob +if [[ "${DOC_TYPE}" == "latexpdf" ]]; then + echo "Copying PDFs to doc/pdfs..." + mkdir -p pdfs + cp -f _build/latex/!(galois).pdf pdfs +fi +shopt -u extglob From a15e5b74244097acd5739daff181e06a2f01d644 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Tue, 28 Jan 2025 02:24:09 -0800 Subject: [PATCH 36/67] Commit PDF renderings of the tutorials and manual. At long last, we've run the build! Just kidding, it has been run many times to get us to this point :) Now is just the right time in the 'story' to commit these. @sauclovian-g suggested a CI check that compares PDF renders built in CI to the checked-out renders. Before that, I would advocate to remove the PDFs from the repository entirely, and provide them instead as 'releases' attached to commits to the default branch. That said, there are problems with trying to compare PDFs anyway, especially these TeX-generated PDFs that aren't the most portable things to begin with. Sphinx _does_ attempt to avoid re-building PDFs when working locally, but it seems to do so based on the state of the _build directory (a simple test where one of the PDFs is removed from that location and re-built confirms this). In any case, to continue providing the PDFs as before, this commit adds the result of running ./make_docs.sh latexpdf on my machine. --- doc/pdfs/llvm-java-verification-with-saw.pdf | Bin 0 -> 98064 bytes doc/pdfs/rust-verification-with-saw.pdf | Bin 0 -> 333368 bytes doc/pdfs/saw-user-manual.pdf | Bin 0 -> 409848 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/pdfs/llvm-java-verification-with-saw.pdf create mode 100644 doc/pdfs/rust-verification-with-saw.pdf create mode 100644 doc/pdfs/saw-user-manual.pdf diff --git a/doc/pdfs/llvm-java-verification-with-saw.pdf b/doc/pdfs/llvm-java-verification-with-saw.pdf new file mode 100644 index 0000000000000000000000000000000000000000..28f7d35e6ded419fa8cd09341a2a27ef4d4aa329 GIT binary patch literal 98064 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
    pRgHlu-hpSg))_8yO4LoQ=1!;270wj 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�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
      @K296v84t$?vmP9}O0A}tJNc*-uH9`Sq*qka0X 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

      !Q)P49UrdKf9lj!-`43G#^eisVUIqIh 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%0Di&mok>b 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%0Ai*Q)zUqfhOHWO+wls-}g(>(*#iJS2O^@aG!q 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 Date: Tue, 28 Jan 2025 14:03:49 -0800 Subject: [PATCH 37/67] Add a doc/ README. --- doc/README.md | 279 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 doc/README.md diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000000..29a33543e3 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,279 @@ +# SAW Documentation + +Welcome to the home of all things SAW documentation! + +This `README` covers: + +- Building the documentation +- The structure of `doc/` (this directory), including how to add new materials +- Information for developers working on the Sphinx build itself, and not just + documentation content + +## Building the documentation + +For the sake of rapid editing and simple deployment, we have attempted to make +it as easy as possible to build SAW's documentation, especially for those only +interested in modifying the documentation _content_. + +### Prerequisites + +The only _strict_ requirement to build the documentation locally is a relatively +recent Python (>=3.9, to be safe - we aren't prioritizing making this work on +every Python under the sun). + +This is enough to generate the HTML versions of documentation, which is what is +deployed to . + +If you want to generate the PDFs that can be found in `doc/pdfs`, you'll also +need `xelatex`. +This will require a suitable TeX distribution. + +### `make_docs.sh` + +`doc/make_docs.sh` is a bash script wrapping up all of the Python environment +and Sphinx build management. +Using this, you'll almost never need to think about anything related to the +Python behind the curtain. + +```console +$ ./make_docs.sh +Usage: ./make_docs.sh +``` + +Running the script with a documentation format does exactly what you expect: +A suitable Python environment is created, any probable code examples are +packaged (see [below](#code-examples)), and the actual Sphinx build is run. + +For the `latexpdf` target, in addition to the above, the +[generated PDFs](#pdf-generation) are copied to `pdfs/` so they can be committed +if necessary. + +The `clean` target wipes out the Sphinx outputs, as well as any code example +archives that were generated. + +#### `setup_env.sh` + +There is another script, `setup_env.sh`, that specifically handles the creation +and validation of a suitable Python environment without building the +documentation / code examples. + +You can run this separately from `make_docs.sh` if you'd like. + +### Troubleshooting + +1. If the build succeeds, but you aren't seeing all of the expected changes: + + Try running `./make_docs.sh clean` before rebuilding; Sphinx may have failed + to detect the changes you made, and you're seeing stale/cached output. +2. If you have unresolved reference warnings: + + Sphinx has an incredibly robust cross-reference system, but it is easy to + get "wrong". + If using Markdown/MyST, make sure you are using references according to [this + documentation](https://myst-parser.readthedocs.io/en/latest/syntax/cross-referencing.html). +3. If the build fails: + + Try removing the `.venv/` directory, forcing a fresh Python environment to be + created the next time you run `./make_docs.sh ...` or `./setup_env.sh`. + +If you still have trouble, you've likely uncovered a bug in the system. +Please [open an issue](https://github.com/GaloisInc/saw-script/issues) detailing +the expected behavior, the observed behavior, and instructions to reproduce the +observed behavior. + +## Understanding `doc/` + +This directory is the intended source root for all SAW documentation. + +### Contents + +- The `Makefile` and `conf.py` come from Sphinx; the former is the default one + gets when starting a new Sphinx project, the latter has been heavily + customized for SAW's needs. + +- `requirements.txt` captures a working set of Python dependencies in an attempt + to make documentation builds more reproducible. + +- `index.md` defines the top-level document hierarchy, and is the intended home + page of . + +- The `figures/` directory is used to store image files / similar resources used + throughout SAW documentation. + +- The `pdfs/` directory is where committed versions of PDF renderings live. + This may eventually be removed in favor of generating and distrubiting PDFs as + part of CI. + +- `saw-lexer` is a small Python package implementing a SAWScript `pygments` + lexer, so our documentation understands and properly renders `sawscript` code + blocks. + See f80862856: This can eventually be removed, once the lexer is added to an + official `pygments` release. + +The remaining directories correspond to individual SAW documentation resources +currently manged as part of this documentation ecosystem: + +- `llvm-java-verification-with-saw/` + "LLVM/Java Verification with SAW" + This is a tutorial-style introduction to SAW +- `rust-verification-with-saw/` + "Rust Verification with SAW" + Like the above, but using the experimental MIR features +- `saw-user-manual/` + "SAW User Manual" + The only 'complete' SAW reference right now +- `development/` + An assortment of documentation mostly relevant to developers of `saw-script`, + including:: + + - Documentation of the SAWCore `extcore` format + - Limitations of SAW and its use + - The `saw-script` release process + - A mirror of [the repository changelog](../CHANGES.md) + +### Non-contents + +These are pieces of documentation in `saw-script` that are _not_ part of the +`doc/` ecosystem: + +- `saw-core/doc/`: A lone TeX file, presumably describing formalism related to + the SAWCore intermediate representation +- `saw-remote-api/docs/`: An old Sphinx setup for SAW's Python remote API + +### Adding new materials + +Sphinx provides a great deal of flexibility, but we prefer to keep that +flexibility in check by maintaining a close correspondence between the directory +structure of `doc/` and the document hierarchy its contents define. + +That said, to add new documentation material: + +1. Create a new directory in `doc/` for your material. + Name it the same as your intended title, or an appropriate transformation (to + e.g. remove spaces/spcial characters). + + Add an `index.md` file that will define the top-level of your material's + hierarchy with a `toctree`. + Feel free to make this `toctree` `:hidden:`, give it a `:caption:`, or make + any other decisions appropriate for your material. + As long as the `toctree` is defined, even if it is hidden Sphinx will do the + right thing to generate HTML/PDFs. + + Do note that, for materials intended to add to `doc/pdfs/`, the contents of + their `index.md` (other than the hierarchical information) will **not** + render in the PDF - this is an intentional choice to allow for some + "HTML-only" content in the front-matter (e.g. code downloads for tutorials). +2. Create additional `.md` files for your content, organizing them using + `toctree`s as appropriate. + Ideally, for every entry in the top-level `toctree` of your material, there + will be a corresponding `.md` file (or directory of `.md` files, possibly + with its own `index.md` and additional `toctree`s). + This is how we maintain the directory structure / document hierarchy + correspondence. + +Note that your documentaiton doesn't necessarily _need_ its own directory; if +it's a single page, consider adding it as a single `.md` file to the most +appropriate directory, and adding an entry to the corresponding `toctree` (for +some examples of this, see `doc/development/`). + +#### Code examples + +It is useful to provide code sample downloads when writing tutorial-style +documentation materials, so readers can easily follow along. + +When building with the `make_docs.sh` helper script, `doc/` is set up to easily +allow code samples to be added anywhere they are needed. + +Note that this works best for materials that have their own dedicated directory: +If you are adding a document to a directory already containing code samples, +you'll need to determine whether it is appropriate to reorganize your document +so it can have its own downloadable code, or add to the code samples already +provided. + +To add code samples to your own material: + +1. Taking the note above into consideration, find/create the appropriate `code/` + directory. +2. Add your code/other materials to include in the package to it. +3. When you need to add a download link for the directory, use the path to the + `code/` directory, but add `.tar.gz`. + For example, if you've added `doc/my-cool-saw-tutorial` with code in + `doc/my-cool-saw-tutorial/code`, if you want to add a download link in + `doc/my-cool-saw-tutorial/index.md` you would write: + + ```markdown + Download sample files: + ``` + +**Important!** This convenience is **not** a built-in Sphinx feature, but a +feature provided by our higher-level `make_docs.sh` wrapper. +If you want to use Sphinx to build directly (e.g. with `make`), you will need +to generate the `code.tar.gz` files yourself, which will _not_ be validated as +'true' archives of the sibling `code/` directories. +For this reason, we strongly recommend that you _always_ build SAW documentation +using the helper scripts. + +#### PDF generation + +Some resources should be turned into PDFs stored in `doc/pdfs`. + +Fortunately, Sphinx allows for the layout of generated TeX / PDFs to be +controlled at a fairly granular level. +The file `doc/conf.py` attempts to simplify this for our purposes. + +In that configuration, there is a variable `pdfs` that holds a reference to a +list of 3-tuples of strings, each of which has the following form: + +`(, , "howto"|"manual")` + +The first entry is the root of the resource, assumed to contain an `index.md` +document defining the `toctree` for the resource. + +The second entry is the title as it will render on the PDF cover page. + +The third entry essentially determines the top-level layout of the material: +`"howto"` results in sections at the top-level, while `"manual"` results in +chapters. +It's a good idea to play with both to find the right fit for your documentation. + +By adding an entry to the `pdfs` list, Sphinx will build a TeX document and +corresonding PDF rooted at the configured directory. +This is indeed how we generate the separate tutorials and user manual, even +though `doc/` is _technically_ one giant document. + +If you need to use this feature, consult `doc/conf.py` for additional +documentation (and to see the tutorials/manual example configurations). + +## For developers + +These notes are primarily for those developers working on the documentation +ecosystem itself. + +### Sphinx doesn't _require_ Markdown + +Because all of the existing SAW documentation was authored in (variants of) +Markdown, it was convenient to use extensions (i.e. `myst-parser`) to quickly +move the existing work into a Sphinx environment without having to translate to +restructuredText. + +This is because Sphinx is a documentation _engine_, capable of handling all +kinds of inputs (and producing all kinds of outputs). +In this way, it is similar to the `pandoc` approach we took previously. + +That said, due to this flexibility, it is possible to mix-and-match reST and +Markdown when authoring documentation - Sphinx will take care of properly parsing +and resolving everything. + +We **strongly** recommend that you stick with Markdown (and the extensions +provided by MyST) unless strictly necessary when authoring SAW documentation, +for consistency with existing materials and to avoid issues resolving, for +example, heading levels. + +### The Python environment + +If you are hacking on the documentation build itself (e.g. configuring Sphinx, +playing with new extensions, or even simply upgrading the pinned dependencies in +<./requirements.txt>), you can manually activate the Python virtual environment +with `.venv/bin/activate`, and deactivate it again with `deactivate`. + +This ought not be necessary for most work on documentation. From 76be2626f96d3bc3ad6467dd7992d75f8b07e99b Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Tue, 28 Jan 2025 14:57:00 -0800 Subject: [PATCH 38/67] Attempt to fix file-bundling in CI. By using the new doc/ directory structure / modifying how/what gets copied somewhat. --- .github/ci.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/ci.sh b/.github/ci.sh index e9a549147c..9cadb596e6 100755 --- a/.github/ci.sh +++ b/.github/ci.sh @@ -84,15 +84,17 @@ build_cryptol() { bundle_files() { mkdir -p dist dist/{bin,deps,doc,examples,include,lib} + mkdir -p dist/doc/{llvm-java-verification-with-saw,rust-verification-with-saw,saw-user-manual} cp LICENSE README.md dist/ $IS_WIN || chmod +x dist/bin/* (cd deps/cryptol-specs && git archive --prefix=cryptol-specs/ --format=tar HEAD) | (cd dist/deps && tar x) - cp doc/extcore.md dist/doc - cp doc/tutorial/sawScriptTutorial.pdf dist/doc/tutorial.pdf - cp doc/manual/manual.pdf dist/doc/manual.pdf - cp -r doc/tutorial/code dist/doc + cp doc/pdfs/llvm-java-verification-with-saw.pdf dist/doc/llvm-java-verification-with-saw + cp doc/pdfs/rust-verification-with-saw.pdf dist/doc/rust-verification-with-saw + cp doc/pdfs/saw-user-manual.pdf dist/doc/saw-user-manual + cp -r doc/llvm-java-verification-with-saw/code dist/doc/llvm-java-verification-with-saw + cp -r doc/rust-verification-with-saw/code dist/doc/rust-verification-with-saw cp intTests/jars/galois.jar dist/lib cp -r deps/cryptol/lib/* dist/lib cp -r examples/* dist/examples From c484801f40bb85edcab244555efd3b070a3fa1ec Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Tue, 28 Jan 2025 16:44:55 -0800 Subject: [PATCH 39/67] Fix integration tests that reference documentation code. --- intTests/test0019_jvm_switch_statement/test.saw | 2 +- intTests/test_tutorial1/test.sh | 2 +- intTests/test_tutorial2/test.sh | 2 +- intTests/test_tutorial3/test.sh | 2 +- intTests/test_tutorial5/test.sh | 2 +- intTests/test_tutorial_w4/test.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/intTests/test0019_jvm_switch_statement/test.saw b/intTests/test0019_jvm_switch_statement/test.saw index d9276d10f2..8631996098 100644 --- a/intTests/test0019_jvm_switch_statement/test.saw +++ b/intTests/test0019_jvm_switch_statement/test.saw @@ -1,4 +1,4 @@ -import "../../doc/tutorial/code/ffs.cry"; +import "../../doc/llvm-java-verification-with-saw/code/ffs.cry"; FFS <- java_load_class "FFS"; java_ffs_imp <- jvm_extract FFS "ffs_imp"; prove_print abc {{ \x -> java_ffs_imp x == ffs_ref x }}; diff --git a/intTests/test_tutorial1/test.sh b/intTests/test_tutorial1/test.sh index 6b5d8942b8..ddebea3e67 100644 --- a/intTests/test_tutorial1/test.sh +++ b/intTests/test_tutorial1/test.sh @@ -2,7 +2,7 @@ set -e mkdir -p tmp -cp ../../doc/tutorial/code/* tmp +cp ../../doc/llvm-java-verification-with-saw/code/* tmp cd tmp $SAW ffs_java.saw $SAW ffs_java_crucible.saw diff --git a/intTests/test_tutorial2/test.sh b/intTests/test_tutorial2/test.sh index 77bf3d63a7..f7e9a7be7d 100644 --- a/intTests/test_tutorial2/test.sh +++ b/intTests/test_tutorial2/test.sh @@ -2,7 +2,7 @@ set -e mkdir -p tmp -cp ../../doc/tutorial/code/* tmp +cp ../../doc/llvm-java-verification-with-saw/code/* tmp cd tmp $SAW java_add.saw cd .. diff --git a/intTests/test_tutorial3/test.sh b/intTests/test_tutorial3/test.sh index 698fcbb456..d09a56ec2b 100644 --- a/intTests/test_tutorial3/test.sh +++ b/intTests/test_tutorial3/test.sh @@ -2,7 +2,7 @@ set -e mkdir -p tmp -cp ../../doc/tutorial/code/* tmp +cp ../../doc/llvm-java-verification-with-saw/code/* tmp cd tmp $SAW nqueens.saw cd .. diff --git a/intTests/test_tutorial5/test.sh b/intTests/test_tutorial5/test.sh index 9b0f8a1595..98b7edcc14 100644 --- a/intTests/test_tutorial5/test.sh +++ b/intTests/test_tutorial5/test.sh @@ -2,7 +2,7 @@ set -e mkdir -p tmp -cp ../../doc/tutorial/code/* tmp +cp ../../doc/llvm-java-verification-with-saw/code/* tmp cd tmp $SAW des-cryptol2.saw $SAW des3.saw diff --git a/intTests/test_tutorial_w4/test.sh b/intTests/test_tutorial_w4/test.sh index c413bf65b0..0e98fc96b1 100644 --- a/intTests/test_tutorial_w4/test.sh +++ b/intTests/test_tutorial_w4/test.sh @@ -2,7 +2,7 @@ set -e mkdir -p tmp -cp ../../doc/tutorial/code/* tmp +cp ../../doc/llvm-java-verification-with-saw/code/* tmp cd tmp sed -i.bak s/abc/w4/g ffs_java.saw sed -i.bak s/abc/w4/g ffs_llvm.saw From 43770b799906e4bd8026a512862cb7b242dc42d6 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 13:17:20 -0800 Subject: [PATCH 40/67] doc/bibliography: Restore the bib file from the LLVM/Java tutorial. Even though this is not used / referenced in the LLVM/Java tutorial (or any of the other documentation, for that matter), it is best we keep it around for now. --- doc/README.md | 3 +++ doc/bibliography/saw.bib | 56 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 doc/bibliography/saw.bib diff --git a/doc/README.md b/doc/README.md index 29a33543e3..a0587910d4 100644 --- a/doc/README.md +++ b/doc/README.md @@ -97,6 +97,9 @@ This directory is the intended source root for all SAW documentation. - `index.md` defines the top-level document hierarchy, and is the intended home page of . +- The `bibliography/` directory contains BibTeX (and possibly other) + bibliographies. + - The `figures/` directory is used to store image files / similar resources used throughout SAW documentation. diff --git a/doc/bibliography/saw.bib b/doc/bibliography/saw.bib new file mode 100644 index 0000000000..ca139382d1 --- /dev/null +++ b/doc/bibliography/saw.bib @@ -0,0 +1,56 @@ +@book{Lindholm:1999:JVM:553607, + author = {Lindholm, Tim and Yellin, Frank}, + title = {Java Virtual Machine Specification}, + year = {1999}, + isbn = {0201432943}, + edition = {2nd}, + publisher = {Addison-Wesley Longman Publishing Co., Inc.}, + address = {Boston, MA, USA}, +} + +@Inproceedings{erkok-matthews-cryptolEqChecking-09, + author = "Levent {Erk\"{o}k} and John Matthews", + title = "Pragmatic Equivalence and Safety Checking in {C}ryptol", + booktitle = "Programming Languages meets Program Verification, PLPV'09, + Savannah, Georgia, USA", + publisher = "ACM Press", + month = jan, + pages = "73--81", + year = "2009", +} + +@INPROCEEDINGS{ABC, + author = "Robert K. Brayton and Alan Mishchenko", + title = "{ABC}: An Academic Industrial-Strength Verification Tool", + booktitle = "CAV'10", + pages = {24-40}, + year = {2010} +} + +@Unpublished{SEC2, + key = Certicom, + title = "Certicom {R}esearch: {SEC 2}: {R}ecommended {E}lliptic {C}urve {D}omain {P}arameters, {S}tandards for {E}fficient {C}ryptography", + year = {2000}, + note = {\url{http://www.secg.org/collateral/sec2_final.pdf}}, +} + +@techreport{CryptolSBV, + author = {Levent Erk\"{o}k}, + title = {Equivalence and Safety Checking in {Cryptol}}, + institution = {Galois, Inc.}, + year = {2008}, + month = aug, +} + +@Unpublished{Cryptol, + key = Cryptol, + note = {\url{http://cryptol.net}}, + title = {{Cryptol} web site}, +} + +@book{DecisionProcedures2008, + author = {Daniel Kroening and Ofer Strichman}, + title = {Decision Procedures: An Algorithmic Point of View}, + year = {2008}, + publisher = {Springer}, +} From 4b34431449aa52a844dddff0f23e3d840d285cd3 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 13:23:58 -0800 Subject: [PATCH 41/67] rust-verification-with-saw: Replace missing '`' in Cryptol type var. Because it created an ill-formed inline code block, I removed a backtick from a Cryptol type variable in an earlier commit. This was a hasty decision, and incorrect! I also learned from this experience that it's possible to use double backticks in Markdown when your inline code itself contains backticks. Neat, and fits nicely given that adding a third naturally creates a code block 'fence' that renders as a block element. --- doc/rust-verification-with-saw/case-study-salsa20.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/rust-verification-with-saw/case-study-salsa20.md b/doc/rust-verification-with-saw/case-study-salsa20.md index 5f99f2eeb4..f80d83a032 100644 --- a/doc/rust-verification-with-saw/case-study-salsa20.md +++ b/doc/rust-verification-with-saw/case-study-salsa20.md @@ -497,7 +497,7 @@ Note that: of values that is chosen in the `rounds` function. (Note that `\/` is the logical-or function in Cryptol.) Each of these are concrete values that are less than `STATE_WORDS` (`16`), so we no longer need a precondition stating - `a < STATE_WORDS /\ ...`. + ``a < `STATE_WORDS /\ ...``. * Because we now reference `indices` in the preconditions, we have moved its definition up. (Previously, it was defined in the postconditions section.) From b1aa596555d42459797b70c27e14a53ad5829e19 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 14:53:27 -0800 Subject: [PATCH 42/67] Corrections to spelling errors. --- doc/README.md | 4 ++-- .../overrides-and-compositional-verification.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/README.md b/doc/README.md index a0587910d4..5b025e02b5 100644 --- a/doc/README.md +++ b/doc/README.md @@ -114,7 +114,7 @@ This directory is the intended source root for all SAW documentation. official `pygments` release. The remaining directories correspond to individual SAW documentation resources -currently manged as part of this documentation ecosystem: +currently managed as part of this documentation ecosystem: - `llvm-java-verification-with-saw/` "LLVM/Java Verification with SAW" @@ -174,7 +174,7 @@ That said, to add new documentation material: This is how we maintain the directory structure / document hierarchy correspondence. -Note that your documentaiton doesn't necessarily _need_ its own directory; if +Note that your documentation doesn't necessarily _need_ its own directory; if it's a single page, consider adding it as a single `.md` file to the most appropriate directory, and adding an entry to the corresponding `toctree` (for some examples of this, see `doc/development/`). diff --git a/doc/rust-verification-with-saw/overrides-and-compositional-verification.md b/doc/rust-verification-with-saw/overrides-and-compositional-verification.md index eff49c4f25..4d2e998e5d 100644 --- a/doc/rust-verification-with-saw/overrides-and-compositional-verification.md +++ b/doc/rust-verification-with-saw/overrides-and-compositional-verification.md @@ -115,7 +115,7 @@ have some additional lines of output in between: * Whenever SAW prints "`Matching overrides of `", that's when you know that SAW is about to simulate a call to ``. At that point, SAW will check to see how many overrides (``) for `` are available. -* Whenever SAW prints "`Brancing on override variants of `", SAW is +* Whenever SAW prints "`Branching on override variants of `", SAW is trying to figure out which of the `` overrides to apply. In this example, there is only a single override, so the choice is easy. In cases where there are multiple overrides, however, SAW may have to work harder (possibly even From 8e0179e81d8c04a6dcfa1893fe8f3891c09e29c7 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 15:15:47 -0800 Subject: [PATCH 43/67] doc/README: Add clarifying reference to description of `make_docs`. To clarify that `make_docs.sh` handles setting up the Python environment, this commit adds a link to the section of the README about the `setup_env.sh` script. There is also a reiteration of the fact that a Python installation >=3.9 is required. --- doc/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/README.md b/doc/README.md index 5b025e02b5..b20a80e776 100644 --- a/doc/README.md +++ b/doc/README.md @@ -31,9 +31,10 @@ This will require a suitable TeX distribution. ### `make_docs.sh` `doc/make_docs.sh` is a bash script wrapping up all of the Python environment -and Sphinx build management. +and Sphinx build management, via [a separately-runnable script we +provide](#the-python-environment). Using this, you'll almost never need to think about anything related to the -Python behind the curtain. +Python behind the curtain, as long as you have a Python >=3.9 installation. ```console $ ./make_docs.sh From 497171878b6f7f565a2312cc2faa2bc4bb14d3de Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 15:17:27 -0800 Subject: [PATCH 44/67] doc/README: Remove note about removing `saw-lexer`. Since we're still working on things, there's no good reason to upstream this to `pygments`, and thusly no good reason to mention it in the README. Additionally, using Markdown's absurdity, I reworded the description of `saw-lexer` to properly refer to how code blocks need to be labeled for the SAWScript lexer to be applied for highlighting (the absurdity being the need for _four_ backticks on either side, in order to render three backticks within in the code block). --- doc/README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/doc/README.md b/doc/README.md index b20a80e776..df4756cebd 100644 --- a/doc/README.md +++ b/doc/README.md @@ -109,10 +109,8 @@ This directory is the intended source root for all SAW documentation. part of CI. - `saw-lexer` is a small Python package implementing a SAWScript `pygments` - lexer, so our documentation understands and properly renders `sawscript` code - blocks. - See f80862856: This can eventually be removed, once the lexer is added to an - official `pygments` release. + lexer, so our documentation understands and properly renders fenced code + blocks labeled ```````sawscript````. The remaining directories correspond to individual SAW documentation resources currently managed as part of this documentation ecosystem: From 0eb36f32c79971d6a12e0d7a812ddd5ec1fbf8a3 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 17:19:24 -0800 Subject: [PATCH 45/67] doc/README: Add clarifying reference about PDF titles. So that it's clearer that the exclusion of the index document means exclusion of its title, and that titles for PDFs are configured when adding a new entry to the list of PDFs to generate. --- doc/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/README.md b/doc/README.md index df4756cebd..721f014fd1 100644 --- a/doc/README.md +++ b/doc/README.md @@ -165,6 +165,8 @@ That said, to add new documentation material: their `index.md` (other than the hierarchical information) will **not** render in the PDF - this is an intentional choice to allow for some "HTML-only" content in the front-matter (e.g. code downloads for tutorials). + See [below](#pdf-generation) for information about setting the title of + generated PDFs given this rendering quirk. 2. Create additional `.md` files for your content, organizing them using `toctree`s as appropriate. Ideally, for every entry in the top-level `toctree` of your material, there From 392ae5e71f50554c5677cb7aba239689828e9c4a Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 15:45:35 -0800 Subject: [PATCH 46/67] saw-lexer: Cleanup imports. --- doc/saw-lexer/src/saw_lexer.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/doc/saw-lexer/src/saw_lexer.py b/doc/saw-lexer/src/saw_lexer.py index cdac1c5131..f4e6b90786 100644 --- a/doc/saw-lexer/src/saw_lexer.py +++ b/doc/saw-lexer/src/saw_lexer.py @@ -1,8 +1,3 @@ -import sys -import re - - -import pygments from pygments.lexer import RegexLexer, bygroups, using from pygments.lexers.haskell import CryptolLexer from pygments.token import ( From 98386e975b7bfe9078a56635dd3788e4056d74f5 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 15:45:59 -0800 Subject: [PATCH 47/67] saw-lexer: Remove special 'Name.Builtin' handling. First, my comment was inaccurate -- there is a big table of builtins in the interpreter (thanks @sauclovian-g for pointing this out). As he rightfully noted, one day we will like to have these / their docstrings generate an appendix for the user manual. Second, other than looking a bit fancier in the render, there's not too much reason to give special treatment to the builtin functions and how they render; so, since we already plan to generate documentation of the builtins eventually anyway, we can let them be lexed as regular identifiers (and in the future add references to the appendix). --- doc/saw-lexer/src/saw_lexer.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/doc/saw-lexer/src/saw_lexer.py b/doc/saw-lexer/src/saw_lexer.py index f4e6b90786..cf656d08b8 100644 --- a/doc/saw-lexer/src/saw_lexer.py +++ b/doc/saw-lexer/src/saw_lexer.py @@ -49,16 +49,6 @@ class SAWScriptLexer(RegexLexer): bygroups(Keyword.Type, Whitespace), ), (r"(true|false|abc|z3)(\s+)", bygroups(Keyword.Constant, Whitespace)), - # N.b. The following is very liberal, but also missing many things. - # There is no centralized list of all builtins/primitives/initial - # basis elements... - ( - ( - r"((?:assume|external|goal|offline|load|print|prove|read|sat|save|write|llvm|jvm|mir|crucible|w4|sbv|unint)_?\w*|" - r"admit|beta_reduce_goal|enable_experimental|java_load_class|quickcheck|return|simplify|split_goal|trivial|unfolding)(\s+)" - ), - bygroups(Name.Builtin, Whitespace), - ), # All other identifiers (r"[a-zA-Z_][\w']*", Name), # Number literals From 094cdc3755ea4d96df4b4f4255c9112bc240fcd3 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 16:34:52 -0800 Subject: [PATCH 48/67] Remove CHANGES mirror from developer docs and restore link text. We're going to hide developer docs from Sphinx anyway, but this essentially puts things back to how they were before this PR (with the addition of an extra '..' to get to the right place. Essentially, this change reflects our desire for doc/developer/releasing.md to be readable on GH, and properly link to the change log at the repository root. --- doc/development/changes.md | 10 ---------- doc/development/index.md | 2 -- doc/development/releasing.md | 2 +- 3 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 doc/development/changes.md diff --git a/doc/development/changes.md b/doc/development/changes.md deleted file mode 100644 index 97e36ef79e..0000000000 --- a/doc/development/changes.md +++ /dev/null @@ -1,10 +0,0 @@ -# `CHANGES.md` - -:::{note} -This document is automatically generated from `CHANGES.md` maintained in the -`saw-script` repo. -::: - -:::{literalinclude} ../../CHANGES.md -:language: markdown -::: diff --git a/doc/development/index.md b/doc/development/index.md index 1c5b580d8d..c10acdc32f 100644 --- a/doc/development/index.md +++ b/doc/development/index.md @@ -21,7 +21,6 @@ Currently, we document: ::: - The `saw-script` [release process](releasing), such that any developer with merge-to-default access can easily create and reproduce SAW releases. -- [Changes](changes) to `saw-script`. :::{toctree} :hidden: @@ -29,5 +28,4 @@ Currently, we document: sawcore-external-format/index limitations releasing -changes ::: diff --git a/doc/development/releasing.md b/doc/development/releasing.md index 19ddd76858..477ef4d783 100644 --- a/doc/development/releasing.md +++ b/doc/development/releasing.md @@ -25,7 +25,7 @@ The release process is: - successful build artifacts across all platforms, - successful tests on all test suites, and - - an up-to-date [CHANGES.md](changes) file. + - an up-to-date [CHANGES.md](../../CHANGES.md) file. 2. Create a draft release on GitHub 3. Make a commit on the `release-n.n` branch updating the version in the From b45563544d44f8818eb76924655f0e3d4743480f Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 16:53:04 -0800 Subject: [PATCH 49/67] doc/development: Consolidate extcore documentation into extcore.md. --- doc/development/extcore.md | 310 ++++++++++++++++++ doc/development/index.md | 4 +- .../sawcore-external-format/applications.md | 27 -- .../arrays-tuples-and-records.md | 28 -- .../booleans-and-bit-vectors.md | 26 -- .../custom-data-types.md | 39 --- .../function-abstractions.md | 32 -- .../sawcore-external-format/index.md | 22 -- .../inputs-and-scalar-constants.md | 20 -- .../sawcore-external-format/introduction.md | 79 ----- .../sawcore-external-format/reference.md | 50 --- 11 files changed, 312 insertions(+), 325 deletions(-) create mode 100644 doc/development/extcore.md delete mode 100644 doc/development/sawcore-external-format/applications.md delete mode 100644 doc/development/sawcore-external-format/arrays-tuples-and-records.md delete mode 100644 doc/development/sawcore-external-format/booleans-and-bit-vectors.md delete mode 100644 doc/development/sawcore-external-format/custom-data-types.md delete mode 100644 doc/development/sawcore-external-format/function-abstractions.md delete mode 100644 doc/development/sawcore-external-format/index.md delete mode 100644 doc/development/sawcore-external-format/inputs-and-scalar-constants.md delete mode 100644 doc/development/sawcore-external-format/introduction.md delete mode 100644 doc/development/sawcore-external-format/reference.md diff --git a/doc/development/extcore.md b/doc/development/extcore.md new file mode 100644 index 0000000000..3db7790763 --- /dev/null +++ b/doc/development/extcore.md @@ -0,0 +1,310 @@ +# SAWCore External Format + +## Introduction + +Consider the following example SAWScript program: + +```sawscript +main = do { + let excluded_middle x = x || not x; + print_term excluded_middle; + write_core "excluded_middle.extcore" excluded_middle; +}; +``` + +The `print_term` command pretty prints the representation of +`excluded_middle` as a term in the core language. + +```text +\(x::Prelude.Bool) -> Prelude.or x (Prelude.not x) +``` + +The `write_core` command outputs a file in a more easily +computer-readable `extcore` format. (The format can then be read in by +the `read_core` command.) + +```text +SAWCoreTerm 8 +1 Data Prelude.Bool +2 Global Prelude.or +3 Var 0 +4 App 2 3 +5 Global Prelude.not +6 App 5 3 +7 App 4 6 +8 Lam x 1 7 +``` + +An `extcore` file encodes a single term of the core language by +assigning a numeric index to each of its unique subterms. + +Each line in an `extcore` file consists of a sequence of tokens +separated by whitespace. The tokens may be names (alphanumeric +identifiers, possibly including dot-separated qualifiers), numeric +indexes, or literals. The first line is a header containing the magic +string `SAWCoreTerm` followed by the index of the final term (i.e., +the output term). + +Each subsequent line defines a new term, following a standard format: +First is the new index to be defined, then a keyword indicating what +kind of term, and finally a sequence of tokens (the number and type of +which determined by the keyword). Each line can refer to any +previously defined index. + +In the following table, angle brackets enclose descriptions of each +argument. Parentheses and asterisks are used to describe patterns of +valid arguments, and will not show up in files. + +| Form | Description | +| ------------------------------------------------------- | ------------------------------------| +| `ExtCns ` | External input | +| `Lam ` | Function abstraction | +| `Pi ` | Function type | +| `Var ` | Bound variable (de Bruijn indexed) | +| `Global ` | Toplevel constant | +| `App ` | Function application | +| `Tuple *` | Tuple value | +| `TupleT *` | Tuple type | +| `TupleSel ` | Tuple component selector (`x.1`) | +| `Record ( )*` | Record value | +| `RecordT ( )*` | Record type | +| `RecordSel ` | Record component selector (`x.foo`) | +| `Ctor *` | Data constructor value | +| `Data *` | Datatype | +| `Sort ` | Sort | +| `Nat ` | Non-negative integer literal | +| `Array *` | Array value (e.g. `[1, 2, 3]`) | +| `Float ` | Literal of type `Float` | +| `Double ` | Literal of type `Double` | +| `String ` | Literal of type `String` | + +The following sections describe each of these keywords in more detail. + +## Inputs and Scalar Constants + +The simplest terms in `extcore` refer to external inputs and constant +values. Two types of external inputs exist. + +The `ExtCns` keyword indicates an input identified by index, with a +declared type, and a name that exists primarily as a comment. Inputs +of this type are most appropriate when thinking of the term as a +representation of a circuit. + +The `Global` keyword indicates a global term identified by name. This +keyword is primarily used to refer to built-in operators, such as +prelude functions that operate on bit vectors. + +Constants can be written with one of the keywords `Nat`, `Float`, +`Double`, or `String`, followed by the value of the constant. Bit +vector constants can be created by applying the function described in +the "Bit Vectors" section that converts a natural number to a bit +vector. Later sections describe how to write aggregated or structured +constants. + +## Applications + +Computations in SAWCore are accomplished by applying operators (or any +term of function type) to operands. Application is structured in +"curried" form: each application node applies a node of function type +to one argument. Functions that take multiple arguments require +multiple application nodes. For example, to add two 8-bit bit vectors, +we can use the following code: + +```text +1 Global Prelude.bitvector +2 Nat 8 +3 App 1 2 +4 ExtCns 0 "x" 3 +5 ExtCns 1 "y" 3 +6 Global Prelude.bvAdd +7 App 6 2 +8 App 7 4 +9 App 8 5 +``` + +This snippet applies the builtin `bitvector` type to the natural +number 8, to form the type of the input variables. These inputs are +then declared on lines 4 and 5. Line 7 then applies the builtin +`bvAdd` to the natural number 8 (to tell it the size of the following +bit vectors). Finally, lines 8 and 9 continue the application to +include the two input variables. + +## Booleans and Bit Vectors + +The previous section gave an example of a bit vector operation. The +SAWCore prelude contains a number of built-in operations on both bit +vectors and booleans. + +Th `bvNat` function constructs a constant bit vector, of a given size, +from the given natural number. Conversely, the `bvToNat` function +takes a bit vector length, a vector of this length, and returns the +corresponding natural number. + +The usual bit vector operators work on one or more bit vectors of a +single vector size. These functions take a natural number as their +first argument, indicating the size of the following bit vectors. + +There are a few exceptions to this general pattern. The unsigned bit +vector shifting operations take a natural number as their second +operand. All signed bit vector operations take a natural number one +smaller than the size of their remaining arguments (to ensure that +their arguments have non-zero size). The `bvAppend` operator takes two +natural numbers, corresponding to the lengths of its two bit vector +arguments, and returns a bit vector with length correponding to the +sum of the lengths of its arguments. + +The complete collection of bit vector operations appears in the +Reference section at the end of this document. + +## Arrays, Tuples and Records + +SAWCore allows aggregation of arbitrary data types into composite +types: arrays, tuples, and records. Arrays are collections, of known +size, containing multiple values of the same type. Tuples contain a +list of values that match, in order, a given list of types. Records +are like tuples with named rather than numbered fields. + +For each of these composite forms, SAWCore includes constructs for +building both types and values. + +To construct an array type, apply the builtin `prelude.Vec` to the +desired size followed by the type of its elements. To construct an +array value, use the keyword `Array` followed by the node index of its +type, and then all of the node indices of its elements. Bit vectors in +SAWCore are actually just arrays of boolean values. + +To construct a tuple type, use the `TupleT` keyword followed by the +indices of the individual element types. To construct a tuple value, +use the `Tuple` keyword followed by the indices of the individual +element values. Finally, to select an element from a tuple value, use +the `TupleSel` keyword followed by the index of the tuple value and +then the element number to extract. + +Record types and values are like tuple types and values, except that +each type or value index is preceded by a field name. Record field +selection is identical to tuple element selection except that it uses +a field name instead of an element index. + +## Function Abstractions + +SAWCore allows the creation of function abstractions. The construct +`Lam ` causes a function argument value of the given type +to be bound within the term specified by the second argument. +Functions with multiple arguments are constructed with multiple nested +`Lam` nodes. Within the term, an argument can be accessed by the +construct `Var ` where an index of `0` corresponds to the +variable bound by the most recent enclosing `Lam`, an index of `1` +corresponds to the variable bound by a `Lam` one level removed, and so +on. Function abstractions can allow code to be abstracted over +different arguments, and applied multiple times in multiple contexts. +They can also be used as an alternative to the `ExtCns` inputs +described previously. + +As an example, the code presented earlier in the Application section, +to add two 8-bit bit vector arguments, could be restructured to use +`Lam` and `Var` as follows: + +```text +1 Global Prelude.bitvector +2 Nat 8 +3 App 1 2 +4 Global Prelude.bvAdd +5 App 4 2 +6 Var 0 3 +7 Var 1 3 +8 App 5 6 +9 App 8 7 +10 Lam x 3 9 +11 Lam x 3 10 +``` + +## Custom Data Types + +Several built-in data types, such as records and tuples, have +dedicated syntax within the language. Other data types, however, +including vectors and booleans, are defined as a set of type +constructors and data constructors. + +Type constructors, including `Vec` and `Bool`, take zero or more +arguments inline (i.e., they are not applied with the `App` form), and +create a node corresponding to a data type. The `Bool` type +constructor takes no arguments, while the `Vec` constructor takes two, +a natural number representing its size followed by the type index of +its elements. + +To create a value of a type specified by one of these type +constructors, apply one of the zero or more data constructors +associated with the type. Each data constructor may take zero or more +arguments. + +Boolean values (corresponding to type constructor `Bool`) can be +constructed with the two data constructors `True` and `False`, both of +which take zero arguments. + +Values of vector type can be constructed in two ways. The built-in form +`Array` takes a type index (corresponding to the element type) as its +first argument, followed by a sequence of element expression indices. + +Alternatively, vector values can be constructed piece-by-piece using +the two data constructors: + +- `EmptyVec` which takes a type as an argument and produces a vector + with zero elements of that type, and + +- `ConsVec` which takes a type, a value, a size, and an existing + vector of that given size, and produces a new vector of size one + larger, with the given element value at the beginning. + +Other type and data constructors exist in the SAWCore prelude, but +they rarely occur in terms exported for analysis by third-party tools. + +## Reference + +This section summarizes the built-in types, boolean functions, and bit +vector functions defined in the SAWCore prelude. These types and +functions will apppear in `extcore` files in the form +`Prelude.`, but are listed below in the form ``, without +the `Prelude` prefix, for brevity and readability. + +### Prelude types + +| Name | Kind | Comments | +| ----------- | --------------------- | ----------------------------- | +| `Bool` | `Type` | | +| `Nat` | `Type` | | +| `bitvector` | `Nat -> Type` | Abbreviation for `Vec n Bool` | +| `Vec` | `Nat -> Type -> Type` | | +| `String` | `Type` | | + +### Prelude boolean functions + +| Name | Type | +| -------- | --------------------------------- | +| `and` | `Bool -> Bool -> Bool` | +| `or` | `Bool -> Bool -> Bool` | +| `xor` | `Bool -> Bool -> Bool` | +| `boolEq` | `Bool -> Bool -> Bool` | +| `not` | `Bool -> Bool` | +| `ite` | `(a:Type) -> Bool -> a -> a -> a` | + +### Prelude bit vector functions + +| Name | Type | +| --------- | ------------------------------------------------------------------------ | +| `msb` | `(n:Nat) -> bitvector (n + 1) -> Bool` | +| `bvNat` | `(n:Nat) -> Nat -> bitvector n` | +| `bvToNat` | `(n:Nat) -> bitvector n -> Nat` | +| `bvAdd` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvSub` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvMul` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvUDiv` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvURem` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvSDiv` | `(n:Nat) -> bitvector (n + 1) -> bitvector (n + 1) -> bitvector (n + 1)` | +| `bvSRem` | `(n:Nat) -> bitvector (n + 1) -> bitvector (n + 1) -> bitvector (n + 1)` | +| `bvAnd` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvOr` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvXor` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | +| `bvNot` | `(n:Nat) -> bitvector n -> bitvector n` | +| `bvShl` | `(n:Nat) -> bitvector n -> Nat -> bitvector n` | +| `bvShr` | `(n:Nat) -> bitvector n -> Nat -> bitvector n` | +| `bvSShr` | `(n:Nat) -> bitvector (n + 1) -> bitvector n -> bitvector (n + 1)` | diff --git a/doc/development/index.md b/doc/development/index.md index c10acdc32f..00085384bd 100644 --- a/doc/development/index.md +++ b/doc/development/index.md @@ -5,7 +5,7 @@ These resources are mainly intended for developers working on the internals of Currently, we document: -- The [SAWCore external format, `extcore`](sawcore-external-format/index), which +- The [SAWCore external format, `extcore`](extcore), which is a text-based serialization of the low-level representation of SAWScript `Term`s. @@ -25,7 +25,7 @@ Currently, we document: :::{toctree} :hidden: -sawcore-external-format/index +extcore limitations releasing ::: diff --git a/doc/development/sawcore-external-format/applications.md b/doc/development/sawcore-external-format/applications.md deleted file mode 100644 index 6e79d79419..0000000000 --- a/doc/development/sawcore-external-format/applications.md +++ /dev/null @@ -1,27 +0,0 @@ -# Applications - -Computations in SAWCore are accomplished by applying operators (or any -term of function type) to operands. Application is structured in -"curried" form: each application node applies a node of function type -to one argument. Functions that take multiple arguments require -multiple application nodes. For example, to add two 8-bit bit vectors, -we can use the following code: - -:::{code-block} text -1 Global Prelude.bitvector -2 Nat 8 -3 App 1 2 -4 ExtCns 0 "x" 3 -5 ExtCns 1 "y" 3 -6 Global Prelude.bvAdd -7 App 6 2 -8 App 7 4 -9 App 8 5 -::: - -This snippet applies the builtin `bitvector` type to the natural -number 8, to form the type of the input variables. These inputs are -then declared on lines 4 and 5. Line 7 then applies the builtin -`bvAdd` to the natural number 8 (to tell it the size of the following -bit vectors). Finally, lines 8 and 9 continue the application to -include the two input variables. diff --git a/doc/development/sawcore-external-format/arrays-tuples-and-records.md b/doc/development/sawcore-external-format/arrays-tuples-and-records.md deleted file mode 100644 index 1f92b01900..0000000000 --- a/doc/development/sawcore-external-format/arrays-tuples-and-records.md +++ /dev/null @@ -1,28 +0,0 @@ -# Arrays, Tuples and Records - -SAWCore allows aggregation of arbitrary data types into composite -types: arrays, tuples, and records. Arrays are collections, of known -size, containing multiple values of the same type. Tuples contain a -list of values that match, in order, a given list of types. Records -are like tuples with named rather than numbered fields. - -For each of these composite forms, SAWCore includes constructs for -building both types and values. - -To construct an array type, apply the builtin `prelude.Vec` to the -desired size followed by the type of its elements. To construct an -array value, use the keyword `Array` followed by the node index of its -type, and then all of the node indices of its elements. Bit vectors in -SAWCore are actually just arrays of boolean values. - -To construct a tuple type, use the `TupleT` keyword followed by the -indices of the individual element types. To construct a tuple value, -use the `Tuple` keyword followed by the indices of the individual -element values. Finally, to select an element from a tuple value, use -the `TupleSel` keyword followed by the index of the tuple value and -then the element number to extract. - -Record types and values are like tuple types and values, except that -each type or value index is preceded by a field name. Record field -selection is identical to tuple element selection except that it uses -a field name instead of an element index. diff --git a/doc/development/sawcore-external-format/booleans-and-bit-vectors.md b/doc/development/sawcore-external-format/booleans-and-bit-vectors.md deleted file mode 100644 index 0a3d9c84b7..0000000000 --- a/doc/development/sawcore-external-format/booleans-and-bit-vectors.md +++ /dev/null @@ -1,26 +0,0 @@ -# Booleans and Bit Vectors - -The previous section gave an example of a bit vector operation. The -SAWCore prelude contains a number of built-in operations on both bit -vectors and booleans. - -Th `bvNat` function constructs a constant bit vector, of a given size, -from the given natural number. Conversely, the `bvToNat` function -takes a bit vector length, a vector of this length, and returns the -corresponding natural number. - -The usual bit vector operators work on one or more bit vectors of a -single vector size. These functions take a natural number as their -first argument, indicating the size of the following bit vectors. - -There are a few exceptions to this general pattern. The unsigned bit -vector shifting operations take a natural number as their second -operand. All signed bit vector operations take a natural number one -smaller than the size of their remaining arguments (to ensure that -their arguments have non-zero size). The `bvAppend` operator takes two -natural numbers, corresponding to the lengths of its two bit vector -arguments, and returns a bit vector with length correponding to the -sum of the lengths of its arguments. - -The complete collection of bit vector operations appears in the -Reference section at the end of this document. diff --git a/doc/development/sawcore-external-format/custom-data-types.md b/doc/development/sawcore-external-format/custom-data-types.md deleted file mode 100644 index d9a87d2d9f..0000000000 --- a/doc/development/sawcore-external-format/custom-data-types.md +++ /dev/null @@ -1,39 +0,0 @@ -# Custom Data Types - -Several built-in data types, such as records and tuples, have -dedicated syntax within the language. Other data types, however, -including vectors and booleans, are defined as a set of type -constructors and data constructors. - -Type constructors, including `Vec` and `Bool`, take zero or more -arguments inline (i.e., they are not applied with the `App` form), and -create a node corresponding to a data type. The `Bool` type -constructor takes no arguments, while the `Vec` constructor takes two, -a natural number representing its size followed by the type index of -its elements. - -To create a value of a type specified by one of these type -constructors, apply one of the zero or more data constructors -associated with the type. Each data constructor may take zero or more -arguments. - -Boolean values (corresponding to type constructor `Bool`) can be -constructed with the two data constructors `True` and `False`, both of -which take zero arguments. - -Values of vector type can be constructed in two ways. The built-in form -`Array` takes a type index (corresponding to the element type) as its -first argument, followed by a sequence of element expression indices. - -Alternatively, vector values can be constructed piece-by-piece using -the two data constructors: - -- `EmptyVec` which takes a type as an argument and produces a vector - with zero elements of that type, and - -- `ConsVec` which takes a type, a value, a size, and an existing - vector of that given size, and produces a new vector of size one - larger, with the given element value at the beginning. - -Other type and data constructors exist in the SAWCore prelude, but -they rarely occur in terms exported for analysis by third-party tools. diff --git a/doc/development/sawcore-external-format/function-abstractions.md b/doc/development/sawcore-external-format/function-abstractions.md deleted file mode 100644 index 1bf1890101..0000000000 --- a/doc/development/sawcore-external-format/function-abstractions.md +++ /dev/null @@ -1,32 +0,0 @@ -# Function Abstractions - -SAWCore allows the creation of function abstractions. The construct -`Lam ` causes a function argument value of the given type -to be bound within the term specified by the second argument. -Functions with multiple arguments are constructed with multiple nested -`Lam` nodes. Within the term, an argument can be accessed by the -construct `Var ` where an index of `0` corresponds to the -variable bound by the most recent enclosing `Lam`, an index of `1` -corresponds to the variable bound by a `Lam` one level removed, and so -on. Function abstractions can allow code to be abstracted over -different arguments, and applied multiple times in multiple contexts. -They can also be used as an alternative to the `ExtCns` inputs -described previously. - -As an example, the code presented earlier in the Application section, -to add two 8-bit bit vector arguments, could be restructured to use -`Lam` and `Var` as follows: - -:::{code-block} text -1 Global Prelude.bitvector -2 Nat 8 -3 App 1 2 -4 Global Prelude.bvAdd -5 App 4 2 -6 Var 0 3 -7 Var 1 3 -8 App 5 6 -9 App 8 7 -10 Lam x 3 9 -11 Lam x 3 10 -::: diff --git a/doc/development/sawcore-external-format/index.md b/doc/development/sawcore-external-format/index.md deleted file mode 100644 index 1e45cec8cb..0000000000 --- a/doc/development/sawcore-external-format/index.md +++ /dev/null @@ -1,22 +0,0 @@ -# SAWCore External Format - -SAWCore is an intermediate representation for software/hardware semantics, used -internally to implement SAWScript `Term`s. - -This document describes a text-based representation of SAWCore. -This representation can be [read and written by -SAWScript](#loading-and-storing-terms). - -:::{toctree} -:maxdepth: 2 -:caption: Contents - -introduction -inputs-and-scalar-constants -applications -booleans-and-bit-vectors -arrays-tuples-and-records -function-abstractions -custom-data-types -reference -::: diff --git a/doc/development/sawcore-external-format/inputs-and-scalar-constants.md b/doc/development/sawcore-external-format/inputs-and-scalar-constants.md deleted file mode 100644 index 37152359ce..0000000000 --- a/doc/development/sawcore-external-format/inputs-and-scalar-constants.md +++ /dev/null @@ -1,20 +0,0 @@ -# Inputs and Scalar Constants - -The simplest terms in `extcore` refer to external inputs and constant -values. Two types of external inputs exist. - -The `ExtCns` keyword indicates an input identified by index, with a -declared type, and a name that exists primarily as a comment. Inputs -of this type are most appropriate when thinking of the term as a -representation of a circuit. - -The `Global` keyword indicates a global term identified by name. This -keyword is primarily used to refer to built-in operators, such as -prelude functions that operate on bit vectors. - -Constants can be written with one of the keywords `Nat`, `Float`, -`Double`, or `String`, followed by the value of the constant. Bit -vector constants can be created by applying the function described in -the "Bit Vectors" section that converts a natural number to a bit -vector. Later sections describe how to write aggregated or structured -constants. diff --git a/doc/development/sawcore-external-format/introduction.md b/doc/development/sawcore-external-format/introduction.md deleted file mode 100644 index 7bbbcb154a..0000000000 --- a/doc/development/sawcore-external-format/introduction.md +++ /dev/null @@ -1,79 +0,0 @@ -# Introduction - -Consider the following example SAWScript program: - -:::{code-block} sawscript -main = do { - let excluded_middle x = x || not x; - print_term excluded_middle; - write_core "excluded_middle.extcore" excluded_middle; -}; -::: - -The `print_term` command pretty prints the representation of -`excluded_middle` as a term in the core language. - -:::{code-block} text -\(x::Prelude.Bool) -> Prelude.or x (Prelude.not x) -::: - -The `write_core` command outputs a file in a more easily -computer-readable `extcore` format. (The format can then be read in by -the `read_core` command.) - -:::{code-block} text -SAWCoreTerm 8 -1 Data Prelude.Bool -2 Global Prelude.or -3 Var 0 -4 App 2 3 -5 Global Prelude.not -6 App 5 3 -7 App 4 6 -8 Lam x 1 7 -::: - -An `extcore` file encodes a single term of the core language by -assigning a numeric index to each of its unique subterms. - -Each line in an `extcore` file consists of a sequence of tokens -separated by whitespace. The tokens may be names (alphanumeric -identifiers, possibly including dot-separated qualifiers), numeric -indexes, or literals. The first line is a header containing the magic -string `SAWCoreTerm` followed by the index of the final term (i.e., -the output term). - -Each subsequent line defines a new term, following a standard format: -First is the new index to be defined, then a keyword indicating what -kind of term, and finally a sequence of tokens (the number and type of -which determined by the keyword). Each line can refer to any -previously defined index. - -In the following table, angle brackets enclose descriptions of each -argument. Parentheses and asterisks are used to describe patterns of -valid arguments, and will not show up in files. - -| Form | Description | -| ------------------------------------------------------- | ------------------------------------| -| `ExtCns ` | External input | -| `Lam ` | Function abstraction | -| `Pi ` | Function type | -| `Var ` | Bound variable (de Bruijn indexed) | -| `Global ` | Toplevel constant | -| `App ` | Function application | -| `Tuple *` | Tuple value | -| `TupleT *` | Tuple type | -| `TupleSel ` | Tuple component selector (`x.1`) | -| `Record ( )*` | Record value | -| `RecordT ( )*` | Record type | -| `RecordSel ` | Record component selector (`x.foo`) | -| `Ctor *` | Data constructor value | -| `Data *` | Datatype | -| `Sort ` | Sort | -| `Nat ` | Non-negative integer literal | -| `Array *` | Array value (e.g. `[1, 2, 3]`) | -| `Float ` | Literal of type `Float` | -| `Double ` | Literal of type `Double` | -| `String ` | Literal of type `String` | - -The following sections describe each of these keywords in more detail. diff --git a/doc/development/sawcore-external-format/reference.md b/doc/development/sawcore-external-format/reference.md deleted file mode 100644 index ff57f0b5ce..0000000000 --- a/doc/development/sawcore-external-format/reference.md +++ /dev/null @@ -1,50 +0,0 @@ -# Reference - -This section summarizes the built-in types, boolean functions, and bit -vector functions defined in the SAWCore prelude. These types and -functions will apppear in `extcore` files in the form -`Prelude.`, but are listed below in the form ``, without -the `Prelude` prefix, for brevity and readability. - -## Prelude types - -| Name | Kind | Comments | -| ----------- | --------------------- | ----------------------------- | -| `Bool` | `Type` | | -| `Nat` | `Type` | | -| `bitvector` | `Nat -> Type` | Abbreviation for `Vec n Bool` | -| `Vec` | `Nat -> Type -> Type` | | -| `String` | `Type` | | - -## Prelude boolean functions - -| Name | Type | -| -------- | --------------------------------- | -| `and` | `Bool -> Bool -> Bool` | -| `or` | `Bool -> Bool -> Bool` | -| `xor` | `Bool -> Bool -> Bool` | -| `boolEq` | `Bool -> Bool -> Bool` | -| `not` | `Bool -> Bool` | -| `ite` | `(a:Type) -> Bool -> a -> a -> a` | - -## Prelude bit vector functions - -| Name | Type | -| --------- | ------------------------------------------------------------------------ | -| `msb` | `(n:Nat) -> bitvector (n + 1) -> Bool` | -| `bvNat` | `(n:Nat) -> Nat -> bitvector n` | -| `bvToNat` | `(n:Nat) -> bitvector n -> Nat` | -| `bvAdd` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | -| `bvSub` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | -| `bvMul` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | -| `bvUDiv` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | -| `bvURem` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | -| `bvSDiv` | `(n:Nat) -> bitvector (n + 1) -> bitvector (n + 1) -> bitvector (n + 1)` | -| `bvSRem` | `(n:Nat) -> bitvector (n + 1) -> bitvector (n + 1) -> bitvector (n + 1)` | -| `bvAnd` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | -| `bvOr` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | -| `bvXor` | `(n:Nat) -> bitvector n -> bitvector n -> bitvector n` | -| `bvNot` | `(n:Nat) -> bitvector n -> bitvector n` | -| `bvShl` | `(n:Nat) -> bitvector n -> Nat -> bitvector n` | -| `bvShr` | `(n:Nat) -> bitvector n -> Nat -> bitvector n` | -| `bvSShr` | `(n:Nat) -> bitvector (n + 1) -> bitvector n -> bitvector (n + 1)` | From 53a5dda93ed7b02c4fb90610e953c5cf20419c0e Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 16:58:16 -0800 Subject: [PATCH 50/67] Hide SAW developer documentation. As originally planned, this commit hides the development/ directory from the Sphinx build, and removes all links to it from the document tree. See https://github.com/GaloisInc/saw-script/pull/2202#discussion_r1933024199 for relevant conversation on the matter of publishing developer documentation. TL;DR: For now, there is nothing we want to publish (extcore is not something intended for broader use than loading/storing SAW Terms, the release process is only relevant to developers, and the limitations document is old / needs review before being added to user-facing documentation, at which time it would likely be best added to the manual instead of as a separate resource). --- doc/conf.py | 1 + doc/development/index.md | 31 ------------------------------- doc/index.md | 7 ------- 3 files changed, 1 insertion(+), 38 deletions(-) delete mode 100644 doc/development/index.md diff --git a/doc/conf.py b/doc/conf.py index d79a1e51ad..702a9ac3f1 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -38,6 +38,7 @@ "Thumbs.db", ".DS_Store", ".venv", + "development", "**/code", "README.md", ] diff --git a/doc/development/index.md b/doc/development/index.md deleted file mode 100644 index 00085384bd..0000000000 --- a/doc/development/index.md +++ /dev/null @@ -1,31 +0,0 @@ -# SAW Developer Documentation - -These resources are mainly intended for developers working on the internals of -[SAWScript](https://github.com/GaloisInc/saw-script). - -Currently, we document: - -- The [SAWCore external format, `extcore`](extcore), which - is a text-based serialization of the low-level representation of SAWScript - `Term`s. - - :::{warning} - This document has not been updated for many years, and may be incomplete or - inaccurate to the version of SAW for which this documentation was built. - ::: -- The fact that SAW has some [limitations](limitations). - - :::{warning} - This document has not been updated for many years, and may be incomplete or - inaccurate to the version of SAW for which this documentation was built. - ::: -- The `saw-script` [release process](releasing), such that any developer with - merge-to-default access can easily create and reproduce SAW releases. - -:::{toctree} -:hidden: - -extcore -limitations -releasing -::: diff --git a/doc/index.md b/doc/index.md index 2d648e94be..e053cba0db 100644 --- a/doc/index.md +++ b/doc/index.md @@ -20,12 +20,6 @@ If you are looking for SAW/SAWScript reference materials: reading or writing SAWScript, it is worth searching the manual to see if it is covered there. -If you are a SAW developer: - -- [**SAW Developer Documentation**](development/index) is the home of a few - resources related to the development/maintenance of SAW, such as an overview - of the SAWCore external format and our release process. - If you encounter any bugs, please [open an issue](https://github.com/GaloisInc/saw-script/issues) following the [contributing @@ -37,5 +31,4 @@ guidelines](https://github.com/GaloisInc/saw-script/blob/master/CONTRIBUTING.md# llvm-java-verification-with-saw/index rust-verification-with-saw/index saw-user-manual/index -development/index ::: From af6132daf7cedc89700f5fe9ea0a1e2cf97c7b36 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 17:06:48 -0800 Subject: [PATCH 51/67] Rename doc/development -> doc/developer. And, in the doc/README, move the description of the directory to a more appropriate section of the file. --- doc/README.md | 18 +++++++++--------- doc/conf.py | 2 +- doc/{development => developer}/extcore.md | 0 doc/{development => developer}/limitations.md | 0 doc/{development => developer}/releasing.md | 0 5 files changed, 10 insertions(+), 10 deletions(-) rename doc/{development => developer}/extcore.md (100%) rename doc/{development => developer}/limitations.md (100%) rename doc/{development => developer}/releasing.md (100%) diff --git a/doc/README.md b/doc/README.md index 721f014fd1..64fb56dea3 100644 --- a/doc/README.md +++ b/doc/README.md @@ -101,6 +101,14 @@ This directory is the intended source root for all SAW documentation. - The `bibliography/` directory contains BibTeX (and possibly other) bibliographies. +- The `developer/` directory is an assortment of documentation mostly relevant + to developers of `saw-script`, including: + + - Documentation of the SAWCore `extcore` format + - Limitations of SAW and its use + - The `saw-script` release process + + - The `figures/` directory is used to store image files / similar resources used throughout SAW documentation. @@ -124,14 +132,6 @@ currently managed as part of this documentation ecosystem: - `saw-user-manual/` "SAW User Manual" The only 'complete' SAW reference right now -- `development/` - An assortment of documentation mostly relevant to developers of `saw-script`, - including:: - - - Documentation of the SAWCore `extcore` format - - Limitations of SAW and its use - - The `saw-script` release process - - A mirror of [the repository changelog](../CHANGES.md) ### Non-contents @@ -178,7 +178,7 @@ That said, to add new documentation material: Note that your documentation doesn't necessarily _need_ its own directory; if it's a single page, consider adding it as a single `.md` file to the most appropriate directory, and adding an entry to the corresponding `toctree` (for -some examples of this, see `doc/development/`). +some examples of this, see `doc/developer/`). #### Code examples diff --git a/doc/conf.py b/doc/conf.py index 702a9ac3f1..2e77f0338f 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -38,7 +38,7 @@ "Thumbs.db", ".DS_Store", ".venv", - "development", + "developer", "**/code", "README.md", ] diff --git a/doc/development/extcore.md b/doc/developer/extcore.md similarity index 100% rename from doc/development/extcore.md rename to doc/developer/extcore.md diff --git a/doc/development/limitations.md b/doc/developer/limitations.md similarity index 100% rename from doc/development/limitations.md rename to doc/developer/limitations.md diff --git a/doc/development/releasing.md b/doc/developer/releasing.md similarity index 100% rename from doc/development/releasing.md rename to doc/developer/releasing.md From d3a27d12707068f2a6185f7416416929b2b71b0f Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 17:50:45 -0800 Subject: [PATCH 52/67] doc/setup_env: Use requirements.txt in the script's directory. And, notably, we don't need bash, so use /bin/sh instead. This allows the script to be run from anywhere, as long as the requirements.txt file stays adjacent to it in the filesystem. This is documented in doc/README. --- doc/README.md | 3 +++ doc/setup_env.sh | 10 ++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/doc/README.md b/doc/README.md index 64fb56dea3..06af2cbc25 100644 --- a/doc/README.md +++ b/doc/README.md @@ -58,6 +58,9 @@ There is another script, `setup_env.sh`, that specifically handles the creation and validation of a suitable Python environment without building the documentation / code examples. +This uses the sibling `requirements.txt` file, and can be run anywhere you would +like to create a SAW-documentation-building Python environment. + You can run this separately from `make_docs.sh` if you'd like. ### Troubleshooting diff --git a/doc/setup_env.sh b/doc/setup_env.sh index 3dec68ca51..89bfa94808 100755 --- a/doc/setup_env.sh +++ b/doc/setup_env.sh @@ -1,8 +1,10 @@ -#!/bin/bash +#!/bin/sh # Set up a new or existing .venv directory as a Python virtual environment # suitable for building SAW documentation, particularly with make_docs.sh. +REQUIREMENTS="$(dirname $0)/requirements.txt" + echo "Checking for python3..." if ! [ -x "$(command -v python3)" ]; then @@ -24,11 +26,11 @@ then # We want to check _the virtual environment's_ pip list, so activate here. . .venv/bin/activate - if pip freeze -r requirements.txt 2>&1 | grep -q "not installed" + if pip freeze -r "${REQUIREMENTS}" 2>&1 | grep -q "not installed" then echo -e "\033[1;33mWARNING:\033[0m 'requirements.txt' not satisfied." echo "Installing dependencies..." - pip install -qr requirements.txt + pip install -qr "${REQUIREMENTS}" fi echo -e "\033[1;32mEnvironment updated successfully!\033[0m" @@ -42,6 +44,6 @@ python3 -m venv .venv . .venv/bin/activate echo "Installing dependencies..." -pip install -qr requirements.txt +pip install -qr "${REQUIREMENTS}" echo -e "\033[1;32mEnvironment created successfully!\033[0m" From d0ac1950ce7174d8f99343a3b8c19dd2904de6ca Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 18:04:00 -0800 Subject: [PATCH 53/67] Create a scripts directory. And move setup_env.sh, make_docs.sh, and requirements.txt, which cleans up the doc/ root significantly. Includes updated documentation of the file structure in doc/README. --- doc/README.md | 47 ++++++++++++++++-------------- doc/{ => scripts}/make_docs.sh | 0 doc/{ => scripts}/requirements.txt | 0 doc/{ => scripts}/setup_env.sh | 0 4 files changed, 25 insertions(+), 22 deletions(-) rename doc/{ => scripts}/make_docs.sh (100%) rename doc/{ => scripts}/requirements.txt (100%) rename doc/{ => scripts}/setup_env.sh (100%) diff --git a/doc/README.md b/doc/README.md index 06af2cbc25..55d8135d46 100644 --- a/doc/README.md +++ b/doc/README.md @@ -28,17 +28,17 @@ If you want to generate the PDFs that can be found in `doc/pdfs`, you'll also need `xelatex`. This will require a suitable TeX distribution. -### `make_docs.sh` +### `scripts/make_docs.sh` -`doc/make_docs.sh` is a bash script wrapping up all of the Python environment -and Sphinx build management, via [a separately-runnable script we +`scripts/make_docs.sh` is a bash script wrapping up all of the Python +environment and Sphinx build management, via [a separately-runnable script we provide](#the-python-environment). Using this, you'll almost never need to think about anything related to the Python behind the curtain, as long as you have a Python >=3.9 installation. ```console -$ ./make_docs.sh -Usage: ./make_docs.sh +$ scripts/make_docs.sh +Usage: scripts/make_docs.sh ``` Running the script with a documentation format does exactly what you expect: @@ -52,23 +52,23 @@ if necessary. The `clean` target wipes out the Sphinx outputs, as well as any code example archives that were generated. -#### `setup_env.sh` +#### `scripts/setup_env.sh` -There is another script, `setup_env.sh`, that specifically handles the creation -and validation of a suitable Python environment without building the +There is another script, `scripts/setup_env.sh`, that specifically handles the +creation and validation of a suitable Python environment without building the documentation / code examples. -This uses the sibling `requirements.txt` file, and can be run anywhere you would -like to create a SAW-documentation-building Python environment. +This uses the sibling `scripts/requirements.txt` file, and can be run anywhere +you would like to create a SAW-documentation-building Python environment. -You can run this separately from `make_docs.sh` if you'd like. +You can run this separately from `scripts/make_docs.sh` if you'd like. ### Troubleshooting 1. If the build succeeds, but you aren't seeing all of the expected changes: - Try running `./make_docs.sh clean` before rebuilding; Sphinx may have failed - to detect the changes you made, and you're seeing stale/cached output. + Try running `scripts/make_docs.sh clean` before rebuilding; Sphinx may have + failed to detect the changes you made, and you're seeing stale/cached output. 2. If you have unresolved reference warnings: Sphinx has an incredibly robust cross-reference system, but it is easy to @@ -78,7 +78,8 @@ You can run this separately from `make_docs.sh` if you'd like. 3. If the build fails: Try removing the `.venv/` directory, forcing a fresh Python environment to be - created the next time you run `./make_docs.sh ...` or `./setup_env.sh`. + created the next time you run `scripts/make_docs.sh ...` or + `scripts/setup_env.sh`. If you still have trouble, you've likely uncovered a bug in the system. Please [open an issue](https://github.com/GaloisInc/saw-script/issues) detailing @@ -95,9 +96,6 @@ This directory is the intended source root for all SAW documentation. gets when starting a new Sphinx project, the latter has been heavily customized for SAW's needs. -- `requirements.txt` captures a working set of Python dependencies in an attempt - to make documentation builds more reproducible. - - `index.md` defines the top-level document hierarchy, and is the intended home page of . @@ -119,6 +117,10 @@ This directory is the intended source root for all SAW documentation. This may eventually be removed in favor of generating and distrubiting PDFs as part of CI. +- The `scripts/` directory is where scripts relevant to building the + documentation are located. + This includes a `requirements.txt` pinning dependencies for the Sphinx build. + - `saw-lexer` is a small Python package implementing a SAWScript `pygments` lexer, so our documentation understands and properly renders fenced code blocks labeled ```````sawscript````. @@ -188,8 +190,8 @@ some examples of this, see `doc/developer/`). It is useful to provide code sample downloads when writing tutorial-style documentation materials, so readers can easily follow along. -When building with the `make_docs.sh` helper script, `doc/` is set up to easily -allow code samples to be added anywhere they are needed. +When building with the `scripts/make_docs.sh` helper script, `doc/` is set up to +easily allow code samples to be added anywhere they are needed. Note that this works best for materials that have their own dedicated directory: If you are adding a document to a directory already containing code samples, @@ -213,7 +215,7 @@ To add code samples to your own material: ``` **Important!** This convenience is **not** a built-in Sphinx feature, but a -feature provided by our higher-level `make_docs.sh` wrapper. +feature provided by our higher-level `scripts/make_docs.sh` wrapper. If you want to use Sphinx to build directly (e.g. with `make`), you will need to generate the `code.tar.gz` files yourself, which will _not_ be validated as 'true' archives of the sibling `code/` directories. @@ -280,7 +282,8 @@ example, heading levels. If you are hacking on the documentation build itself (e.g. configuring Sphinx, playing with new extensions, or even simply upgrading the pinned dependencies in -<./requirements.txt>), you can manually activate the Python virtual environment -with `.venv/bin/activate`, and deactivate it again with `deactivate`. +), you can manually activate the Python virtual +environment with `.venv/bin/activate`, and deactivate it again with +`deactivate`. This ought not be necessary for most work on documentation. diff --git a/doc/make_docs.sh b/doc/scripts/make_docs.sh similarity index 100% rename from doc/make_docs.sh rename to doc/scripts/make_docs.sh diff --git a/doc/requirements.txt b/doc/scripts/requirements.txt similarity index 100% rename from doc/requirements.txt rename to doc/scripts/requirements.txt diff --git a/doc/setup_env.sh b/doc/scripts/setup_env.sh similarity index 100% rename from doc/setup_env.sh rename to doc/scripts/setup_env.sh From ba3f555e39198c5078c3748e175788f08c464b50 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 20:24:38 -0800 Subject: [PATCH 54/67] Remove make_docs.sh. The use of `make` is ubiquitous to Sphinx builds, and it was rather inappropriate to introduce scripts that invoked it to build the documentation. --- doc/scripts/make_docs.sh | 55 ---------------------------------------- 1 file changed, 55 deletions(-) delete mode 100755 doc/scripts/make_docs.sh diff --git a/doc/scripts/make_docs.sh b/doc/scripts/make_docs.sh deleted file mode 100755 index 4715fe1ff2..0000000000 --- a/doc/scripts/make_docs.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -# Add sphinx-build targets to this pattern as appropriate. -SUPPORTED_DOCS="html|latexpdf" - -# Commands that do other work / exit before attempting doc generation. -AUX_COMMANDS="clean" - -COMMANDS="${SUPPORTED_DOCS}|${AUX_COMMANDS}" -if [[ "${#}" -ne 1 ]] || [[ ! "${1}" =~ ^(${COMMANDS})$ ]]; then - echo "Usage: ${0} <${COMMANDS}>" - exit 1 -fi - -# N.b. Other ${AUX_COMMANDS} should be handled similarly. -if [[ "${1}" == "clean" ]]; then - echo "Removing '_build'..." - rm -rf _build - echo "Removing packaged code examples ('**/code.tar.gz')..." - rm -rf **/code.tar.gz - exit -fi - -# Begin document generation -DOC_TYPE="${1}" - -bash setup_env.sh -. .venv/bin/activate - -# For any directories named 'code', create a corresponding code.tar.gz. -# This can be used to provide a download for the entire directory, which is -# useful for tutorials in particular. -for i in **/code; do - if ! [ -d "${i}" ]; - then - continue - fi - - if ! [ -e "${i}/../code.tar.gz" ]; - then - echo "Packaging probable code example (${i})..." - tar -czvf "${i}/../code.tar.gz" -C "${i}" . - fi -done - -echo "Generating ${DOC_TYPE}..." -make "${DOC_TYPE}" - -shopt -s extglob -if [[ "${DOC_TYPE}" == "latexpdf" ]]; then - echo "Copying PDFs to doc/pdfs..." - mkdir -p pdfs - cp -f _build/latex/!(galois).pdf pdfs -fi -shopt -u extglob From cf63994f405f85c86b2cb9783cd6b52af0ceffb2 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 23:14:01 -0800 Subject: [PATCH 55/67] doc/Makefile: Remove / replace Sphinx's default comments. --- doc/Makefile | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index d4bb2cbb9e..4ac9982e66 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,20 +1,15 @@ -# Minimal makefile for Sphinx documentation -# +# SAW Documentation Makefile +# This is derived from Sphinx's default Makefile -# You can set these variables from the command line, and also -# from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build -# Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) From e4d18537722dafcbf76a91c124e0a9151ac6fcf6 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 23:15:55 -0800 Subject: [PATCH 56/67] Add scripts/package_code.sh. This restores one functionality of the old make_docs.sh, namely the packaging of code example directories. --- doc/scripts/package_code.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 doc/scripts/package_code.sh diff --git a/doc/scripts/package_code.sh b/doc/scripts/package_code.sh new file mode 100755 index 0000000000..340636475e --- /dev/null +++ b/doc/scripts/package_code.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +for i in **/code; do + if ! [ -d "${i}" ]; + then + continue + fi + + if ! [ -e "${i}/../code.tar.gz" ]; + then + echo "Packaging probable code example (${i})..." + tar -czvf "${i}/../code.tar.gz" -C "${i}" . + fi +done From b5f8ef12e055762e7824151fd4afb7f015a4ae1a Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sat, 1 Feb 2025 23:53:46 -0800 Subject: [PATCH 57/67] Makefile: Re-implement the behaviors of the old make_docs.sh. Thank you to @sauclovian-g for suggesting this rearrangement - not only is it "more correct", it resulted in smaller, more reusable scripts and a more intuitive build process. That's great! First, we explicitly list SUPPORTED_DOCS (that is, the targets Sphinx's old Makefile understood that we wish to continue supporting). This allows us to (1) always show up-to-date help text documenting what someone can run to build the docs, (2) easily add additional format support, and (3) replace the old catch-all target with a more helpful suggestion given these changes. We replace Sphinx's help with a series of messages listing available targets, but still leave Sphinx's original help available (this is mostly for developers looking to add support for additional Sphinx targets) via target sphinx-help. Targets setup-env and package-code are methods of executing the scripts in scripts/. These are also the dependencies of the document-rendering targets, and anything related to running Sphinx. mostlyclean and clean respectively clean up the documentation build (including package code examples) and all of that plus the Python environment. install-pdf copies rendered PDFs from the Sphinx output directory to doc/pdfs, building them if necessary. --- doc/Makefile | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 4ac9982e66..a7a835603c 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -6,10 +6,43 @@ SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build +SUPPORTED_DOCS = html latex latexpdf linkcheck + help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + $(info SAW Documentation (based on Sphinx)) + $(info Setup Python environment: 'make setup-env') + $(info Package code samples: 'make package-code') + $(info Supported document formats: 'make' + one of: $(SUPPORTED_DOCS)) + $(info Install PDFs to repository: 'make install-pdf') + $(info Tidy code packages / docs: 'make mostlyclean') + $(info Tidy everything, including Python venv: 'make clean') + +sphinx-help: setup-env + @. .venv/bin/activate && $(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: setup-env package-code pdf install-pdf mostlyclean clean help $(SUPPORTED_DOCS) + +setup-env: + scripts/setup_env.sh + +package-code: + scripts/package_code.sh + +pdf: latexpdf + +install-pdf: latexpdf + mkdir -p pdfs + cp -f $$(ls _build/latex/*.pdf | sed '/\/galois\.pdf$$/d') pdfs + +mostlyclean: + rm -rf _build + rm -rf **/code.tar.gz + +clean: mostlyclean + rm -rf .venv -.PHONY: help Makefile +$(SUPPORTED_DOCS): package-code setup-env + @. .venv/bin/activate && $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) +%: + $(error "Target '$@' unknown; try 'make help'.") From 54c9c533e672f2f92157afc0ffdfc0bfba84b0d7 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 00:47:24 -0800 Subject: [PATCH 58/67] Generate PDFs in a (hopefully-reproducible) way. To eventually validate that the 'correct' PDFs have been checked in, this commit adds a mechanism to control the reproduction of SAW documentation PDFs: The SOURCE_DATE_EPOCH environment variable (see https://reproducible-builds.org/docs/source-date-epoch/). We set this in a .env file, and use if in the Makefile on documentation builds so the last edit time is consistent. For now, this value is set to (GMT) Tuesday, April 1, 2025 12:00:00 AM, but for releases should be set to an epoch timestamp corresponding to the date of release (for example). Release instructions for the repository have been updated to reflect the need to update this variable at release time (and correspondingly, the documentation PDFs themselves). --- doc/.env | 1 + doc/Makefile | 3 ++- doc/developer/releasing.md | 4 +++- doc/pdfs/llvm-java-verification-with-saw.pdf | Bin 98064 -> 97932 bytes doc/pdfs/rust-verification-with-saw.pdf | Bin 333368 -> 332000 bytes doc/pdfs/saw-user-manual.pdf | Bin 409848 -> 408815 bytes 6 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 doc/.env diff --git a/doc/.env b/doc/.env new file mode 100644 index 0000000000..9d8625fda5 --- /dev/null +++ b/doc/.env @@ -0,0 +1 @@ +SOURCE_DATE_EPOCH=1743465600 diff --git a/doc/Makefile b/doc/Makefile index a7a835603c..820c9719c8 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,5 +1,6 @@ # SAW Documentation Makefile # This is derived from Sphinx's default Makefile +include .env SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build @@ -42,7 +43,7 @@ clean: mostlyclean rm -rf .venv $(SUPPORTED_DOCS): package-code setup-env - @. .venv/bin/activate && $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + @SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} . .venv/bin/activate && $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) %: $(error "Target '$@' unknown; try 'make help'.") diff --git a/doc/developer/releasing.md b/doc/developer/releasing.md index 477ef4d783..70bde35c7f 100644 --- a/doc/developer/releasing.md +++ b/doc/developer/releasing.md @@ -24,7 +24,9 @@ The release process is: 1. Make sure the `release-n.n` branch is in a release/ready state, including: - successful build artifacts across all platforms, - - successful tests on all test suites, and + - successful tests on all test suites, + - an up-to-date [`SOURCE_DATE_EPOCH`](../.env) for documentation builds, + - up-to-date [documentation PDFs](../pdfs), and - an up-to-date [CHANGES.md](../../CHANGES.md) file. 2. Create a draft release on GitHub diff --git a/doc/pdfs/llvm-java-verification-with-saw.pdf b/doc/pdfs/llvm-java-verification-with-saw.pdf index 28f7d35e6ded419fa8cd09341a2a27ef4d4aa329..287e2284f10df39fe4b80781ef96a3dc53af270d 100644 GIT binary patch delta 40527 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 Y3Ujo`*bhda#^B}Q#b9Jq&{V|uAM-JohyVZp delta 40743 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 diff --git a/doc/pdfs/rust-verification-with-saw.pdf b/doc/pdfs/rust-verification-with-saw.pdf index 64acc7f55083a8ea6d5f350da2900f3db1404fbf..19ee8f9fa709701786712f50893be493279f4f36 100644 GIT binary patch delta 182464 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 c{)XJSyicqqbF{ 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

      KWIFO!pTspUH;h6J< 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ⅈiuVDdfAOQ(`CwQCP!wu_BD9lKI7?#yJ50)1 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�j9$Q!$dyW6L~%%AdqrpK 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�hON{4NvkbGC96{hSbGC^ACaSq*py5I`}c?&)r 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

      p#oORk+~yaH7%D2ST7LH1y|5eb70xx0js63 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ΞPSpHg9kr6id^GDWwPAcSLsLZSKvse^`a# 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≺VMei1igZ~`k&`c*}ZNu$_41g4+YPW?@iZ}M(_ zM!t^*gHv>0q1OrMthEr@J}y)*@tYU0g!*-~aMhM!%bVqyX~VLz@KQ%hc|Rk%oD64X z#IK&K_91o(tawmae?Xh*_N?Gu7D-1z4|5E)r^hY$<-ycud6W~wU^Bt)RL63@1Iu=( zo#Vyl_r<4X08^kd&ap#OkB`BVb-=Kl>=AG|u;*gOD1~Q^m>d~O(>U^dIN>>uH%nO? z7+`+TY~Swu%Q8fUtt^(C{|o&gIn$XY4ODDqPES?W@}1#elXX)??5P@eW0 l5C&q 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 Date: Sun, 2 Feb 2025 00:48:47 -0800 Subject: [PATCH 59/67] doc/README: Update to reflect recent changes. In particular: - Explicitly note that `make` is required to build documentation - Replace the description of `make_docs.sh` with a description of the `Makefile` and its targets, as well as the `scripts/` directory and contents - Update troubleshooting recommendations to match - Update descriptions of the `doc/` directory contents: - In particular, remove note about removing PDFs from the repository. This was discussed out-of-band, and we aligned on leaving the PDFs around for developer benefit while browsing the repository - Remove the no-longer-necessary disclaimer about packaging code --- doc/README.md | 111 ++++++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 57 deletions(-) diff --git a/doc/README.md b/doc/README.md index 55d8135d46..52970722e7 100644 --- a/doc/README.md +++ b/doc/README.md @@ -19,7 +19,7 @@ interested in modifying the documentation _content_. The only _strict_ requirement to build the documentation locally is a relatively recent Python (>=3.9, to be safe - we aren't prioritizing making this work on -every Python under the sun). +every Python under the sun), and `make`. This is enough to generate the HTML versions of documentation, which is what is deployed to . @@ -28,58 +28,65 @@ If you want to generate the PDFs that can be found in `doc/pdfs`, you'll also need `xelatex`. This will require a suitable TeX distribution. -### `scripts/make_docs.sh` - -`scripts/make_docs.sh` is a bash script wrapping up all of the Python -environment and Sphinx build management, via [a separately-runnable script we -provide](#the-python-environment). -Using this, you'll almost never need to think about anything related to the -Python behind the curtain, as long as you have a Python >=3.9 installation. - -```console -$ scripts/make_docs.sh -Usage: scripts/make_docs.sh -``` - -Running the script with a documentation format does exactly what you expect: -A suitable Python environment is created, any probable code examples are -packaged (see [below](#code-examples)), and the actual Sphinx build is run. - -For the `latexpdf` target, in addition to the above, the -[generated PDFs](#pdf-generation) are copied to `pdfs/` so they can be committed -if necessary. - -The `clean` target wipes out the Sphinx outputs, as well as any code example -archives that were generated. - -#### `scripts/setup_env.sh` - -There is another script, `scripts/setup_env.sh`, that specifically handles the -creation and validation of a suitable Python environment without building the -documentation / code examples. - -This uses the sibling `scripts/requirements.txt` file, and can be run anywhere -you would like to create a SAW-documentation-building Python environment. - -You can run this separately from `scripts/make_docs.sh` if you'd like. +### `Makefile` + +As is typical for Sphinx projects, SAW's documentation is built using `make`. + +Our `Makefile` is a tailored version of that which is generated when starting a +new Sphinx project, in particular restricting the document formats that can be +targeted, and handling the setup of an appropriate Python environment in which +to run the Sphinx build. + +Typing `make help` is the easiest way to get started. +The following targets are available: + +- `help`: Display all of the most useful targets +- `sphinx-help`: Display Sphinx's built-in help (**NOTE:** Most of these targets + are purposefully made unavailable and won't do anything!) +- `setup-env`: Create a Python venv (in `doc/.venv/`) suitable for building the + documentation. + This tries not to do unnecessary work: If you already have a `doc/.venv/`, it + will simply install the dependencies the build requires. +- `package-code`: Create tar.gz archives of all `doc/**/code/` directories. + This can be used to provide downloads in the HTML rendering of the + documentation (see [below](#code-examples)). +- `install-pdf`: Build and install PDF renderings to `doc/pdfs/`. +- `mostlyclean`: Clear out all packaged code and Sphinx-generated files. +- `clean`: All of the above, plus the Python environment. + +`make help` always shows the most up-to-date list of supported document targets. + +#### `scripts/` + +This directory contains utility scripts (and the documentation's +`requirements.txt`) used to implement the `make` targets above. + +- `scripts/setup_env.sh` creates and validates a suitable Python environment, + independent of the documentation build. + It uses the sibling `requirements.txt` file, and can be run anywhere you want + to create a `.venv/` suitable for building SAW documentation (though in most + cases, you'll just be running `make setup-env` in `doc/`). +- `scripts/package_code.sh` finds all directories named `code` in the file tree, + and if there is no sibling `code.tar.gz`, creates it. + This is the implementation of `make package-code`, but like + `scripts/setup_env.sh` can be run anywhere. ### Troubleshooting 1. If the build succeeds, but you aren't seeing all of the expected changes: - Try running `scripts/make_docs.sh clean` before rebuilding; Sphinx may have - failed to detect the changes you made, and you're seeing stale/cached output. + Try running `make mostlyclean` before rebuilding; Sphinx may have failed to + detect the changes you made, and you're seeing stale/cached output. 2. If you have unresolved reference warnings: - Sphinx has an incredibly robust cross-reference system, but it is easy to - get "wrong". + Sphinx has an incredibly robust cross-reference system, but it is easy to get + "wrong". If using Markdown/MyST, make sure you are using references according to [this documentation](https://myst-parser.readthedocs.io/en/latest/syntax/cross-referencing.html). 3. If the build fails: - Try removing the `.venv/` directory, forcing a fresh Python environment to be - created the next time you run `scripts/make_docs.sh ...` or - `scripts/setup_env.sh`. + Try a full `make clean` to wipe out the `.venv/` directory and start again in + a fresh environment. If you still have trouble, you've likely uncovered a bug in the system. Please [open an issue](https://github.com/GaloisInc/saw-script/issues) detailing @@ -92,9 +99,9 @@ This directory is the intended source root for all SAW documentation. ### Contents -- The `Makefile` and `conf.py` come from Sphinx; the former is the default one - gets when starting a new Sphinx project, the latter has been heavily - customized for SAW's needs. +- The `Makefile` is explained in more detail [above](#makefile). +- `conf.py` is our Sphinx configuration, which has been heavily customized from + the default Sphinx provides. - `index.md` defines the top-level document hierarchy, and is the intended home page of . @@ -114,8 +121,6 @@ This directory is the intended source root for all SAW documentation. throughout SAW documentation. - The `pdfs/` directory is where committed versions of PDF renderings live. - This may eventually be removed in favor of generating and distrubiting PDFs as - part of CI. - The `scripts/` directory is where scripts relevant to building the documentation are located. @@ -190,8 +195,8 @@ some examples of this, see `doc/developer/`). It is useful to provide code sample downloads when writing tutorial-style documentation materials, so readers can easily follow along. -When building with the `scripts/make_docs.sh` helper script, `doc/` is set up to -easily allow code samples to be added anywhere they are needed. +When building with `make`, `doc/` is set up to easily allow code samples to be +added anywhere they are needed. Note that this works best for materials that have their own dedicated directory: If you are adding a document to a directory already containing code samples, @@ -214,14 +219,6 @@ To add code samples to your own material: Download sample files: ``` -**Important!** This convenience is **not** a built-in Sphinx feature, but a -feature provided by our higher-level `scripts/make_docs.sh` wrapper. -If you want to use Sphinx to build directly (e.g. with `make`), you will need -to generate the `code.tar.gz` files yourself, which will _not_ be validated as -'true' archives of the sibling `code/` directories. -For this reason, we strongly recommend that you _always_ build SAW documentation -using the helper scripts. - #### PDF generation Some resources should be turned into PDFs stored in `doc/pdfs`. From 0ea2d4e1d5c2744a8550dc2510f3959b56e08f0b Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 15:34:25 -0800 Subject: [PATCH 60/67] Makefile: Use make's $(shell) function. This reduces the 'escaped' dollar signs and produces more sensible output (i.e. the output shows the result of expansion). --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index 820c9719c8..f6b9b32822 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -33,7 +33,7 @@ pdf: latexpdf install-pdf: latexpdf mkdir -p pdfs - cp -f $$(ls _build/latex/*.pdf | sed '/\/galois\.pdf$$/d') pdfs + cp -f $(shell ls _build/latex/*.pdf | sed '/\/galois\.pdf$$/d') pdfs mostlyclean: rm -rf _build From fcb3ce57a8847a0415100f3b2c4df86342d15b42 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 16:33:39 -0800 Subject: [PATCH 61/67] sphinx-download-dir: Sphinx role to download directories. This Python package implements a new Sphinx role, download-dir, that can be used to indicate that a referenced directory should be archived and made downloadable. For example: If we write {download-dir}`/my/cool/dir`, the role attempts to create `$SOURCEDIR/my/cool/dir.tar.gz` from the contents of `$SOURCEDIR/my/cool/dir`, where $SOURCEDIR is the Sphinx project root (for us, `saw-script/doc/`). In short, this means that you can only create downloads out of directories somewhere under in `doc/`, including `doc/` itself. As is Sphinx's convention, then, paths starting with `/` indicate that the path is rooted at $SOURCEDIR, and relative paths are relative to the document where the role was used. The role also supports {download-dir}`links with explicit titles `; when no title is provided, the link will be the name of the archive (i.e. the stem of the target directory + ".tar.gz"). This is an improvement over our current solution, which is inflexible (requiring that only specific directories be used as download targets) and doesn't fully utilize Sphinx's/docutils's extensible role framework (instead using scripts). --- doc/sphinx-download-dir/pyproject.toml | 10 ++++ .../sphinx_download_dir.py | 55 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 doc/sphinx-download-dir/pyproject.toml create mode 100644 doc/sphinx-download-dir/sphinx_download_dir.py diff --git a/doc/sphinx-download-dir/pyproject.toml b/doc/sphinx-download-dir/pyproject.toml new file mode 100644 index 0000000000..5f3591ad76 --- /dev/null +++ b/doc/sphinx-download-dir/pyproject.toml @@ -0,0 +1,10 @@ +[build-system] +requires = [ + "setuptools", +] +build-backend = "setuptools.build_meta" + +[project] +name = "sphinx-download-dir" +version = "0.0.1" +dependencies = ["sphinx"] diff --git a/doc/sphinx-download-dir/sphinx_download_dir.py b/doc/sphinx-download-dir/sphinx_download_dir.py new file mode 100644 index 0000000000..9cd55b9588 --- /dev/null +++ b/doc/sphinx-download-dir/sphinx_download_dir.py @@ -0,0 +1,55 @@ +from pathlib import Path +import tarfile + +from docutils import nodes + +from sphinx.addnodes import download_reference +from sphinx.application import Sphinx + +from sphinx.util.docutils import ReferenceRole +from sphinx.util.typing import ExtensionMetadata + + +class DownloadDirRole(ReferenceRole): + """Role providing directory downloads. + + Injects a suitable download reference after making a tar.gz archive of the + directory. + """ + + def run(self) -> tuple[list[nodes.Node], list[nodes.system_message]]: + dir_to_download = Path(self.env.relfn2path(self.target)[1]) + + if not dir_to_download.is_dir(): + msg = self.inliner.reporter.error( + f"download-dir expects a source directory path, but {self.target} does not resolve to a directory -- Skipping." + ) + return [], [msg] + + out_tar = dir_to_download.with_suffix(".tar.gz") + self.env.note_dependency(str(out_tar)) + + with tarfile.open(out_tar, "w:gz") as ot: + for child in dir_to_download.iterdir(): + ot.add(child) + + download_node = download_reference( + reftarget=f"/{out_tar.relative_to(self.env.srcdir)}", + ) + download_node.append( + nodes.literal( + text=self.title if self.has_explicit_title else out_tar.name, + classes=["download"], + ) + ) + + return [download_node], [] + + +def setup(app: Sphinx) -> ExtensionMetadata: + app.add_role("download-dir", DownloadDirRole()) + + return { + "version": "0.0.1", + "parallel_read_safe": True, + } From 7c614fa44d9ddfe5ad6788c78365b309f9d4c9f2 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 16:46:15 -0800 Subject: [PATCH 62/67] scripts/requirements: Add sphinx-download-dir. And, remove a spurious comment. This makes sphinx-download-dir available in the build environment created by scripts/setup_env.sh. --- doc/scripts/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/scripts/requirements.txt b/doc/scripts/requirements.txt index 58931f0b7b..1845bd3689 100644 --- a/doc/scripts/requirements.txt +++ b/doc/scripts/requirements.txt @@ -31,5 +31,5 @@ sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 urllib3==2.3.0 -# Until we get SAWScriptLexer added to pygments -e ./saw-lexer +-e ./sphinx-download-dir From bb99e831c83ec6f76db034ca5334633dc9a463f2 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 16:52:43 -0800 Subject: [PATCH 63/67] .gitignore: Going forward, ignore all tar.gz archives in doc/. This will keep workspaces clean when building locally, and encourages handling the archiving process via sphinx-download-dir. There is currently one exception in the Rust tutorial sample code, where a tar.gz of a large JSON file is provided. Of course, one can use git add -f to commit additional archives as necessary. --- doc/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/.gitignore b/doc/.gitignore index 60c8dfeb07..6c95d53874 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -2,4 +2,4 @@ __pycache__ *.egg-info _build -code.tar.gz +*.tar.gz From 0b9f94f8801631da142546d165bfd4f48a3f762e Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 17:10:38 -0800 Subject: [PATCH 64/67] Use sphinx-download-dir in the documentation. This replaces uses of MyST's link format used to generate download links to individual files with uses of the role introduced by the sphinx-download-dir package. --- doc/conf.py | 1 + doc/llvm-java-verification-with-saw/index.md | 2 +- doc/rust-verification-with-saw/index.md | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 2e77f0338f..88ede864fd 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -8,6 +8,7 @@ extensions = [ "sphinx_copybutton", + "sphinx_download_dir", "hoverxref.extension", "notfound.extension", "myst_parser", diff --git a/doc/llvm-java-verification-with-saw/index.md b/doc/llvm-java-verification-with-saw/index.md index 475d95b6a9..d0b6f0909f 100644 --- a/doc/llvm-java-verification-with-saw/index.md +++ b/doc/llvm-java-verification-with-saw/index.md @@ -9,7 +9,7 @@ After completing this tutorial, you will be able to: - Write proofs in SAW _compositionally_ - Use the SAW REPL to interactively run proofs -You can download the tutorial files: +You can download {download-dir}`the tutorial files `. ```{toctree} :maxdepth: 2 diff --git a/doc/rust-verification-with-saw/index.md b/doc/rust-verification-with-saw/index.md index 596dc4bfdf..7c6e62c845 100644 --- a/doc/rust-verification-with-saw/index.md +++ b/doc/rust-verification-with-saw/index.md @@ -14,7 +14,7 @@ Additionally, you will step through the process of verifying an implementation of the Salsa20 stream cipher against a Cryptol reference specification, showing how SAW's MIR capabilities may be used on a more realistic codebase. -You can download the tutorial files: +You can download {download-dir}`the tutorial files `. ```{toctree} :maxdepth: 2 From 61af74ab6a9b6c07c37759bf759e508e69f8dff0 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 17:24:53 -0800 Subject: [PATCH 65/67] Remove scripts/package_code.sh (and Makefile uses of the same). Given that we now use sphinx-download-dir (which handles the archiving of code samples during the Sphinx build), we have no need for the packaging script / make target. Furthermore, we make the mostlyclean target interactive in its deletion of tar.gz archives, to prevent unintentionally deleting a checked-in archive that is part of a sample directory (the Rust tutorial is a case like this). This is mostly necessary since we no longer force the sample directory / archive to have a specific name, and simply attempt to clean up _all_ tar.gz archives in and under `doc/`. --- doc/Makefile | 10 +++------- doc/scripts/package_code.sh | 14 -------------- 2 files changed, 3 insertions(+), 21 deletions(-) delete mode 100755 doc/scripts/package_code.sh diff --git a/doc/Makefile b/doc/Makefile index f6b9b32822..8df7621ccd 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -12,7 +12,6 @@ SUPPORTED_DOCS = html latex latexpdf linkcheck help: $(info SAW Documentation (based on Sphinx)) $(info Setup Python environment: 'make setup-env') - $(info Package code samples: 'make package-code') $(info Supported document formats: 'make' + one of: $(SUPPORTED_DOCS)) $(info Install PDFs to repository: 'make install-pdf') $(info Tidy code packages / docs: 'make mostlyclean') @@ -21,14 +20,11 @@ help: sphinx-help: setup-env @. .venv/bin/activate && $(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -.PHONY: setup-env package-code pdf install-pdf mostlyclean clean help $(SUPPORTED_DOCS) +.PHONY: setup-env pdf install-pdf mostlyclean clean help $(SUPPORTED_DOCS) setup-env: scripts/setup_env.sh -package-code: - scripts/package_code.sh - pdf: latexpdf install-pdf: latexpdf @@ -36,13 +32,13 @@ install-pdf: latexpdf cp -f $(shell ls _build/latex/*.pdf | sed '/\/galois\.pdf$$/d') pdfs mostlyclean: + rm -i $(shell find . -path ./$(BUILDDIR) -prune -o -name '*.tar.gz' -print) rm -rf _build - rm -rf **/code.tar.gz clean: mostlyclean rm -rf .venv -$(SUPPORTED_DOCS): package-code setup-env +$(SUPPORTED_DOCS): setup-env @SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} . .venv/bin/activate && $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) %: diff --git a/doc/scripts/package_code.sh b/doc/scripts/package_code.sh deleted file mode 100755 index 340636475e..0000000000 --- a/doc/scripts/package_code.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -for i in **/code; do - if ! [ -d "${i}" ]; - then - continue - fi - - if ! [ -e "${i}/../code.tar.gz" ]; - then - echo "Packaging probable code example (${i})..." - tar -czvf "${i}/../code.tar.gz" -C "${i}" . - fi -done From 34b9624769caa8f1c90423fb2b06fcf7db39926f Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 17:27:36 -0800 Subject: [PATCH 66/67] Update README to reflect sphinx-download-dir changes. --- doc/README.md | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/doc/README.md b/doc/README.md index 52970722e7..03b84c4865 100644 --- a/doc/README.md +++ b/doc/README.md @@ -100,6 +100,7 @@ This directory is the intended source root for all SAW documentation. ### Contents - The `Makefile` is explained in more detail [above](#makefile). + - `conf.py` is our Sphinx configuration, which has been heavily customized from the default Sphinx provides. @@ -130,6 +131,12 @@ This directory is the intended source root for all SAW documentation. lexer, so our documentation understands and properly renders fenced code blocks labeled ```````sawscript````. +- `sphinx-download-dir` is a Python package implementing an extension for Sphinx + in the form of a _role_ (essentially, an inline element with some semantics) + for creating full-directory downloads more easily. + See [below](#code-examples) for usage detail. + + The remaining directories correspond to individual SAW documentation resources currently managed as part of this documentation ecosystem: @@ -195,29 +202,28 @@ some examples of this, see `doc/developer/`). It is useful to provide code sample downloads when writing tutorial-style documentation materials, so readers can easily follow along. -When building with `make`, `doc/` is set up to easily allow code samples to be -added anywhere they are needed. - -Note that this works best for materials that have their own dedicated directory: -If you are adding a document to a directory already containing code samples, -you'll need to determine whether it is appropriate to reorganize your document -so it can have its own downloadable code, or add to the code samples already -provided. +We have implemented a small Sphinx extension, `sphinx-download-dir`, to make it +easier to provide full-directory downloads in your documents. -To add code samples to your own material: +To use this feature: -1. Taking the note above into consideration, find/create the appropriate `code/` - directory. -2. Add your code/other materials to include in the package to it. -3. When you need to add a download link for the directory, use the path to the - `code/` directory, but add `.tar.gz`. - For example, if you've added `doc/my-cool-saw-tutorial` with code in - `doc/my-cool-saw-tutorial/code`, if you want to add a download link in - `doc/my-cool-saw-tutorial/index.md` you would write: +1. Create your directory that should be downloadable somewhere in `doc/` (as + long as it's somewhere in the tree, you'll be able to create a download + link). +2. Take note of the directory's location, either relative to `doc/` or relative + to the document where you would like to create a download link (either will + work). +3. Add the link: ```markdown - Download sample files: + Check out my cool {download-dir}`download`! ``` + + This will look for `path/to/dir` relative to this document; to look for it + relative to `doc/`, prefix with a `/` + (i.e. ``{download-dir}``). + +That's it! #### PDF generation From f8c17f91ddc9eb2980067bfabe4246d03ba22948 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Sun, 2 Feb 2025 17:36:10 -0800 Subject: [PATCH 67/67] Add CHANGES. Mostly focuses on the effects on users (namely, that the PDFs they get with releases have changed a bit). --- CHANGES.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index c4e74a4bce..2061462556 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,12 @@ ## New Features +* SAW documentation is now under a single Sphinx umbrella, resulting in a + complete overhaul of the `doc/` directory (#1723). Generally speaking, all + _content_ has stayed the same, and only organization has changed. Most + importantly for users, the PDF artifacts included in CI-generated releases + have different names and render with Sphinx styling. + * Add a `bitwuzla` family of proof scripts that use the Bitwuzla SMT solver. * Add a `:tenv` REPL command, which is like `:env` but prints the type

      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 LISM5uMNdWwSh*j2 diff --git a/doc/pdfs/saw-user-manual.pdf b/doc/pdfs/saw-user-manual.pdf index c947319a8be83fe7df1cdb5f4313ababf571f381..0b9c718463b93351a39853bbd4695bb552cb55e8 100644 GIT binary patch delta 119622 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