+ All Categories
Home > Documents > Extended Static Checking for Java

Extended Static Checking for Java

Date post: 07-Jan-2016
Category:
Upload: jeneva
View: 27 times
Download: 0 times
Share this document with a friend
Description:
Extended Static Checking for Java. Cormac Flanagan Joint work with: Rustan Leino, Mark Lillibridge, Greg Nelson, Jim Saxe, and Raymie Stata Compaq Systems Research Center. What is “Static Checking”?. Annotated Source Code. Static Checker. Error:. type systems - PowerPoint PPT Presentation
37
Extended Static Checking Extended Static Checking for Java for Java Cormac Flanagan Cormac Flanagan Joint work with: Rustan Joint work with: Rustan Leino, Leino, Mark Lillibridge, Greg Mark Lillibridge, Greg Nelson, Nelson, Jim Saxe, and Raymie Stata Jim Saxe, and Raymie Stata Compaq Systems Research Compaq Systems Research Center Center
Transcript
Page 1: Extended Static Checking for Java

Extended Static CheckingExtended Static Checking

for Javafor JavaCormac FlanaganCormac Flanagan

Joint work with: Rustan Leino,Joint work with: Rustan Leino,Mark Lillibridge, Greg Nelson, Mark Lillibridge, Greg Nelson,

Jim Saxe, and Raymie StataJim Saxe, and Raymie Stata

Compaq Systems Research CenterCompaq Systems Research Center

Page 2: Extended Static Checking for Java

What is “Static Checking”?What is “Static Checking”?

AnnotatedAnnotatedSource CodeSource Code StaticStatic

CheckerCheckerError: ... Error: ...

type systemstype systems

Error: wrong number of arguments in method callError: wrong number of arguments in method call

lintlint

Error: unreachable codeError: unreachable code

full program verificationfull program verification

Error: qsort does not yield a sorted arrayError: qsort does not yield a sorted array

Page 3: Extended Static Checking for Java

Why not just use testing?Why not just use testing?

Testing essential butTesting essential but

ExpensiveExpensive

Finds errors lateFinds errors late

Misses errors Misses errors

Static checking and testing Static checking and testing

complementary complementary

Page 4: Extended Static Checking for Java

Comparison of Static CheckersComparison of Static CheckersQualityQuality

100%100%

EffortEffort

fullfullverificationverification

lintlint

typetypesystemssystems

ExtendedExtendedStaticStatic

CheckingChecking

Note: Graph is not to scaleNote: Graph is not to scale

ESCESCModula-3Modula-3ESCESC

JavaJava

Page 5: Extended Static Checking for Java

Goals of ESC/JavaGoals of ESC/Java

Practical static checkingPractical static checking Detect common run-time errors Detect common run-time errors

null dereferencesnull dereferences array boundsarray bounds type caststype casts race conditionsrace conditions deadlocksdeadlocks ......

Modular checkingModular checking

Page 6: Extended Static Checking for Java

Non-goals of ESC/JavaNon-goals of ESC/Java

Complete functional verificationComplete functional verification

CompletenessCompleteness

May not pass all programsMay not pass all programs

SoundnessSoundness

May fail to detect errorsMay fail to detect errors

Error-resistant, not error-proofError-resistant, not error-proof

Page 7: Extended Static Checking for Java

Architecture of ESC/JavaArchitecture of ESC/Java

Method + annotationsMethod + annotations

Verification condition Verification condition generatorgenerator

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

CounterexampleCounterexample

x.x.y.(x > y ==> … )y.(x > y ==> … )

Error: index out ofError: index out ofbounds on line 218bounds on line 218

Background Background axiomsaxioms

Page 8: Extended Static Checking for Java

Input to ESC/JavaInput to ESC/Java

Method + annotationsMethod + annotations

Verification condition Verification condition generatorgenerator

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

CounterexampleCounterexample

Background Background axiomsaxioms

Page 9: Extended Static Checking for Java

Modular checkingModular checking

