role analysis viktor kuncak patrick lam martin rinard mit lcs

112
Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

Upload: christopher-gibson

Post on 12-Jan-2016

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

Role Analysis

Viktor Kuncak

Patrick Lam

Martin Rinard

MIT LCS

Page 2: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

2

Process Scheduler Example

Running Process

RPSP

Suspended Process

Page 3: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

3

Process Scheduler Example

Running Process List

nextRP

RP

RP

RPnext

next next

prev

prev

prev prev

Running Process

SP

Suspended Process

Page 4: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

4

Process Scheduler Example

Running Process List

nextRP

RP

RP

RPnext

next next

prev

prev

prev prev

R

SPSP

SP SP

left right

left right

Suspended Process Tree

Suspended Process

Running Process

Page 5: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

5

Process Scheduler Example

Running Process List

nextRP

RP

RP

SP

next next

prev

prevprev

R

SPSP

SP SP

left right

left right

Suspended Process Tree

Suspended Process

Running Process

left

Page 6: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

6

Remarks

• Desirable to capture distinction between suspended and running processes

• Standard types unsuitable– Type is fixed for lifetime of object– Scheduler suspends and resumes processes

• Concept of a role– Statically verifiable property of an object– Capture current conceptual purpose of object– Role changes as object's purpose changes

Page 7: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

Goal

Develop a static type system in which each object is assigned a role

Program actions can change object roles

Page 8: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

8

Challenges

Aliasing

Ensure that role changes performed using one alias are correctly reflected in roles

of other aliases

Procedures

Compositional interprocedural role system

Page 9: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

9

Basic Approach

• Develop a role system in which role of each object depends on its heap aliases– Role provides aliasing information– Enables checker to ensure that role

changes are compatible with all aliases

• Role reflects object’s participation in different data structures

• Role changes as object moves between data structures

Page 10: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

10

Role Definition for Running Processes

Running Process

RP

role RP { Sequence of heap referencing constraints}

Page 11: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

11

Slot Constraints

Running Process

RP

role RP { slots RP.next,

RP.prev; ...}

Slot constraints identifythe complete set of heapaliases of the object

Page 12: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

12

Slot Constraints

Running Process

RP

RP

RPnext

prev

role RP { slots RP.next,

RP.prev; ...}

Slot constraints identifythe complete set of heapaliases of the object

Page 13: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

13

Field Constraints

Running Process

RP

RP

RPnext

prev

role RP { slots RP.next,

RP.prev; fields next : RP, prev : RP; ...}

Field constraints identifyroles of objects to which

fields refer

Page 14: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

14

Field Constraints

Running Process

RP

RP

RPnext

prev

role RP { slots RP.next,

RP.prev; fields next : RP, prev : RP; ...}

RP

RP

nextprev

Field constraints identifyroles of objects to which

fields refer

Page 15: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

15

Identity Constraints

Running Process

RP

RP

RPnext

prev

role RP { slots RP.next,

RP.prev; fields next : RP, prev : RP; identities next.prev, prev.next;}

RP

RP

nextprev

Identities identify cycles of length two.

Page 16: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

16

Identity Constraints

Running Process

RP

RP

RPnext

prev

role RP { slots RP.next,

RP.prev; fields next : RP, prev : RP; identities next.prev, prev.next;}

next

prev

Identities identify cycles of length two.

Page 17: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

17

nextRP

RP

RP

RPnext

next next

prev

prev

prev prev

role RP { slots RP.next,

RP.prev; fields next : RP, prev : RP; identities next.prev, prev.next;}

Role Definition for Running Processes

RP

Page 18: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

18

Roles as Constraints

• Each constraint C(o) is a predicate on objects

• Role is a logical conjunction of its defining constraints

• Constraints can be recursive!

role RP { slots RP.next,

RP.prev; fields next : RP, prev : RP; identities next.prev, prev.next;}

Page 19: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

19

Semantics of Role Constraints

• Constraint is interpreted in the context of a role assignment (mapping from objects to role names)

• Heap is role consistent iff there exists a role assignment in which every object satisfies its role

Page 20: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

20

Roles for Suspended Processes

R

SPSP

SP SP

left right

left right

Suspended Process Tree

Suspended Process

role R {

}role SP {

slots

}

Page 21: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

21

Roles for Suspended Processes

R

SPSP

SP SP

left right

left right

Suspended Process Tree

Suspended Process

role R {

}role SP {

slots R.left

}

Page 22: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

22

Roles for Suspended Processes

R

SP

SP SP

left right

left right

Suspended Process Tree

Suspended Process

SP

role R {

}role SP {

slots R.left R.right

}

