Verifying Safety Properties of Concurrent Java Programs Using 3-Valued Logic

Post on 19-Jan-2016

40 views 0 download

Tags:

description

Verifying Safety Properties of Concurrent Java Programs Using 3-Valued Logic. Eran Yahav and Mooly Sagiv School of Computer Science Tel-Aviv University yahave@post.tau.ac.il http://www.cs.tau.ac.il/~yahave. Introduction. Goal: Verification of concurrent Java programs Support the following - PowerPoint PPT Presentation

Transcript of Verifying Safety Properties of Concurrent Java Programs Using 3-Valued Logic

1

Eran Yahav and Mooly SagivSchool of Computer Science

Tel-Aviv University

yahave@post.tau.ac.ilhttp://www.cs.tau.ac.il/~yahave

Verifying Safety Properties of Concurrent Java Programs Using 3-Valued Logic

2

Introduction

Goal: Verification of concurrent Java programs

Support the following Java concurrency-model Dynamic allocation/deallocation of objects Dynamic allocation/deallocation of threads

3

Why Verify Java Programs?

Concurrency is hard to debug deadlocks interference dependence on thread scheduling failures hard to reproduce

Concurrent Programming in Java low-level constructs no compile-time or run-time checks

4

Java Concurrency

Threads and locks are just dynamically allocated objects

synchronized implements mutual exclusion

wait, notify and notifyAll coordinate activities across threads

5

Java Concurrency Challenges

Dynamic allocationData and control are strongly related

Thread-scheduling info may require understanding of heap structure (e.g., scheduling queue)

Heap analysis requires information on thread scheduling

Thread t1 = new Thread();Thread t2 = new Thread();…if (…) t = t1 else t = t2;t.start();

6

Model Checking Approach

Explore the space of possible program configurations

Find configurations that violate the desired safety property

How do you guarantee finiteness ?

7

l_0: while (true) {l_1: synchronized(sharedLock) {l_C: // critical actionsl_2: }l_3: }

Two threads: (pc1,pc2,lockAcquired1,lockAcquired2)

Example - Mutual Exclusion

Allocate new lock ?Allocate new thread ?

8

Existing Approaches for Dynamic Allocation

dSPIN, Java pathfinder, Bandera, All put an a priori bound on number of

allocated objects Abstraction applied when model is

extracted

9

Existing Approaches for Dynamic Allocation

Will fail on many interesting programsExample: http server

Creates a thread for each http request Threads using exclusive shared resource Show mutual exclusion

R T

TR

TR

10

Existing Approaches for Dynamic Allocation

Challenges Guaranteed correctness vs. assumed

correctness Correctly track thread states

R TTR

TR

R TTR

TR

TR

11

Our Approach

Abstract configurations (conservatively) represent multiple program configurations

Compute a finite set of abstract configurations modeling program behavior Every potential concrete configuration is

represented Superfluous configurations might be

represented tooCheck property for every computed

abstract configuration

12

Plan

Concrete Program ModelSafety PropertiesAbstract Program ModelPrototype implementation (3VMC)Summary

13

Program Model

Interleaving model of concurrencyProgram is a collection of thread-type

transition systems

14

Configurations

A program configuration encodes: global store program-location of every thread status of locks and threads

First-order logical structures used to represent program configurations

15

Configurations

is_threadat[l_C]

rval[this]

held_by

blocked

is_threadat[l_1]

rval[this]

is_threadat[l_0]

is_threadat[l_0]

is_threadat[l_1]

rval[this]

blocked

16

Configurations

Predicates model properties of interest is_thread { at[lab](t) : lab Labels } { rval[fld](o1,o2) : fld Fields } held_by(l,t) blocked(t,l) waiting(t,l)

Can use the framework with different predicates

17

Configurations

Program control-flow is not separately represented

Program location for each thread is encoded inside the configuration { at[lab](t) : lab Labels }

18

Structural Operational Semantics - actions

An action consists of: precondition formula update formulae

Precondition formula may use a free variable ts for “currently scheduled” thread

Semantics is non-deterministic

19

Structural Operational Semantics - actions

lock(v)

tts: rval[v](ts,l) held_by(l,t)

held_by’(l1,t1) = held_by(l1,t1) (l1 = l t1 = ts)

blocked’ (t1,l1) = blocked(t1,l1) ((l1 l) (t1 ts))

precondition

predicateupdate

20

Initialize(C0) {for each C C0

push(stack,C)}explore() { while stack is not empty { C = pop(stack) if not member(C,stateSpace) { verify(C) stateSpace = stateSpace {C} for each action ac for each C’ such that C ac C’ push(stack,C’) } }}

State Space Exploration

21

Safety Properties

Configuration-local property as logical formula

Example: no total deadlockt,lb : is_thread(t) blocked(t, lb)

t1,t2: (t1 t2) (at[lcrit](t1) at[lcrit](t2))

Example: mutual exclusion

22

Abstract Program Model

Conservative representation of the concrete model

Use 3-valued logical structures to conservatively represent multiple 2-valued structures

Conservatively apply actions on abstract configurations

23

Abstract Configurations

First-order 3-valued logical structures are used to represent abstract program configurations

3-valued logic 1 = true 0 = false 1/2 = unknown A join semi-lattice, 0 1 = 1/2

24

Concrete Configuration

is_threadat[l_C]

rval[this]

held_by

blocked

is_threadat[l_1]

rval[this]

is_threadat[l_0]

is_threadat[l_0]

is_threadat[l_1]

rval[this]

blocked

25

Abstract Configuration

is_threadat[l_C]

rval[this]

held_byblocked

is_threadat[l_1] rval[this]

is_threadat[l_0]

26

Canonic Abstraction

Merge all nodes with the same unary predicate values into a single summary node

Join predicate valuesConverts a configuration of arbitrary size

into a 3-valued abstract configuration of bounded size

27

Abstract Semantics

Conservatively model the effect of an action use same formulae as in concrete semantics soundness is guaranteed by [SRW99]

Use same state-space exploration algorithm to explore the abstract state space

28

Unbounded Number of Threads

Exploit state-space symmetryPrevious work defined symmetry between

process names (indices)Thread location = thread propertyCanonic names = symmetry between

properties

29

Example - Mutual Exclusion

is_threadat[l_0]

rval[this]

Initial configuration

30

Example - Mutual Exclusion

is_threadat[l_0]

rval[this]

is_threadat[l_C]

rval[this]

held_by

A thread enters the critical section

31

Example - Mutual Exclusion

is_threadat[l_1]

rval[this]

is_threadat[l_C]

rval[this]

held_by

blocked

Other threads may be blocked or just beginning execution

is_threadat[l_0]

rval[this]

32

Safety Properties Revisited

RW interferenceWW interferenceTotal deadlockNested monitorsIllegal thread interactions

33

Prototype Implementation

3VMCUsed to verify several small example

programs concurrent stack queue two-lock queue [PODC96] dining philosophers

only intraproceduralno optimizations used

34

Further Work

Optimizations Partial-order reduction Symbolic representations (BDDs)

Liveness propertiesProviding counter examples

35

Summary

Traditional MC Our Approach

concrete configuration

propositional first order+ transitive closure

abstraction model extraction*abstract interpretation

control flowinternally represented

internally represented

materialization ? basic featureobject number a priori bounded unbounded

thread numberfixed or a priori bounded

unbounded

36

http://www.cs.tau.ac.il/~yahave