Method bodyMethod body

ClientClient

InterfaceInterface

checkcheck

checkcheck

ClientClientcheckcheck

Page 10: Extended Static Checking for Java

Describing interfacesDescribing interfaces

public class Vector {public class Vector {

Object[] a;Object[] a;

int size;int size;

public Object elementAt(int i)public Object elementAt(int i)

{ ... }{ ... } public Object[] copyToArray()public Object[] copyToArray()

{ ... }{ ... }}}

//@ invariant a != null//@ invariant a != null

//@ invariant size <= a.length//@ invariant size <= a.length

//@ requires 0 <= i && i < size//@ requires 0 <= i && i < size

//@ ensures RES != null && RES.length == size//@ ensures RES != null && RES.length == size //@ modifies size, a[0], a[*]//@ modifies size, a[0], a[*]

Page 11: Extended Static Checking for Java

Input to ESC/Java’s “checking engine”Input to ESC/Java’s “checking engine”

Method implementationMethod implementation

Interface annotationsInterface annotations

requiresrequires

ensuresensures

modifiesmodifies

invariantsinvariants

Page 12: Extended Static Checking for Java

Verification condition generationVerification condition generation

Method + annotationsMethod + annotations

Verification condition Verification condition generatorgenerator

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

CounterexampleCounterexample

Background Background axiomsaxioms

Page 13: Extended Static Checking for Java

Verification condition generationVerification condition generation

Easy for small languages [Dijkstra]Easy for small languages [Dijkstra]

Much harder for real languagesMuch harder for real languages Object-orientedObject-oriented

TypedTyped

Dynamic allocationDynamic allocation

ExceptionsExceptions

AliasingAliasing

ThreadsThreads

Page 14: Extended Static Checking for Java

Verification conditions for real programsVerification conditions for real programs

JavaJava

Guarded commandGuarded command

Verification conditionVerification condition

x = a[ i++ ];x = a[ i++ ];

i0 = i;i0 = i;i = i + 1;i = i + 1;assert (LABEL Null@218: a != null);assert (LABEL Null@218: a != null);assert (LABEL IndexNeg@218: 0 <= i0);assert (LABEL IndexNeg@218: 0 <= i0);assert (LABEL IndexTooBig@218: i0 < a.length);assert (LABEL IndexTooBig@218: i0 < a.length);x = elems[a][i0];x = elems[a][i0];

i0.(i0 == i ==> … )i0.(i0 == i ==> … )

wlpwlp

assume assume preconditionspreconditionsassume assume invariantsinvariants......

......assert assert postconditionspostconditionsassert assert invariantsinvariants

Page 15: Extended Static Checking for Java

ExceptionsExceptions

Java has exceptionsJava has exceptions

Add exceptions (Add exceptions (raiseraise and and catchcatch) to ) to guarded command languageguarded command language

Calculate wlp of GC statement with Calculate wlp of GC statement with respect to normal and exceptional respect to normal and exceptional postconditionspostconditions

Page 16: Extended Static Checking for Java

Method overridingMethod overriding

Method in subclass can override Method in subclass can override method in superclassmethod in superclass

Must respect interface of overridden Must respect interface of overridden methodmethod

Weaker requires clauseWeaker requires clause

Stronger ensures clauseStronger ensures clause

Page 17: Extended Static Checking for Java

Verification conditionVerification condition

Method + annotationsMethod + annotations

Verification condition Verification condition generatorgenerator

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

CounterexampleCounterexample

Background Background axiomsaxioms

Page 18: Extended Static Checking for Java

Verification conditionVerification condition

Formula in untyped, first-order Formula in untyped, first-order predicate calculus predicate calculus

equality and function symbolsequality and function symbols quantifiersquantifiers arithmetic operationsarithmetic operations select and store operationsselect and store operations Eg. Eg. x.x.y.(x > y ==> … )y.(x > y ==> … )

Page 19: Extended Static Checking for Java

Example verification conditionExample verification condition

