inference of necessary field conditions with abstract
play

Inference of Necessary Field Conditions with Abstract Interpretation - PowerPoint PPT Presentation

Inference of Necessary Field Conditions with Abstract Interpretation Mehdi Bouaziz 1 , Francesco Logozzo 2 , Manuel F ahndrich 2 1 Ecole normale sup erieure, Paris, France 2 Microsoft Research, Redmond, WA, USA Tenth Asian Symposium on


  1. Inference of Necessary Field Conditions with Abstract Interpretation Mehdi Bouaziz 1 , Francesco Logozzo 2 , Manuel F¨ ahndrich 2 1 ´ Ecole normale sup´ erieure, Paris, France 2 Microsoft Research, Redmond, WA, USA Tenth Asian Symposium on Programming Languages and Systems December 12, 2012 – Kyoto, Japan

  2. Design by Contract is a programming methodology which systematically requires the programmer to provide contracts (preconditions, postconditions, object invariants) at design time. Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 2/15 Inference of Necessary Field Conditions with Abstract Interpretation

  3. Design by Contract is a programming methodology which systematically requires the programmer to provide contracts (preconditions, postconditions, object invariants) at design time. ◮ allow automatic generation of documentation, ◮ amplify the testing process, ◮ enable assume/guarantee reasoning for static program verification. Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 2/15 Inference of Necessary Field Conditions with Abstract Interpretation

  4. Design by Contract: Example public class Person { private readonly string Name; private readonly JobTitle JobTitle; public Person(string name, JobTitle jobTitle) { Contract.Requires(jobTitle != null && name != null); this.Name = name; this.JobTitle = jobTitle; } private void ObjectInvariant() { Contract.Invariant(this.Name != null); Contract.Invariant(this.JobTitle != null); } public string GetFullName() { if (this.JobTitle != null) return string.Format("{0}�({1})", PrettyPrint(this.Name), this.JobTitle.ToString())); return PrettyPrint(this.Name); } public string PrettyPrint(string s) { Contract.Requires(s != null); Contract.Ensures(Contract.Result<string>() != null); // ... } } Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 3/15 Inference of Necessary Field Conditions with Abstract Interpretation

  5. Design by Contract: Dream and Reality PL designer dream: the programmer provides sufficient contracts for all the methods and all the classes; a static verifier leverages them to prove the program correctness. Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 4/15 Inference of Necessary Field Conditions with Abstract Interpretation

  6. Design by Contract: Dream and Reality PL designer dream: the programmer provides sufficient contracts for all the methods and all the classes; a static verifier leverages them to prove the program correctness. Reality: ◮ the PL or the programming environment does not support contracts: the programmer use non-contract checks on input parameters/fields, unexploitable by a static analyzer, ◮ the program is only partially annotated, ◮ the programmer thinks that some contracts are obvious, ◮ the provided contracts are too weak. Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 4/15 Inference of Necessary Field Conditions with Abstract Interpretation

  7. Design by Contract: Dream and Reality PL designer dream: the programmer provides sufficient contracts for all the methods and all the classes; a static verifier leverages them to prove the program correctness. Reality: ◮ the PL or the programming environment does not support contracts: the programmer use non-contract checks on input parameters/fields, unexploitable by a static analyzer, ◮ the program is only partially annotated, ◮ the programmer thinks that some contracts are obvious, ◮ the provided contracts are too weak. Solution: Inference! Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 4/15 Inference of Necessary Field Conditions with Abstract Interpretation

  8. Contract Inference By abstract interpretation: ◮ Postconditions ◮ Preconditions [Cousot Cousot Logozzo 10] [Cousot Cousot F¨ ahndrich Logozzo 13] Works well! Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 5/15 Inference of Necessary Field Conditions with Abstract Interpretation

  9. Contract Inference By abstract interpretation: ◮ Postconditions ◮ Preconditions [Cousot Cousot Logozzo 10] [Cousot Cousot F¨ ahndrich Logozzo 13] Works well! ◮ Object invariants Class-Level Modular Analysis [Logozzo 03] Brittle! Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 5/15 Inference of Necessary Field Conditions with Abstract Interpretation

  10. Class-Level Modular Analysis Fixpoint characterization of the invariant: � � I = s 〚 c 〛 ⊔ s 〚 m 〛 ( I ) c ∈ Constrs m ∈ Methods Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 6/15 Inference of Necessary Field Conditions with Abstract Interpretation

  11. Class-Level Modular Analysis: Example public class Person { private readonly string Name; private readonly JobTitle JobTitle; public Person(string name, JobTitle jobTitle) { Contract.Requires(jobTitle != null && name != null); this.Name = name; this.JobTitle = jobTitle; } public string GetFullName() { if (this.JobTitle != null) return string.Format("{0}�({1})", PrettyPrint(this.Name), this.JobTitle.ToString())); return PrettyPrint(this.Name); } public int BaseSalary() { return this.JobTitle.BaseSalary; } public string PrettyPrint(string s) { Contract.Requires(s != null); // ... } } I 0 = � Name �→ NN , JobTitle �→ NN � Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 7/15 Inference of Necessary Field Conditions with Abstract Interpretation

  12. Class-Level Modular Analysis: Example, constructor added public class Person { private readonly string Name; private readonly JobTitle JobTitle; public Person(string name, JobTitle jobTitle) { Contract.Requires(jobTitle != null && name != null); this.Name = name; this.JobTitle = jobTitle; } public Person(string name) { Contract.Requires(name != null); this.Name = name; } public string GetFullName() { if (this.JobTitle != null) return string.Format("{0}�({1})", PrettyPrint(this.Name), this.JobTitle.ToString())); return PrettyPrint(this.Name); } public int BaseSalary() { return this.JobTitle.BaseSalary; } } I 1 = � Name �→ NN , JobTitle �→ T � Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 8/15 Inference of Necessary Field Conditions with Abstract Interpretation

  13. Our Solution: Backward Inference of Necessary Conditions Necessary conditions: properties that should hold on the object fields; if violated, an error will definitely occur. Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 9/15 Inference of Necessary Field Conditions with Abstract Interpretation

  14. Our Solution: Backward Inference of Necessary Conditions Necessary conditions: properties that should hold on the object fields; if violated, an error will definitely occur. Goal-directed backward interprocedural propagation of potentially failing assertions. ◮ push assertions that cannot be proven to method entry points (necessary precondition inference [Cousot Cousot Logozzo 10]) ◮ keep those involving private fields ◮ propagate them to the constructors ◮ generate an abstract error trace Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 9/15 Inference of Necessary Field Conditions with Abstract Interpretation

  15. Backward Inference of Necessary Conditions: Example public class Person { private readonly string Name; private readonly JobTitle JobTitle; public Person(string name, JobTitle jobTitle) { Contract.Requires(jobTitle != null && name != null); this.Name = name; this.JobTitle = jobTitle; } public Person(string name) { Contract.Requires(name != null); this.Name = name; } public string GetFullName() { if (this.JobTitle != null) return string.Format("{0}�({1})", PrettyPrint(this.Name), this.JobTitle.ToString())); return PrettyPrint(this.Name); } public int BaseSalary() { return this.JobTitle.BaseSalary; } } I 2 = � Name �→ NN , JobTitle �→ NN � Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 10/15 Inference of Necessary Field Conditions with Abstract Interpretation

  16. The algorithm Result : A necessary condition I ∗ on object fields while true do φ ← true foreach m ∈ M do if ¬ cccheck ( m , out ¯ a ) then // Strengthen precondition and invariant � φ P , φ I � ← π 2 ( I ( m )(¯ a )) Pre m ← Pre m ∧ φ P φ ← φ ∧ φ I end end if φ = true then break // no change on I F , we are done else I F ← I F ∧ φ end end foreach c ∈ C do if ¬ cccheck ( c , out ¯ a ) then // Strengthen the precondition Pre c ← Pre c ∧ π 1 ( I ( c )(¯ a )) end end Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 11/15 Inference of Necessary Field Conditions with Abstract Interpretation

  17. Special Case: Readonly Fields Restricted to readonly fields, the necessary condition inference algorithm gives object invariants after the first iteration of the main loop. Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 12/15 Inference of Necessary Field Conditions with Abstract Interpretation

  18. Experiments We ran cccheck on .Net Framework libraries, with: (BR) object invariant inference disabled; (NCR) object invariant inference enabled for readonly fields only; (NC1) object invariant inference enabled for all fields, with the constraint of analyzing every method only once; (CLMAR) forward class-level modular analysis enabled for readonly fields only. Mehdi Bouaziz, Francesco Logozzo, Manuel F¨ ahndrich 13/15 Inference of Necessary Field Conditions with Abstract Interpretation

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