Page 23: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

23

Roles for Suspended Processes

R

SP

left right

left right

Suspended Process Tree

Suspended Process

SP

SP

SP

role R {

}role SP {

slots R.left R.right SP.left

}

Page 24: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

24

Roles for Suspended Processes

Rleft right

left right

Suspended Process Tree

Suspended Process

SP SP

role R {

}role SP {

slots R.left R.right SP.left SP.right

}

SP SP

Page 25: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

25

Roles for Suspended Processes

Rleft right

left right

Suspended Process Tree

Suspended Process

SP SP

role R {

}role SP {

slots R.left | R.right | SP.left| SP.right;

}

SP SP

Page 26: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

26

Roles for Suspended Processes

Rleft right

left right

Suspended Process Tree

Suspended Process

SP SP

role R {

}role SP { fields left : SP right: SP slots R.left | R.right | SP.left| SP.right;

}

SP SP

Page 27: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

27

Roles for Suspended Processes

Rleft right

left right

Suspended Process Tree

Suspended Process

SP SP

role R {

}role SP { fields left : SP|null, right: SP|null; slots R.left | R.right | SP.left| SP.right;

}

SPSP

Page 28: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

28

Roles for Suspended Processes

Rleft right

left right

Suspended Process Tree

Suspended Process

SP SP

role R { fields left : SP|null, right: SP|null;}role SP { fields left : SP|null, right: SP|null; slots R.left | R.right | SP.left| SP.right;

}

SP SP

Page 29: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

29

Roles for Suspended Processes

SP

SP SP

left right

Suspended Process Tree

Suspended Process

left

role R { fields left : SP|null, right: SP|null;}role SP { fields left : SP|null, right: SP|null; slots R.left | R.right | SP.left| SP.right; acyclic left, right;} No cyclic paths of the form (left+right)*

Page 30: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

30

Roles for Suspended Processes

R

SPSP

SP SP

left right

left right

Suspended Process Tree

Suspended Process

role R { fields left : SP|null, right: SP|null;}role SP { fields left : SP|null, right: SP|null; slots R.left | R.right | SP.left| SP.right; acyclic left, right;}

Page 31: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

Programming with Roles

Page 32: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

32

Role Changes

• To suspend a process– Remove from running process list– Insert into suspended process tree

RP

RP

RPnext

next

prev

prev

nextRP prev

prev

R

SPSP

SP

left right

right

next

Page 33: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

33

Role Changes

• To suspend a process– Remove from running process list– Insert into suspended process tree

RP

I

RPnext

prevprev

RP

prev

R

SPSP

SP

left right

right

nextnext

Page 34: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

34

Role Changes

• To suspend a process– Remove from running process list– Insert into suspended process tree

RP RPnext

prevprev

RP

prev

R

SPSP

SP

left right

right

nextnext

role I { }

Isolated object:

I

Page 35: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

35

Role Changes

• To suspend a process– Remove from running process list– Insert into suspended process tree

RP

SP

RPnext

prevprev

RP

prev

R

SPSP

SP

left right

right

next

left

next

Page 36: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

36

Removing a Process from List

remove(p : RP) { pp = p.prev; pn = p.next; pp.next = pn; pn.prev = pp; p.next = null; p.prev = null; pp = null; pn = null; setRole(p : I);}

RP

RP

RPnext

next

prev

prev

nextRP prev

prev

p

next

Page 37: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

37

remove(p : RP) { pp = p.prev; pn = p.next; pp.next = pn; pn.prev = pp; p.next = null; p.prev = null; pp = null; pn = null; setRole(p : I);}

Removing a Process from List

RP

RP

RPnext

next

prev

prev

nextRP prev

prev

ppp

pnnext

Page 38: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

38

remove(p : RP) { pp = p.prev; pn = p.next; pp.next = pn; pn.prev = pp; p.next = null; p.prev = null; pp = null; pn = null; setRole(p : I);}

RP

RP

RPnext

next

prevprev

RP prev

prev next

ppp

pn

Removing a Process from List

next

Page 39: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

39

RP

RP

RP

RPnext

prevprev

prev nextnext

ppp

pn

Removing a Process from List

remove(p : RP) { pp = p.prev; pn = p.next; pp.next = pn; pn.prev = pp; p.next = null; p.prev = null; pp = null; pn = null; setRole(p : I);}

Page 40: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

40

RP

RP

RP

RPnext

prevprev

prev nextnext

p

Removing a Process from List

remove(p : RP) { pp = p.prev; pn = p.next; pp.next = pn; pn.prev = pp; p.next = null; p.prev = null; pp = null; pn = null; setRole(p : I);}Programming model expects programmer