Verification condition large but “dumb”Verification condition large but “dumb”(IMPLIES (DISTINCT |ecReturn| |L_14.4|) (IMPLIES (AND (EQ |a@pre:2.8| |a:2.8|) (EQ |a:2.8| (asField |a:2.8| (array |T_int|))) (< (fClosedTime |a:2.8|) alloc) (EQ |n@pre:3.6| |n:3.6|) (EQ |n:3.6| (asField |n:3.6| |T_int|)) (EQ |MAX_VALUE@pre:3.4.26| |MAX_VALUE:3.4.26|) (EQ |@true| (is |MAX_VALUE:3.4.26| |T_int|)) (EQ |elems@pre| elems) (EQ elems (asElems elems)) (< (eClosedTime elems) alloc) (EQ LS (asLockSet LS)) (EQ |alloc@pre| alloc) (EQ |@true| (is |this<1>| |T_Bag|)) (EQ |@true| (isAllocated |this<1>| alloc)) (NEQ |this<1>| null)) (FORALL (tmp1 |tmp2:21.4| |tmp3:21.6| |m:12.8| |mindex:13.8| |i:14.13| |tmp0:14.28|) (AND (IMPLIES (<= 1 (select |n:3.6| |this<1>|)) (AND (LBLNEG |[email protected]~15.10| (NEQ (select |a:2.8| |this<1>|) null)) (LBLNEG |[email protected]~15.11| (<= 0 1)) (LBLNEG |[email protected]~15.11| (< 1 (arrayLength (select |a:2.8| |this<1>|)))) (IMPLIES (< (select (select elems (select |a:2.8| |this<1>|)) 1) |MAX_VALUE:3.4.26|) (AND (LBLNEG |[email protected]~17.12| (NEQ (select |a:2.8| |this<1>|) null)) (LBLNEG |[email protected]~17.13| (<= 0 1)) (LBLNEG |[email protected]~17.13| (< 1 (arrayLength (select |a:2.8| |this<1>|)))) (FORALL (|m:17.8|) (IMPLIES (EQ |m:17.8| (select (select elems (select |a:2.8| |this<1>|)) 1)) (FORALL (|i:14.28|) (IMPLIES (AND (EQ |i:14.28| (+ 1 1)) (EQ |@true| |bool$false|)) (FORALL (|tmp2:21.4<1>|) (IMPLIES (EQ |tmp2:21.4<1>| (select |a:2.8| |this<1>|)) (AND (LBLNEG |[email protected]~21.16| (NEQ (select |a:2.8| |this<1>|) null)) (LBLNEG |[email protected]~21.17| (<= 0 (select (store |n:3.6| |this<1>| (- (select |n:3.6| |this<1>|) 1)) |this<1>|))) (LBLNEG |[email protected]~21.17| (< (select (store |n:3.6| |this<1>| (- (select |n:3.6| |this<1>|) 1)) |this<1>|) (arrayLength (select |a:2.8| |this<1>|)))) (LBLNEG |[email protected]~21.4| (NEQ |tmp2:21.4<1>| null)) (LBLNEG |[email protected]~21.5| (<= 0 1)) (LBLNEG |[email protected]~21.5| (< 1 (arrayLength |tmp2:21.4<1>|))) (LBLNEG |Exception:[email protected]~11.2| (EQ |ecReturn| |ecReturn|))))))))))) (IMPLIES (NOT (< (select (select elems (select |a:2.8| |this<1>|)) 1) |MAX_VALUE:3.4.26|)) (FORALL (|i:14.28|) (IMPLIES (AND (EQ |i:14.28| (+ 1 1)) (EQ |@true| |bool$false|)) (FORALL (|tmp2:21.4<1>|) (IMPLIES (EQ |tmp2:21.4<1>| (select |a:2.8| |this<1>|)) (AND (LBLNEG |[email protected]~21.16| (NEQ (select |a:2.8| |this<1>|) null)) (LBLNEG |[email protected]~21.17| (<= 0 (select (store |n:3.6| |this<1>| (- (select |n:3.6| |this<1>|) 1)) |this<1>|))) (LBLNEG |[email protected]~21.17| (< (select (store |n:3.6| |this<1>| (- (select |n:3.6| |this<1>|) 1)) |this<1>|) (arrayLength (select |a:2.8| |this<1>|)))) (LBLNEG |[email protected]~21.4| (NEQ |tmp2:21.4<1>| null)) (LBLNEG |[email protected]~21.5| (<= 0 0)) (LBLNEG |[email protected]~21.5| (< 0 (arrayLength |tmp2:21.4<1>|))) (LBLNEG |Exception:[email protected]~11.2| (EQ |ecReturn| |ecReturn|)))))))))) (IMPLIES (NOT (<= 1 (select |n:3.6| |this<1>|))) (AND (IMPLIES (EQ |L_14.4| |L_14.4|) (FORALL (|tmp2:21.4<1>|) (IMPLIES (EQ |tmp2:21.4<1>| (select |a:2.8| |this<1>|)) (AND (LBLNEG |[email protected]~21.16| (NEQ (select |a:2.8| |this<1>|) null)) (LBLNEG |[email protected]~21.17| (<= 0 (select (store |n:3.6| |this<1>| (- (select |n:3.6| |this<1>|) 1)) |this<1>|))) (LBLNEG |[email protected]~21.17| (< (select (store |n:3.6| |this<1>| (- (select |n:3.6| |this<1>|) 1)) |this<1>|) (arrayLength (select |a:2.8| |this<1>|)))) (LBLNEG |[email protected]~21.4| (NEQ |tmp2:21.4<1>| null)) (LBLNEG |[email protected]~21.5| (<= 0 0)) (LBLNEG |[email protected]~21.5| (< 0 (arrayLength |tmp2:21.4<1>|))) (LBLNEG |Exception:[email protected]~11.2| (EQ |ecReturn| |ecReturn|)))))) (IMPLIES (NOT (EQ |L_14.4| |L_14.4|)) (AND (LBLNEG |Exception:[email protected]~11.2| (EQ |L_14.4| |ecReturn|))))))))))

Page 20: Extended Static Checking for Java

Background axiomsBackground axioms

Method + annotationsMethod + annotations

Verification condition Verification condition generatorgenerator

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

CounterexampleCounterexample

Background Background axiomsaxioms

Page 21: Extended Static Checking for Java

Background axiomsBackground axioms

Additional properties of Java that the Additional properties of Java that the theorem prover needs to knowtheorem prover needs to know

A variable of type T always holds a value A variable of type T always holds a value whose type is a subtype of Twhose type is a subtype of T

The subtyping relation is reflexive, anti-The subtyping relation is reflexive, anti-symmetric, and transitivesymmetric, and transitive

newnew returns an object that is distinct from returns an object that is distinct from all existing objectsall existing objects

... lots more ...... lots more ... java.lang.Objectjava.lang.Object has no supertype has no supertype

Page 22: Extended Static Checking for Java

Automatic theorem provingAutomatic theorem proving

Method + annotationsMethod + annotations

Verification condition Verification condition generatorgenerator

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

CounterexampleCounterexample

Background Background axiomsaxioms

Page 23: Extended Static Checking for Java

Automatic theorem provingAutomatic theorem proving

Use Use SimplifySimplify

Theorem prover from ESC/Modula-3Theorem prover from ESC/Modula-3

Accepts formulae in untyped, first-order Accepts formulae in untyped, first-order predicate calculus predicate calculus

Attempts to prove or refuteAttempts to prove or refute

Page 24: Extended Static Checking for Java

Automatic theorem provingAutomatic theorem proving

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

((SimplifySimplify))

CounterexampleCounterexample

x.x.y.(x > y ==> … )y.(x > y ==> … )

DivergesDivergesValidValid

Page 25: Extended Static Checking for Java

Handling counterexamplesHandling counterexamples

