Proceedings of the 8th ACM SIGPLAN International Conference on Certified Programs and Proofs 2019
DOI: 10.1145/3293880.3294106
|View full text |Cite
|
Sign up to set email alerts
|

From C to interaction trees: specifying, verifying, and testing a networked server

Abstract: We present the first formal verification of a networked server implemented in C. Interaction trees, a general structure for representing reactive computations, are used to tie together disparate verification and testing tools (Coq, VST, and Quick-Chick) and to axiomatize the behavior of the operating system on which the server runs (CertiKOS). The main theorem connects a specification of acceptable server behaviors, written in a straightforward "one client at a time" style, with the CompCert semantics of the C… Show more

Help me understand this report
View preprint versions

Search citation statements

Order By: Relevance

Paper Sections

Select...
1
1
1
1

Citation Types

0
27
0

Year Published

2019
2019
2021
2021

Publication Types

Select...
4
3

Relationship

3
4

Authors

Journals

citations
Cited by 36 publications
(27 citation statements)
references
References 40 publications
0
27
0
Order By: Relevance
“…For instance, we might give a console write function the "consuming-style" specification {has ext(write(v); ; k)} write(v) {has ext(k)}, stating that if before calling write(v) the program has permission to write the value v and then do the operations in k, then after the call it is left with permission to do k. (We could reverse the pre-and postcondition for a "trace-style" specification, in which the external state records the history of operations performed by the program instead of the future operations allowed.) In this paper, we use interaction trees [13] as a means of describing a collection of allowed traces of external events. Interaction trees can be thought of as "abstract traces with binding"; for instance, we can write x ← read; ; write (x + 1); ; k x to mean "read a value, call it x, write the value x + 1, and then continue to do the actions in k using the same value of x.…”
Section: External State As Ghost Statementioning
confidence: 99%
See 1 more Smart Citation
“…For instance, we might give a console write function the "consuming-style" specification {has ext(write(v); ; k)} write(v) {has ext(k)}, stating that if before calling write(v) the program has permission to write the value v and then do the operations in k, then after the call it is left with permission to do k. (We could reverse the pre-and postcondition for a "trace-style" specification, in which the external state records the history of operations performed by the program instead of the future operations allowed.) In this paper, we use interaction trees [13] as a means of describing a collection of allowed traces of external events. Interaction trees can be thought of as "abstract traces with binding"; for instance, we can write x ← read; ; write (x + 1); ; k x to mean "read a value, call it x, write the value x + 1, and then continue to do the actions in k using the same value of x.…”
Section: External State As Ghost Statementioning
confidence: 99%
“…Although this is a very simple program, it is not a natural fit for separation-logic-based verification tools, which model the behavior of C programs in terms of computation and memory rather than I/O. Several approaches have been suggested for reasoning about I/O in separation logic, for instance by Penninckx et al [18] and Koh et al [13]. Using the latter approach, we might specify the behavior of getchar with the Hoare triple {ITree(r ← read; ; k r)} x = getchar() {ITree(k x)}, relating the function call to an external read event: the program before the call to getchar must have permission to perform a sequence of operations beginning with a read, and after the call it has permission to perform the remaining operations (with values that may depend upon the received value).…”
Section: Introductionmentioning
confidence: 99%
“…Alternatively, one can use the extracted code to run tests cases against the itree computation, possibly finding bugs before significant effort is spent verifying properties. Koh et al [2019] have found this methodology to be useful in other contexts.…”
Section: Itrees Are Extractablementioning
confidence: 99%
“…Additionally, in many cases, we can compose ITrees in such a way that they remain executable, that is by writing an executable scheduler that coordinates the ITree behaviors. This means that, besides proving properties of the resulting system, we can extract executable test cases [Koh et al 2019].…”
Section: Composition With the Environmentmentioning
confidence: 99%
“…Another alternative was to use freer monads introduced by Kiselyov et al [17], whose definition did not need a representation of striclty positive types using containers at all. There were already several encodings to model different kinds of monadic effects using freer monads: McBride [21] defines a General monad to model general recursion as effect, Letan et al [19] use the Program monad initially presented in the operational package known from Haskell 11 to reason about a small imperative language, and Koh et al [18] identify interaction trees as a suitable tool to verify functional correctness of a server implemented in C.…”
Section: :22mentioning
confidence: 99%