to indicate role changes

Page 41: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

41

RP

RP

I

RPnext

prevprev

prev nextnext

p

Removing a Process from List

remove(p : RP) { pp = p.prev; pn = p.next; pp.next = pn; pn.prev = pp; p.next = null; p.prev = null; pp = null; pn = null; setRole(p : I);}Programming model expects programmer

to indicate role changes

Page 42: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

42

Programming Model Based On Instrumented Semantics

• Role Assignment Part of Program State– Each object has a nominal role– setRole(p : R) updates role assignment

• Programmer responsibilities– Specify intended role assignment– Write role-consistent program

• Static role checking ensures– Programs are role-consistent– No dynamic overhead incurred

Page 43: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

43

RP

RP

RPnext

next

prevprev

RP prev

prev next

ppp

pn

Temporary Role Violations

Data structure updates often

temporarily violate nominal roles of updated objects

remove(p : RP) { pp = p.prev; pn = p.next; pp.next = pn; pn.prev = pp; p.next = null; p.prev = null; pp = null; pn = null; setRole(p : I);}

Page 44: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

44

RP

RP

RPnext

next

prevprev

RP prev

prev next

ppp

pn

Temporary Role Violations

What do nominal roles mean during

these updates?

remove(p : RP) { pp = p.prev; pn = p.next; pp.next = pn; pn.prev = pp; p.next = null; p.prev = null; pp = null; pn = null; setRole(p : I);}

Page 45: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

45

RP

RP

RPnext

next

prevprev

RP prev

prev next

ppp

pn

Temporary Role Violations

Observation:

Objects with temporarily violated roles are referenced by local variables.

Page 46: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

46

onstage objects = objects referenced by local variables.

onstage objects

offstage objectsRP

RP

RPnext

next

prevprev

RP prev

prev next

ppp

pn

Onstage and Offstage Objects

Page 47: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

47

Onstage objects may have their

roles temporarily violated.

onstage objects

offstage objectsRP

RP

RPnext

next

prevprev

RP prev

prev next

ppp

pn

Onstage and Offstage Objects

onstage objects = objects referenced by local variables.

Page 48: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

48

Roles of offstage objects must be

correct assuming the nominal roles of

onstage objects.

onstage objects

offstage objectsRP

RP

RPnext

next

prevprev

RP prev

prev next

ppp

pn

Onstage and Offstage Objects

onstage objects = objects referenced by local variables.

Page 49: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

Role Checking

Page 50: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

50

Each procedure has an interface

• Precondition• Property of heap at start of procedure• Specifies initial dataflow fact for analysis

• Abstraction of actions of procedure– Read Effects (accessed region of heap)– Write Effects

• Changes to heap references • Nominal role changes

Procedure Interfaces

Page 51: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

51

Two Aspects of Role Checking

• Verifying interface conformance– Assume precondition– Analyze procedure– Verify that procedure respects effects

• Using interfaces at call sites to separate analysis of caller and callee

• Each procedure analyzed exactly once

Page 52: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

52

Role Consistency Across Procedure Calls

p

c

When analyzing a procedure:

Assume that accessed objects have consistent roles.

d

Region R accessed by

foo

foo(p) reads R { ...

}

Page 53: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

53

Role Consistency Across Procedure Calls

At Call Site:

Use read effects of the procedure to verify that region accessed by the procedure has consistent roles

(even for onstage objects)

p

c

d

...

foo(p);

...

Region R accessed by

foo

Page 54: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

54

Role Consistency Across Procedure Calls

p

c

When analyzing the procedure:

Verify that only objects declared in callee’s read effects are accessed.

Assume that accessed objects have correct roles.

d

Region R accessed by

foo

foo(p) reads R { ...

}

Page 55: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

55

Role Consistency Across Procedure Calls

p

c

d

After Call Site:

The role checking assumes that region accessed in the procedure is left in a role consistent state.

...

foo(p);

...

Region R accessed by

foo

Page 56: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

56

Role Consistency Across Procedure Calls

p

c

After analyzing the procedure:

Verify that objects in accessed region are left in role consistent state (implicit postcondition)

d

foo(p) reads R { ...

}

Region R accessed by

foo

Page 57: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

Verifying Interface Conformance

Page 58: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

58

RP

RP

RPn

p

RP

n p

p

Analysis Abstraction

RP

n

p

n

p

p

RPn

p

np

n

p

Concrete Heap

(objects and references)

Analysis Representation:Role Graph

(nodes and edges)

Page 59: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

59

RP

RP

RPn

p

RP

n p

p

