runtime monitoring of object invariants with guarantees
play

Runtime Monitoring of Object Invariants with Guarantees Sriram - PowerPoint PPT Presentation

Runtime Monitoring of Object Invariants with Guarantees Sriram Rajamani, MSR India (joint work with Madhu Gopinathan, Indian Institute of Science) Object invariants interface Key{ //this < k? boolean Less(Key k); } class Node { Key


  1. Runtime Monitoring of Object Invariants with Guarantees Sriram Rajamani, MSR India (joint work with Madhu Gopinathan, Indian Institute of Science)

  2. Object invariants interface Key{ //this < k? boolean Less(Key k); } class Node { Key k; Node left; Node right; Node(Key key) { k = key }; //object invariant of this node boolean Inv(){ return((left==null || left.k.Less(k) && left.Inv()) && (right==null || k.Less(right.k)&& right.Inv())); } }

  3. Object invariants interface Key{ //this < k? boolean Less(Key k); } class Node { Key k; Node left; Node right; Node(Key key) { k = key }; //object invariant of this node boolean Inv(){ return((left==null || left.k.Less(k) && left.Inv()) && (right==null || k.Less(right.k)&& right.Inv())); } }

  4. Object invariants interface Key{ //this < k? boolean Less(Key k); } class Node { Key k; Node left; Node right; Node(Key key) { k = key }; //object invariant of this node boolean Inv(){ return((left==null || left.k.Less(k) && left.Inv()) && (right==null || k.Less(right.k)&& right.Inv())); } }

  5. Another example from JDBC Connection con = DriverManager.getConnection(..); Statement stmt = con.createStatement(); ResultSet rs1 = stmt.executeQuery("SELECT EMPNOFROM EMPLOYEE"); .. con.close(); .. ResultSet rs2 = stmt.executeQuery("SELECT EMPNAME FROM EMPLOYEE");

  6. Another example from JDBC Connection con = DriverManager.getConnection(..); Statement stmt = con.createStatement(); ResultSet rs1 = stmt.executeQuery("SELECT EMPNOFROM EMPLOYEE"); .. con.close(); .. ResultSet rs2 = stmt.executeQuery("SELECT EMPNAME FROM EMPLOYEE");

  7. Another example - Iterators //list is of type ArrayList<Integer> //with integers 1,2,3 added for(Iterator<Integer> i = list.iterator(); i.hasNext(); ) { int v = i.next(); if(v == 1) list.remove(v); else System.out.println(v); }

  8. Another example - Iterators //list is of type ArrayList<Integer> //with integers 1,2,3 added for(Iterator<Integer> i = list.iterator(); i.hasNext(); ) { int v = i.next(); if(v == 1) list.remove(v); else System.out.println(v); }

  9. Our goal • A runtime scheme to monitor object invariants • Guarantee to detect invariant violations when they happen

  10. Two issues with checking invariants • When does an object invariant hold? – When object o is in a “stable state” • When object o’s invariant depends on p, what happens when p changes without o’s knowledge?

  11. Reusable Monitor role ObjWInv { boolean Inv(); boolean inv; } o ObjWInv o . inv true o . Inv () � � = �

  12. Reusable Monitor role ObjWInv { boolean Inv(); boolean inv; Set<ObjWInv> dependents; } o ObjWInv o . inv true o . Inv () � � = �

  13. Reusable Monitor role ObjWInv { boolean Inv(); boolean inv; Set<ObjWInv> dependents; } Init(ObjWInv o) { o.inv := false; o.dependents := nullset; } o ObjWInv o . inv true o . Inv () � � = �

  14. Reusable Monitor role ObjWInv { boolean Inv(); CheckAndSetInv(ObjWInv o) { boolean inv; assert o.Inv(); Set<ObjWInv> dependents; o.inv = true; } } Init(ObjWInv o) { o.inv := false; Add(ObjWInv o, ObjWInv p) { o.dependents := nullset; assert(o.inv = false); } p.dependents.Add(o); } o ObjWInv o . inv true o . Inv () � � = �

  15. Reusable Monitor role ObjWInv { boolean Inv(); boolean inv; Set<ObjWInv> dependents; } Init(ObjWInv o) { o.inv := false; o.dependents := nullset; } CheckAndSetInv(ObjWInv o) { assert o.Inv(); o.inv = true; } Add(ObjWInv o, ObjWInv p) { assert(o.inv = false); p.dependents.Add(o); } o ObjWInv o . inv true o . Inv () � � = �

  16. Reusable Monitor role ObjWInv { Start(ObjWInv o) { boolean Inv(); assert(o.inv = false); CheckAndSetInv(o); boolean inv; } Set<ObjWInv> dependents; } Init(ObjWInv o) { o.inv := false; o.dependents := nullset; } CheckAndSetInv(ObjWInv o) { assert o.Inv(); o.inv = true; } Add(ObjWInv o, ObjWInv p) { assert(o.inv = false); p.dependents.Add(o); } o ObjWInv o . inv true o . Inv () � � = �

  17. Reusable Monitor role ObjWInv { Start(ObjWInv o) { boolean Inv(); assert(o.inv = false); CheckAndSetInv(o); boolean inv; } Set<ObjWInv> dependents; } Init(ObjWInv o) { Stop(ObjWInv o) { o.inv := false; assert(o.inv = true); o.dependents := nullset; o.inv := false; } } CheckAndSetInv(ObjWInv o) { assert o.Inv(); o.inv = true; } Add(ObjWInv o, ObjWInv p) { assert(o.inv = false); p.dependents.Add(o); } o ObjWInv o . inv true o . Inv () � � = �

  18. Reusable Monitor role ObjWInv { Start(ObjWInv o) { boolean Inv(); assert(o.inv = false); CheckAndSetInv(o); boolean inv; } Set<ObjWInv> dependents; } Init(ObjWInv o) { Stop(ObjWInv o) { o.inv := false; assert(o.inv = true); o.dependents := nullset; o.inv := false; } } CheckAndSetInv(ObjWInv o) { assert o.Inv(); Validate(ObjWInv p) { o.inv = true; for(o in p.dependents) { } if(o.inv = true) CheckAndSetInv(o); } Add(ObjWInv o, ObjWInv p) { } assert(o.inv = false); p.dependents.Add(o); } o ObjWInv o . inv true o . Inv () � � = �

  19. role ObjWInv { Calling the monitor boolean Inv(); boolean inv; Set<ObjWInv> dependents; from the program } Init(ObjWInv o) { o.inv := false; Connection con = o.dependents := nullset; DriverManager.getConnection(..); } Init(con); Start(con); CheckAndSetInv(ObjWInv o) { assert o.Inv(); Statement stmt = o.inv = true; con.createStatement(); } Init(stmt); Add(ObjWInv o, ObjWInv p) { Add(con, stmt); assert(o.inv = false); Start(stmt); p.dependents.Add(o); } ... Stop(stmt); Start(ObjWInv o) { assert(o.inv = false); ResultSet rs1 = CheckAndSetInv(o); stmt.executeQuery("SELECT..”); } Start(stmt); Stop(ObjWInv o) { ... assert(o.inv = true); o.inv := false; con.close(); } Validate(con); Validate(ObjWInv p) { for(o in p.dependents) { if(o.inv = true) CheckAndSetInv(o); } }

  20. role ObjWInv { Calling the monitor boolean Inv(); boolean inv; Set<ObjWInv> dependents; from the program } Init(ObjWInv o) { o.inv := false; Connection con = o.dependents := nullset; DriverManager.getConnection(..); } Init(con); Start(con); CheckAndSetInv(ObjWInv o) { assert o.Inv(); Statement stmt = o.inv = true; con.createStatement(); } Init(stmt); Add(ObjWInv o, ObjWInv p) { Add(con, stmt); assert(o.inv = false); Start(stmt); p.dependents.Add(o); } ... Stop(stmt); Start(ObjWInv o) { assert(o.inv = false); ResultSet rs1 = CheckAndSetInv(o); stmt.executeQuery("SELECT..”); } Start(stmt); Stop(ObjWInv o) { ... assert(o.inv = true); o.inv := false; con.close(); } Validate(con); Validate(ObjWInv p) { for(o in p.dependents) { if(o.inv = true) CheckAndSetInv(o); } }

  21. Automated instrumentation • When an object o is created, called Init(o) • When a public method of o is entered, call Stop(o) • When a public method of o is exited, call Start(o) • Whenever o or dependents change, call “validate(o)” !

  22. Automatic role ObjWInv { boolean Inv(); Dependency boolean inv; Set<ObjWInv> dependents; } Tracking Init(ObjWInv o) { o.inv := false; o.dependents := nullset; • Compute a relation D } such that (o,p,f) in D CheckAndSetInv(ObjWInv o) { assert o.Inv(); iff the object invariant of o o.inv = true; } depends on the value of Add(ObjWInv o, ObjWInv p) { the field p.f assert(o.inv = false); p.dependents.Add(o); – Can be done by AOP by } monitoring all accesses Start(ObjWInv o) { assert(o.inv = false); during execution of o.Inv() CheckAndSetInv(o); } Stop(ObjWInv o) { assert(o.inv = true); • Invoke Validate(p) o.inv := false; } whenever p.f changes. Validate(ObjWInv p) { for(o in p.dependents) { if(o.inv = true) CheckAndSetInv(o); } }

  23. Example monitor API o: Statement p: Connection + binding user code new Statement(p) Init(o) connection = p 1 return Start(o) o.Inv() p.isClosed() return inv = true p.close() isClosed = true 2 Validate(p) o.Inv() return

  24. Correctness Let r be any run of program P composed with the monitor using binding B. Suppose r does not have any assertion violations. Then, the following holds in all states of r: o ObjWInv o . inv true o . Inv () � � = �

  25. Implementation : I NV COP • Reusable Monitor • Aspect Generator • At runtime: – Populate D by tracking p.f read during the execution of o.Inv() – if p.f changes, invoke Validate(p)

  26. Custom Binding Default Required Binding class T { public boolean Inv() { return 0 <= x && x < y; For objects o of } type ObjWInv , public void method1() { x++; – invoke Start(o) y++; user.m(this,..); after the .. construction of o } – invoke Stop(o) public float method2() { return 1/(y-x); before every } } public method call on o class User { public void m(T t,..) { – invoke Start(o) //callback t.method2(); after every public .. } method call on o }

  27. Detecting Violations in JDOM Document Document Content Iterator List API Iterator User getDescendants() hasNext() next() next() get() detach() remove(this) next() next() ConcurrentModificationException

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend