480 likes | 494 Views
Explore how to specify and verify temporal properties of heap-manipulating programs in Java-like languages, supporting dynamic allocation, deallocation, and concurrency. Address challenges of varying domains and dynamic resource management.
E N D
Verifying Temporal Heap Properties Specified via Evolution Logic Eran Yahav, Tom Reps, Mooly Sagiv and Reinhard Wilhelm ESOP 2003 http://www.cs.tau.ac.il/~yahave
Introduction Goals: • specify and verify temporal properties of sequential and concurrent heap manipulating programs • specify the way objects evolve across program execution • focus on Java-like programs • support the following • Java-like Concurrency • Dynamic allocation/deallocation of objects • Dynamic allocation/deallocation of threads
Spatial and Temporal Properties spatial temporal • Relate memory locations across program configurations • Allow specification relating to allocation and deallocation of objects • Example: concurrent GC • Safety – only objects not reachable from the roots are collected • Liveness – all garbage objects are eventually collected • Propositional temporal logic is not enough • Motivate use of more expressive specification language
x n n at[L1] x x … … n n at[L1] at[L1] Every object is eventually pointed-to by x Spatial and Temporal Properties L1: while (x != null) { L2: e = x L3: x = x.n L4: e.n = null L5: free(e) }
Spatial and Temporal Properties • Every allocated object is eventually deallocated • Every allocated request is eventually assigned handler thread • An object is eventually removed from pointer-based data structure • Each opened file remains open until used • …
Challenges • Varying domains • Set of objects in the heap likely to change during program execution • Dynamic allocation and deallocation • No a priori bound on number of objects/threads • Progress • Abstraction of transitions/traces • Progress may be lost under abstraction
Plan • Program Configurations and Traces • Specification • Evolution Temporal Logic (ETL) • Meaning of ETL formulae • Verification • Reducing ETL to FOTC • Representing ETL Traces via FO Structures • Compiling ETL formulae to FOTC formulae • Abstract Interpretation • Prototype implementation • Summary
Program Configurations • A concrete program configuration encodes • global store • program-location of every thread • status of locks and threads • First-order logical structures used to represent program configurations
Concrete Configuration x e n n at[L3]
Concrete Configuration at[l_1] blocked held_by at[l_C] rval[f] blocked rval[f] at[l_1] at[l_0] at[l_0] rval[f]
Program Traces … • Infinite sequence of program configurations • Each step is a single program action • Individuals may vary between configurations • Dynamic allocation / deallocation x x x e e x e x x at[L1] at[L2] at[L3] at[L4] at[L5] at[L1]
Evolution Temporal Logic (ETL) • Based on first-order linear temporal logic • v.(v), v.(v), TC • X,U,, • State formulae may include free variables • Relate memory locations across configurations (worlds) • v. x(v)e(v) • Special operators • v object v allocated • v object v deallocated • Predicates represent properties of interest • For heap references – x(v),n(v1,v2),… • for threads and locks – blocked(t,l), held_by(l,t),…
ETL Examples • Every object is eventually pointed-to by x • v.x(v) • Every allocated object is eventually deallocated • (v.v v) • Every allocated request is eventually assigned handler thread • r:request. r t:thread. handles(t,r) • An object v is eventually removed from a pointer-based data structure s • … u:s(u) n*(u,v)…
ETL Semantics • Infinite sequence of configurations • World locality • An individual may exist in at most one world • Equality is world-local • Evolution • Explicit representation of evolution relation of individuals across worlds • Explicitly represent allocated and deallocated individuals
evolution edge object deallocated ETL Traces … at[L1] at[L2] at[L4] at[L5] at[L1] at[L3] x x e x e x x x e
Meaning of ETL formulae … at[L1] at[L2] at[L4] at[L5] at[L1] at[L3] x x e x e x x x e v. x(v) x(v) v.
Temporally Separable Properties • Properties which do not relate individuals of different configurations • Temporal operators only over closed FO formulae • Corresponds to propositional temporal logic • v.x(v)v’.n(v,v’) • P, P=v.x(v)v’.n(v,v’) P … … x x x e e x x at[L1] at[L2] at[L3] at[L5] at[L1]
Spatially Separable Properties • Universally quantified propositional specification • Each object should obey the specification separately • Typestate verification • Examples: • v.x(v) • f:file. (read(f) closed(f)) … at[L1] at[L2] at[L4] at[L5] at[L1] at[L3] x x e x e x x x e
ETL Traces as FO Structures … at[L1] at[L2] at[L4] at[L5] at[L1] at[L3] x x e x e x x x e
object deallocation existence edge evolution edge world ETL Traces as FO Structures … x x e x e x x x e at[L1] at[L2] at[L4] at[L5] at[L1] at[L3] succ succ succ succ succ
ETL Traces as FO Structures … at[L1] at[L2] at[L4] at[L5] at[L1] at[L3] x x e x e x x x e
Representing ETL Traces via First-order Structures • Explicitly encode possible worlds and accessibility relation • World individuals • Successor edges relate worlds • Each non-world individual exists in at most one world • Existence predicate relates non-world individuals to the world in which they exist • Designated predicates • succ(w1,w2) • exists(o,w) • evolves(o1,o2) • Adapted from Lewis’s “counterpart semantics”
Extracting ETL properties • ETL properties compiled into plain FOTC formulae • ETL trace encoded as FO structure • Evaluate ETL over ETL-trace by evaluating corresponding FOTC formula over FO structure
All is well, but… • ETL traces are infinite • Number of traces for a program is possibly infinite
Abstract Interpretation • (Over-) Approximate possibly infinite set of infinite traces by finite set of finite abstract traces • Successive Approximations • Compute the greatest fixed point • Start with an abstract trace representing initial configuration with all possible suffixes • Repeatedly refine the results by exploring longer finite prefixes • Longer abstract trace represents fewer concrete traces • Evaluate property over abstract traces in the fixed point • Use 3-valued logical structures for abstract traces
at[L1] … at[L3] at[L2] x e x x succ succ currWorld at[L1] at[L2] at[L3] x e x x succ succ succ currWorld Canonic Abstraction
Abstraction Example at[l_c] heldBy heldBy rval[v] at[l_1] at[l_c] at[l_c] heldBy … rval[v] rval[v] rval[v] rval[v] succ rval[v] succ succ at[l_1] rval[v] rval[v] at[l_1] at[l_1] at[l_1] blocked rval[v] rval[v] rval[v] rval[v] t0 at[l_1] t0 at[l_1] t0 at[l_1] t0 at[l_1] blocked blocked initialWorld currWorld succ succ succ succ succ heldBy at[l_c] at[l_2] rval[v] rval[v] at[l_1] rval[v] rval[v] rval[v] rval[v] at[l_1] at[l_1] at[l_1] blocked rval[v] rval[v] rval[v] t0 at[l_1] t0 at[l_1] t0 at[l_1] blocked blocked initialWorld currWorld
Growing Abstract Traces • Partial Concretization (Focus) • Apply update • Append new configuration to abstract trace • New configuration reflects update effect • Add • Successor edge into new configuration • Evolution edges into evolved individuals • Update currWorld predicate • Abstraction
at[L1] at[L2] at[L3] at[L3] … x x x x update currWorld currWorld at[L1] at[L2] at[L3] at[L3] … at[L1] at[L2] at[L3] at[L3] … x x x x x x x x e currWorld currWorld at[L2] at[L1] at[L3] at[L4] … at[L1] at[L2] at[L3] at[L3] … x x x x e x x x x e … currWorld … currWorld at[L1] at[L2] at[L3] at[L4] … x x x x e abstraction concretization at[L1] at[L2] x succ x succ currWorld at[L1] x succ currWorld
at[L1] at[L2] at[L3] at[L3] … x x x x at[L1] at[L2] at[L3] at[L3] … x x x x e at[L1] at[L2] at[L3] at[L4] … x x x x e … Greatest Fixed Point at[L1] succ x
at[L1] at[L2] at[L3] at[L3] … x x x x at[L1] at[L2] at[L3] at[L3] … x x x x e at[L1] at[L2] at[L3] at[L4] … x x x x e Greatest Fixed Point … at[L2] at[L1] succ succ x x
Recording History • Improve precision • add predicates for subformulae of the ETL formula • Record state of subformulae satisfaction over the trace • Tailor abstraction according to property of interest
Progress • Progress may be lost under abstraction • Common for liveness to require augmentation with progress information • Can express progress measure for linked data structures in ETL • e.g., progress of a linked data structure traversal • Number of items reachable from a program variable decreases
Implementation • Manually • Convert ETL to FOTC • Define instrumentation predicates for temporal subformulae • Let TVLA do the rest • Properties proved • Termination of linked list manipulation • Response (fair/unfair) • Takes a lot of time
In the paper… • Soundness • Technicalities • Transworld Equality • Instrumentation predicates
Related Work • Model Checking Birth and Death / Distefano,Rensink,Katoen [TCS ‘02] • Decidable temporal logic • Allows referring to moment of allocation and deallocation • Does not allow relationships between objects • Simple abstraction – collapse all non-reachable objects
Summary • ETL allows specification of heap evolution properties • Automatically verify ETL properties • Represent ETL traces via FO structures • Represent ETL properties as FOTC formulae • Evaluate FOTC formula over 3-valued FO structures representing sets of traces • Common for liveness properties to require reduction or progress monitors • Progress expressed as ETL formulae
Future Work • More precise and efficient algorithms for verifying ETL • Tableau-like verification method • ETL subclasses • Already used spatially separable properties for memory management properties [SAS’03]
The End http://www.cs.tau.ac.il/~yahave
The End http://www.cs.tau.ac.il/~yahave
ETL Examples • v.x(v) • v. e(v)v • v.x(v) • v.x(v)
Subtle Issues • Fairness • We can express explicit scheduling queue • Other notions of fairness under dynamic allocation? • Reduction • Constant domain semantics • Requires user to specify existence or use syntactically different quantifiers for global/local quantification • Monotone domain semantics • Easy to understand, a viable alternative
at[L1] x Progress at[L4] at[L2] at[L3] x e e x x succ succ succ succ currWorld
Example x n While (x != null) { e = x x = x.n e.n = null free(e) } e = x x e x = x.n x = x.n n free(e) e x e x n n n e.n = null e.n = null x e e x n … Empty list
Why not Constant Domains? • Requires user to explicitly specify existence • or use syntactically different quantifiers for global/local quantification • Explicit evolution edges allow to abstract away from implementation details • Can handle various allocation semantics • Can handle copy-garbage-collector
ETL to FOTC vw0 initialWorld(w0) exists(w0,v) w,v’ succ*(w0,w) evolution*(v,v’) exists(w,v’) P(v)
Growing Abstract Traces at[L1] x succ currWorld at[L1] at[L2] x x succ succ currWorld