Role Graph

RP

n

p

n

p

p

RPn

p

np

n

p

Concrete Heap Role Graph

Onstage node(represents a

single onstage object)

Page 60: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

60

RP

RP

RPn

p

RP

n p

p

Role Graph

RP

n

p

n

p

p

RPn

p

np

n

p

Summary Offstage Node (represents any

number of objects)

Concrete Heap Role Graph

Page 61: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

61

RP

RP

RPn

p

RP

n p

p

Abstraction Relation

RP

n

p

n

p

p

RPn

p

np

n

p

Each onstage object represented by an

onstage node

Concrete Heap Role Graph

Page 62: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

62

RP

RP

RPn

p

RP

n p

p

Abstraction Relation

RP

n

p

n

p

p

RPn

p

np

n

p

Concrete Heap Analysis Representation:Role GraphOffstage objects are

represented by offstage nodes

Page 63: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

63

RP

RP

RPn

p

RP

n p

p

Abstraction Relation

RP

n

p

n

p

p

RPn

p

np

n

p

The function is• a graph homomorphism• isomorphism between onstage objects and nodes• role preserving: role(h(o)) = role(o)

Page 64: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

64

Initial roles: p : RP

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Interface for remove

RPp

RP

Initial Role Graph

Page 65: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

65

Initial roles: p : RPRead effects: p, RP

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Interface for remove

RPp

RP

Initial Role Graph

Page 66: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

66

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = null

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Interface for remove

RPp

RP

Initial Role Graph

Page 67: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

67

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Interface for remove

RPp

RP

Initial Role Graph

Page 68: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

68

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Interface for remove

RPp

RP

Initial Role Graph

Page 69: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

69

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

Load statement

Page 70: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

70

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

Load statement

• expansion

RPpp

Page 71: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

71

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

Load statement

• expansion

• read effect check succeeds: RP in read effects

RPp

RP

RPpp

Page 72: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

72

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

Load statement

• expansion

• read effect check succeeds: RP in read effects

Page 73: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

73

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Load statement

• expansion

• read effect check succeeds: RP in read effects

Page 74: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

74

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Store statement

Page 75: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

75

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Store statement

• strong update

Page 76: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

76

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Store statement

• strong update

• verify write effect succeeds: RP.next = RP

Page 77: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

77

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Store statement

Page 78: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

78

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Store statement

• strong update

• verify write effect succeeds: RP.prev = RP

Page 79: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

79

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Store statement

Page 80: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

80

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Store statement

• strong update

• verify write effect succeeds: p.next=null

Page 81: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

81

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RPpp

RPpn

Store statement

• strong update

• verify write effect succeeds: p.prev=null

Page 82: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

82

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RP

RPpn

Local variable assignment

• remove local variable

Page 83: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

83

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

RP

RPpn

Local variable assignment

• remove local variable (node goes offstage)

• check role is correct

Page 84: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

84

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP RPpn

Local variable assignment

• remove local variable (node goes offstage)

• check role is correct

• merge node into offstage

Page 85: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

85

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

RPp

RP

Local variable assignment

• remove local variable (node goes offstage)

• check role is correct

• merge node into offstage

Page 86: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

86

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

Ip

RP

setRole

• change the nominal role

Page 87: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

87

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

Ip

RP

setRole

• change the nominal role

• check that the role change is in the interface

Page 88: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

88

Initial roles: p : RPRead effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove(p) {pp=p.prev; pn=p.next;pp.next=pn; pn.prev=pp;p.next=null; p.prev=null;pp=null; pn=null;setRole(p : I);

}

Verifying Interface for remove

Ip

RP

Postcondition check:

• all accessed nodes have referencing relationships consistent with their roles

• even onstage nodes

Page 89: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

89

Details of Analysis

• Dataflow fact is set of role graphs

• Merge is union of role graph sets

• Predicative analysis - filters out graphs that do not satisfy the test in conditional

• Builds on ideas from shape analysis– Expansion and contraction– May reachability (from onstage nodes)

prevents excessive merging of nodes

Page 90: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

Using Interfaces at Call Sites

Page 91: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

91

Example: remove procedure call . . .

remove(p);

. . .RP

p

RP

RPRP

c

Role graph before the call:

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

Page 92: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

92

Context Matching . . .

remove(p);

. . .RP

p

RP

RPRP

c

Role graph before the call:

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

Page 93: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

93

Role Check in Accessed Region . . .

remove(p);

. . .RP

p

RP

RPRP

c

Role graph before the call:

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

Page 94: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

94

Applying Must Write Effects . . .

remove(p);

. . .RP

p

RP

