Jeremy Nimmer, page 1
Automatic Generation
- f Program Specifications
Jeremy Nimmer
MIT Lab for Computer Science http://pag.lcs.mit.edu/ Joint work with Michael Ernst
Automatic Generation of Program Specifications Jeremy Nimmer MIT - - PowerPoint PPT Presentation
Automatic Generation of Program Specifications Jeremy Nimmer MIT Lab for Computer Science http://pag.lcs.mit.edu/ Joint work with Michael Ernst Jeremy Nimmer, page 1 Synopsis Specifications are useful for many tasks Use of specifications
Jeremy Nimmer, page 1
MIT Lab for Computer Science http://pag.lcs.mit.edu/ Joint work with Michael Ernst
Jeremy Nimmer, page 2
Jeremy Nimmer, page 3
Jeremy Nimmer, page 4
Jeremy Nimmer, page 5
Jeremy Nimmer, page 6
Specification Code
Checker Generator
myStack.push(elt); Q.E.D. myStack.isEmpty() = false
Proof
Jeremy Nimmer, page 7
Jeremy Nimmer, page 8
Jeremy Nimmer, page 9
Specification Code
Checker Generator
myStack.push(elt); Q.E.D. myStack.isEmpty() = false
Proof
Jeremy Nimmer, page 10
Specification Code
Checker Generator
myStack.push(elt); Q.E.D. myStack.isEmpty() = false
Proof
Jeremy Nimmer, page 11
Invariants Instrumented program Original program Test suite
Run Instrument
Data trace database
Detect invariants
Jeremy Nimmer, page 12
Jeremy Nimmer, page 13
Specification Code
ESC/Java Daikon
myStack.push(elt); Q.E.D. myStack.isEmpty() = false
Proof
Jeremy Nimmer, page 14
/*@ invariant theArray != null; invariant \typeof(theArray) == \type(Object[]); invariant topOfStack >= -1; invariant topOfStack < theArray.length; invariant theArray[0..topOfStack] != null; invariant theArray[topOfStack+1..] == null; */
...
A Y U O E I theArray topOfStack
invariant theArray != null; invariant \typeof(theArray) == \type(Object[]); invariant topOfStack >= -1; invariant topOfStack < theArray.length; invariant theArray[0..topOfStack] != null; invariant theArray[topOfStack+1..] == null;
Jeremy Nimmer, page 15
/*@ requires x != null; requires topOfStack < theArray.length - 1; modifies topOfStack, theArray[*]; ensures topOfStack == \old(topOfStack) + 1; ensures x == theArray[topOfStack]; ensures theArray[0..\old(topOfStack)]; == \old(theArray[0..topOfStack]); */
A W Y U O E I theArray topOfStack
/*@ requires x != null; requires topOfStack < theArray.length - 1; modifies topOfStack, theArray[*]; ensures topOfStack == \old(topOfStack) + 1; ensures x == theArray[topOfStack]; ensures theArray[0..\old(topOfStack)]; == \old(theArray[0..topOfStack]); */
Jeremy Nimmer, page 16
Jeremy Nimmer, page 17
Jeremy Nimmer, page 18
Jeremy Nimmer, page 19
Jeremy Nimmer, page 20
invariant theArray != null; invariant topOfStack >= -1; invariant topOfStack < theArray.length; invariant theArray[0..length-1] == null; invariant theArray[0..topOfStack] != null; invariant theArray[topOfStack+1..] == null;
Jeremy Nimmer, page 21
Jeremy Nimmer, page 22
Jeremy Nimmer, page 23
Jeremy Nimmer, page 24
Jeremy Nimmer, page 25
Jeremy Nimmer, page 26
Jeremy Nimmer, page 27
Jeremy Nimmer, page 28
Jeremy Nimmer, page 29