Method + annotationsMethod + annotations

Verification condition Verification condition generatorgenerator

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

CounterexampleCounterexample

Background Background axiomsaxioms

Page 26: Extended Static Checking for Java

Error message from counterexampleError message from counterexample

Verification Verification conditioncondition

AutomaticAutomatic

theorem provertheorem prover

((SimplifySimplify))

Counterexample:Counterexample:

x.x.y.y. ( …( … (LABEL IndexTooBig@218 …)(LABEL IndexTooBig@218 …) …) …)

x417 > 7x417 > 7 … …Label: IndexTooBig@218Label: IndexTooBig@218 … …

Error: index out ofError: index out ofbounds on line 218bounds on line 218

Page 27: Extended Static Checking for Java

Initial experienceInitial experience

First implementation is doneFirst implementation is done

Run on 30,000+ lines of code (mostly itself)Run on 30,000+ lines of code (mostly itself)

Caught several errors Caught several errors

null dereference, array boundsnull dereference, array bounds

Programmer can annotate and check about Programmer can annotate and check about 300 lines per hour300 lines per hour

Looks promising ... Looks promising ...

Page 28: Extended Static Checking for Java

DemonstrationDemonstration

Page 29: Extended Static Checking for Java

ESC/Java SummaryESC/Java Summary

Finds more errors than type checkingFinds more errors than type checking

Costs less than full verificationCosts less than full verification

Currently working; is being evaluatedCurrently working; is being evaluated

Potential as “software reliability metric”Potential as “software reliability metric”

Practical checking based on automatic Practical checking based on automatic theorem proving may be possibletheorem proving may be possible

www.research.digital.com/SRC/esc/Esc.htmlwww.research.digital.com/SRC/esc/Esc.html

Page 30: Extended Static Checking for Java
Page 31: Extended Static Checking for Java

Comparison of Static CheckersComparison of Static CheckersQualityQuality

100%100%

EffortEffort

fullfullverificationverification

lintlint

typetypesystemssystems

decidabilitydecidabilitylimitlimit

ExtendedExtendedStaticStatic

CheckingChecking

Note: Graph is not to scaleNote: Graph is not to scale

Page 32: Extended Static Checking for Java

Metrics for Static CheckersMetrics for Static Checkers

CostCost

of using the toolof using the tool

QualityQuality

Does it miss errors?Does it miss errors?

Does it give spurious warnings?Does it give spurious warnings?

Page 33: Extended Static Checking for Java

ChallengesChallenges

Automatic theorem provingAutomatic theorem proving

Error messages from counterexampleError messages from counterexample

Verification conditions for real programsVerification conditions for real programs Object-orientedObject-oriented

TypedTyped

Dynamic allocationDynamic allocation

ExceptionsExceptions

Page 34: Extended Static Checking for Java

ESC/Java vs. TestingESC/Java vs. Testing

Testing essential butTesting essential but

ExpensiveExpensive

Finds errors lateFinds errors late

Misses errors Misses errors

ESC/Java ... ? ESC/Java ... ?

Page 35: Extended Static Checking for Java

Background axiomsBackground axioms

JavaJava

Guarded commandGuarded command

Verification conditionVerification condition

Background Background axiomsaxioms

wlpwlp

Page 36: Extended Static Checking for Java

Additional annotationsAdditional annotations

//@ assert <exp>

//@ assume <exp>

//@ nowarn <error code>

//@ axiom <exp>

Page 37: Extended Static Checking for Java

Describing interfacesDescribing interfaces

public Integer[] sum(Integer[] a, Integer[] b);public Integer[] sum(Integer[] a, Integer[] b);

//@ requires a != null && b != null;//@ requires a != null && b != null;

//@ requires a.length == b.length;//@ requires a.length == b.length;

//@ ensures RES != null && RES.length == a.length;//@ ensures RES != null && RES.length == a.length;

//@ modifies a[0], b[*];//@ modifies a[0], b[*];


Recommended