RPRP

c

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

Page 95: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

95

Applying Must Write Effects . . .

remove(p);

. . .RP

p

RP

RPRP

c

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

Page 96: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

96

Applying May Write Effects . . .

remove(p);

. . .RP

p

RP

RPRP

c

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

Page 97: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

97

Applying Must Role Change . . .

remove(p);

. . .I

p

RP

RPRP

c

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

Page 98: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

98

Enforcing Role Constraints . . .

remove(p);

. . .

p

RP

RPRP

c

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

I

Page 99: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

99

Enforcing Role Constraints . . .

remove(p);

. . .

p

RP

RPRP

c

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

I

Page 100: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

100

Merge . . .

remove(p);

. . .

p

RPRP

c

RP

RP

p

Read effects: p, RPMust write effects: p.next = null, p.prev = nullMay write effects:

RP.next = RP, RP.prev = RP

Must role changes: p : I

remove interface:

Role graph after the call:

I

Page 101: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

101

Key Ideas in Analysis

• Role of object characterizes its aliases– Enables analysis to find aliases– Verify new role consistent with all aliases

• Precise effects in procedure interfaces– Full precision for parameters

(or even fixed region surrounding parameters)

– Role consistency/may effects for rest of heap

Page 102: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

102

Multiple Simultaneous Roles

RP

RP

RP

RP

R

SP SP

SP SP

Running Processes Suspended Processes

Page 103: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

103

Multiple Simultaneous Roles

RP

RP

RP

RP

R

SP SP

SP SP

Running Processes Suspended Processes

HP

High Priority Process List

HP

Low Priority Process List

LP LP

proc proc proc proc

Page 104: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

104

Complete Slot Constraints

• This slot constraint specifies ALL aliases

• Aliases from high or low priority process lists violate role

role RP { slots RP.next,

RP.prev; fields next : RP, prev : RP; identities next.prev, prev.next;}

Page 105: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

105

Partial Slot Constraints

• This slot constraint specifies aliases from next, prev, right, and left fields ONLY

• Aliases from high or low priority process lists can be used in new role definitions for high and low priority processes

role RP { next, prev, right, left: slots RP.next, RP.prev; fields next : RP, prev : RP; identities next.prev, prev.next;}

Page 106: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

106

role RP { next, prev, right, left : slots RP.next,

RP.prev; fields next : RP, prev : RP; identities next.prev, prev.next;}

role HighPriority { proc : slots HPL.proc;}

role LowPriority { proc : slots LPL.proc;}

Multiple Simultaneous Roles

Can have a running high priority process, a running low priority process, etc.

Page 107: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

107

Benefits of Roles• Data structure consistency properties• Object usage constraints

– Procedures specify roles of parameters– Object's interface changes as its role

changes

• Roles crystallize useful perspective– Provide useful information to maintainers– Basis for exploration of the behavior of

program via dynamic role discovery – Help programmers conceptualize

relationships between objects

Page 108: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

Related Work

Page 109: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

109

Typestate

• Strom, Yemini ’86: Typestate– object initialization, no aliasing

• DeLine, Fähndrich ’01: High-Level Protocols– linear types for heap references

• Xu, Miller, Reps ’00: Typestate for machine code

Page 110: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

110

Dynamically Changing Classes• Chambers ‘93: Predicate Classes

• Ghelli, Palmerini ‘99: Fibonacci

• Drossopoulou et al. ’01: Fickle

Alias Control in OOP• Hogg ’91: Islands• Almeida ’97: Balloon Types• Clarke, Potter, Noble ’98: Ownership Types• Banerjee, Naumann ’02: Confinement• Boyapati, Rinard ’01: Unique References• Boyland: Alias Burying

Page 111: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

111

Specifying/Verifying Heap Invariants

• Smith, Walker, Morrisett ’00: Alias Types• Møller, Schwartzbach ’01: PALE• Fradet, Metayer ’97: Shape Types• Larus, Hilfinger ’88: Conflicts in structure accesses• Chase, Wegman, Zadeck ’90: SSG• Hendren ’90: Interference analysis• Hendren, Hummel, Nicolau ’94: APM / ADDS• Sagiv, Reps, Wilhelm ’99: TVLA• Rinetzky, Sagiv ’01: Noncompositional

interprocedural analysis

Page 112: Role Analysis Viktor Kuncak Patrick Lam Martin Rinard MIT LCS

112

Conclusion

• Statically checked role system– Role changes reflect changes in purpose of

object in computation– Full support for role changes and aliasing

• Key aspects of design– Role characterizes aliases– Procedure abstraction choices

• Multiple simultaneous roles