Program Analysis Mooly Sagiv

Slides:



Advertisements
Similar presentations
Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
Advertisements

Semantics Static semantics Dynamic semantics attribute grammars
Automatic Memory Management Noam Rinetzky Schreiber 123A /seminar/seminar1415a.html.
Context-Sensitive Interprocedural Points-to Analysis in the Presence of Function Pointers Presentation by Patrick Kaleem Justin.
Compilation 2011 Static Analysis Johnni Winther Michael I. Schwartzbach Aarhus University.
Abstraction and Modular Reasoning for the Verification of Software Corina Pasareanu NASA Ames Research Center.
Data-Flow Analysis Framework Domain – What kind of solution is the analysis looking for? Ex. Variables have not yet been defined – Algorithm assigns a.
Chair of Software Engineering From Program slicing to Abstract Interpretation Dr. Manuel Oriol.
Introduction to Advanced Topics Chapter 1 Mooly Sagiv Schrierber
ISBN Chapter 3 Describing Syntax and Semantics.
1 Formal Methods in SE Qaisar Javaid Assistant Professor Lecture 05.
Establishing Local Temporal Heap Safety Properties with Applications to Compile-Time Memory Management Ran Shaham Eran Yahav Elliot Kolodner Mooly Sagiv.
Next Section: Pointer Analysis Outline: –What is pointer analysis –Intraprocedural pointer analysis –Interprocedural pointer analysis (Wilson & Lam) –Unification.
Program analysis Mooly Sagiv html://
1 Predicate Abstraction of ANSI-C Programs using SAT Edmund Clarke Daniel Kroening Natalia Sharygina Karen Yorav (modified by Zaher Andraus for presentation.
1 Motivation Dynamically allocated storage and pointers are an essential programming tools –Object oriented –Modularity –Data structure But –Error prone.
An Overview on Program Analysis Mooly Sagiv Tel Aviv University Textbook: Principles of Program.
An Overview on Static Program Analysis Mooly Sagiv Tel Aviv University Textbook: Principles of.
Program analysis Mooly Sagiv html://
1 Control Flow Analysis Mooly Sagiv Tel Aviv University Textbook Chapter 3
Programming Language Semantics Mooly SagivEran Yahav Schrirber 317Open space html://
Abstract Interpretation Part I Mooly Sagiv Textbook: Chapter 4.
1 Program Analysis Mooly Sagiv Tel Aviv University Textbook: Principles of Program Analysis.
Overview of program analysis Mooly Sagiv html://
Semantics with Applications Mooly Sagiv Schrirber html:// Textbooks:Winskel The.
Detecting Memory Errors using Compile Time Techniques Nurit Dor Mooly Sagiv Tel-Aviv University.
1 Languages and Compilers (SProg og Oversættere) Lecture 15 (1) Compiler Optimizations Bent Thomsen Department of Computer Science Aalborg University With.
Describing Syntax and Semantics
Program Analysis Mooly Sagiv Tel Aviv University Sunday Scrieber 8 Monday Schrieber.
Overview of program analysis Mooly Sagiv html://
Static Program Analysis via Three-Valued Logic Thomas Reps University of Wisconsin Joint work with M. Sagiv (Tel Aviv) and R. Wilhelm (U. Saarlandes)
1/25 Pointer Logic Changki PSWLAB Pointer Logic Daniel Kroening and Ofer Strichman Decision Procedure.
Introduction to Program Analysis
An Overview on Static Program Analysis Mooly Sagiv.
CUTE: A Concolic Unit Testing Engine for C Technical Report Koushik SenDarko MarinovGul Agha University of Illinois Urbana-Champaign.
1 Employing decision procedures for automatic analysis and verification of heap-manipulating programs Greta Yorsh under the supervision of Mooly Sagiv.
Program Analysis and Verification Spring 2015 Program Analysis and Verification Lecture 14: Numerical Abstractions Roman Manevich Ben-Gurion University.
Program Analysis and Verification Spring 2014 Program Analysis and Verification Lecture 14: Numerical Abstractions Roman Manevich Ben-Gurion University.
Shape Analysis Overview presented by Greta Yorsh.
An Overview on Program Analysis Mooly Sagiv Tel Aviv University Textbook: Principles of Program.
Computer Science and Software Engineering University of Wisconsin - Platteville 2. Pointer Yan Shi CS/SE2630 Lecture Notes.
Compiler Principles Fall Compiler Principles Lecture 0: Local Optimizations Roman Manevich Ben-Gurion University.
Page 1 5/2/2007  Kestrel Technology LLC A Tutorial on Abstract Interpretation as the Theoretical Foundation of CodeHawk  Arnaud Venet Kestrel Technology.
Introduction to Program Analysis CS 8803 FPL Aug 20, 2013.
Convergence of Model Checking & Program Analysis Philippe Giabbanelli CMPT 894 – Spring 2008.
Symbolic Execution with Abstract Subsumption Checking Saswat Anand College of Computing, Georgia Institute of Technology Corina Păsăreanu QSS, NASA Ames.
An Undergraduate Course on Software Bug Detection Tools and Techniques Eric Larson Seattle University March 3, 2006.
Random Interpretation Sumit Gulwani UC-Berkeley. 1 Program Analysis Applications in all aspects of software development, e.g. Program correctness Compiler.
1 Languages and Compilers (SProg og Oversættere) Compiler Optimizations Bent Thomsen Department of Computer Science Aalborg University With acknowledgement.
CUTE: A Concolic Unit Testing Engine for C Koushik SenDarko MarinovGul Agha University of Illinois Urbana-Champaign.
Operational Semantics Mooly Sagiv Tel Aviv University Textbook: Semantics with Applications Chapter.
Program Analysis via 3-Valued Logic Thomas Reps University of Wisconsin Joint work with Mooly Sagiv and Reinhard Wilhelm.
1 Iterative Program Analysis Abstract Interpretation Mooly Sagiv Tel Aviv University Textbook:
1 Numeric Abstract Domains Mooly Sagiv Tel Aviv University Adapted from Antoine Mine.
CSC3315 (Spring 2009)1 CSC 3315 Languages & Compilers Hamid Harroud School of Science and Engineering, Akhawayn University
Operational Semantics Mooly Sagiv Tel Aviv University Sunday Scrieber 8 Monday Schrieber.
CS412/413 Introduction to Compilers and Translators April 2, 1999 Lecture 24: Introduction to Optimization.
Operational Semantics Mooly Sagiv Reference: Semantics with Applications Chapter 2 H. Nielson and F. Nielson
Putting Static Analysis to Work for Verification A Case Study Tal Lev-Ami Thomas Reps Mooly Sagiv Reinhard Wilhelm.
A Static Analyzer for Large Safety-­Critical Software Presented by Dario Bösch, ETH Zürich Research Topics in Software Engineering Dario.
Spring 2016 Program Analysis and Verification
Spring 2016 Program Analysis and Verification
Seminar in automatic tools for analyzing programs with dynamic memory
State your reasons or how to keep proofs while optimizing code
Symbolic Implementation of the Best Transformer
High Coverage Detection of Input-Related Security Faults
Iterative Program Analysis Abstract Interpretation
Languages and Compilers (SProg og Oversættere) Compiler Optimizations
CUTE: A Concolic Unit Testing Engine for C
Ras Bodik WF 11-12:30 slides adapted from Mooly Sagiv
Presentation transcript:

Program Analysis Mooly Sagiv

Formalities Prerequisites: Compilers or Programming Languages Course Grade –10 % Lecture Summary (latex+examples within one week) –45% 4 assignments –45% Final Course Project (Ivy)

Motivation Compiler optimizations –Common subexpressions –Parallelization Software engineering Security

Class Notes Prepare a document with latex –Original material covered in class –Explanations –Questions and answers –Extra examples –Self contained Send class notes by Monday morning to Incorporate changes Available next class

A sailor on the U.S.S. Yorktown entered a 0 into a data field in a kitchen-inventory program The 0-input caused an overflow, which crashed all LAN consoles and miniature remote terminal units The Yorktown was dead in the water for about two hours and 45 minutes

A sailor on the U.S.S. Yorktown entered a 0 into a data field in a kitchen-inventory program The 0-input caused an overflow, which crashed all LAN consoles and miniature remote terminal units The Yorktown was dead in the water for about two hours and 45 minutes Numeric static analysis can detect these errors when the ship is built!

x = 3; y = 1/(x-3); x = 3; px = &x; y = 1/(*px-3); need to track values other than 0 need to track pointers for (x =5; x < y ; x++) { y = 1/ z - x Need to reason about loops

x = 3; p = (int*)malloc(sizeof int); *p = x; q = p; y = 1/(*q-3); need to track heap-allocated storage Dynamic Allocation (Heap)

Why is Program Analysis Difficult? Undecidability –Checking if program point is reachable The Halting Problem –Checking interesting program properties Rice Theorem –Can the computer really perform inductive reasoning?

Complicated programming languages –Large/unbounded base types: int, float, string –Pointers/aliasing + unbounded #’s of heap-allocated cells –User-defined types/classes –Loops with unbounded number of iterations –Procedure calls/recursion/calls through pointers/dynamic method lookup/overloading –Concurrency + unbounded #’s of threads Conceptual –Which program to analyze? –Which properties to check? Scalability Why is Program Analysis Difficult?

Universe of States Reachable States Bad States Sidestepping Undecidability

Universe of States Reachable States Bad States Overapproximate the reachable states False alarms Sidestepping Undecidability [Cousot & Cousot POPL77-79]

Abstract Interpretation x > 0 y := - 2 y := -x T F  012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y x 012 ∞ -2 -∞ y

Infer Inductive Invariants via AI x := 2; y := 0; x := x + y; y := y + 1;  012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y

Infer Inductive Invariants via AI x := 2; y := 0; x := x + y; y := y + 1;  012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y

Infer Inductive Invariants via AI x := 2; y := 0; x := x + y; y := y + 1;  012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y

Infer Inductive Invariants via AI x := 2; y := 0; x := x + y; y := y + 1;  012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y

Infer Inductive Invariants via AI x := 2; y := 0; x := x + y; y := y + 1;  012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y

Infer Inductive Invariants via AI x := 2; y := 0; x := x + y; y := y + 1;  012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y 012 ∞ -2 -∞ x y

AI Infers Inductive Invariants x := 2; y := 0; while true do assert x > 0 ; x := x + y; y := y + 1 x  1, y  -1 Non-inductive x>0 Inductive x  1 & y  0

Original Problem: Shape Analysis (Jones and Muchnick 1981) Characterize dynamically allocated data –x points to an acyclic list, cyclic list, tree, dag, etc. –show that data-structure invariants hold Identify may-alias relationships Establish “disjointedness” properties –x and y point to structures that do not share cells Memory Safety –No null and dangling de-references –No memory leaks In OO programming –Everything is in the heap  requires shape analysis

Why Bother? int *p, *q; q = (int *) malloc(); p = q; l 1 : *p = 5; p = (int *) malloc(); l 2 : printf(*q); /* printf(5) */

Example: Concrete Interpretation x t n n t x n x t n x t n n x t n n x t t x n t t n t x t x t x empty return x x = t t =malloc(..); t  next=x; x = NULL T F

Example: Abstract Interpretation t x n x t n x t n n x t t x n t t n t x t x t x empty x t n n x t n n n x t n t n x n x t n n return x x = t t =malloc(..); t  next=x; x = NULL T F

List reverse(Element  head) { List rev, ne; rev = NULL; while (head != NULL) { ne = head  next; head  next = rev; head = ne; rev = head; } return rev; } Memory Leakage leakage of address pointed to by head head n n n n ne head ne n n

Memory Leakage Element  reverse(Element  head) { Element  rev,  ne; rev = NULL; while (head != NULL) { ne = head  next; head  next = rev; rev = head; head = ne; } return rev; } No memory leaks

Mark and Sweep void Mark(Node root) { if (root != NULL) { pending =  pending = pending  {root} marked =  while (pending   ) { x = SelectAndRemove(pending) marked = marked  {x} t = x  left if (t  NULL) if (t  marked) pending = pending  {t} t = x  right if (t  NULL) if (t  marked) pending = pending  {t} } assert(marked = = Reachset(root)) } void Sweep() { unexplored = Universe collected =  while (unexplored   ) { x = SelectAndRemove(unexplored) if (x  marked) collected = collected  {x} } assert(collected = = Universe – Reachset(root) ) }  v: marked(v)  reach[root](v)

Example: Mark void Mark(Node root) { if (root != NULL) { pending =  pending = pending  {root} marked =  while (pending   ) { x = SelectAndRemove(pending) marked = marked  {x} t = x  left if (t  NULL) if (t  marked) pending = pending  {t} /* t = x  right * if (t  NULL) * if (t  marked) * pending = pending  {t} */ } } assert(marked = = Reachset(root)) }

r[root](root)   p(root)  m(root)   e: r[root](e)  m(e)  root(e)  p(e)  r, e: ( root(r)  r[root]( r)   p(r)  m(r)  r[root]( e)   m(e))   root(e)   p(e))   left(r,e) x r[root] m root r[root] left right right left right Bug Found There may exist an individual that is reachable from the root, but not marked

Properties Proved ProgramProperties#GraphsSeconds LindstromScanCL, DI LindstromScanCL, DI, IS, TE SetRemoveCL, DI, SO SetInsertCL, DI, SO DeleteSortedTreeCL, DI DeleteSortedTreeCL, DI, SO InsertSortedTreeCL, DI InsertSortedTreeCL, DI, SO InsertAVLttreeCL, DI, SO RecQuickSotCL, DI, SO CL=memory safetyDI=data structure invariant TE=termination SO=sorted

Success Story: The SLAM/SDV Project MSR Tool for finding possible bugs in Windows device drivers Complicated back-out protocols in driver APIs when events cancelled or interrupted Prevent crashes in Windows [POPL’95] T. W. Reps, S. Horwitz, S. Sagiv: Precise Interprocedural Dataflow Analysis via Graph Reachability [PLDI’01] T. Ball, R. Majumdar, T. Millstein, S. Rajamani: Automatic Predicate Abstraction of C Programs [POPL’04] T. A. Henzinger, R. Jhala, R. Majumdar, K. L. McMillan: Abstractions from proofs " Things like even software verification, this has been the Holy Grail of computer science for many decades but now in some very key areas, for example, driver verification we’re building tools that can do actual proof about the software and how it works in order to guarantee the reliability." Bill Gates, April 18, Keynote address at WinHec 2002Keynote addressWinHec 2002

Success Story: Astrée Developed at ENS A tool for checking the absence of runtime errors in Airbus flight software [CC’00] R. Shaham, E.K. Kolodner, S. Sagiv: Automatic Removal of Array Memory Leaks in Java [WCRE’2001] A. Miné: The Octagon Abstract Domain [PLDI’03] B. Blanchet, P. Cousot, R. Cousot, J. Feret, L. Mauborgne, A. Miné, D. Monniaux, X. Rival: A static analyzer for large safety-critical software

Success: Panaya Making ERP easy Static analysis to detect the impact of a change for ERP professionals (slicing) Developed by N. Dor and Y. Cohen Acquired by Infosys [ISSTA’08] N. Dor, T. Lev-Ami, S. Litvak, M. Sagiv, D. Weiss: Customization change impact analysis for erp professionals via program slicing [FSE’10] S. Litvak, N. Dor, R. Bodík, N. Rinetzky, M. Sagiv: Field-sensitive program dependence analysi

Plan A bird’s eye view of (program) static analysis Abstract Interpretation Tentative schedule

Compiler Scheme String Scanner Parser Semantic Analysis Code Generator Static analysis Transformations Tokens AST LIR source-program tokens AST IR IR +information

Example Program Analyses u Live variables u Reaching definitions u Expressions that are ``available'' u Dead code u Pointer variables never point into the same location u Points in the program in which it is safe to free an object u An invocation of virtual method whose address is unique u Statements that can be executed in parallel u An access to a variable which must be in cache u Integer intervals u The termination problem

The Program Termination Problem u Determine if the program terminates on all possible inputs

Program Termination Simple Examples z := 3; while z > 0 do { if (x == 1) z := z +3; else z := z + 1; while z > 0 do { if (x == 1) z := z -1; else z := z -2;

Program Termination Complicated Example while (x !=1) do { if (x %2) == 0 { x := x / 2; } else { x := x * 3 + 1; } }

Summary Program Termination u Very hard in theory u Many programs terminate for simple reasons u But termination may involve proving intricate program invariants u Tools exist –MSR Terminator us/um/cambridge/projects/terminator/ –ARMC

The Need for Static Analysis u Compilers –Advanced computer architectures –High level programming languages (functional, OO, garbage collected, concurrent) u Software Productivity Tools –Compile time debugging »Stronger type Checking for C »Array bound violations »Identify dangling pointers »Generate test cases »Generate certification proofs u Program Understanding

Challenges in Static Analysis u Non-trivial u Correctness u Precision u Efficiency of the analysis u Scaling

C Compilers u The language was designed to reduce the need for optimizations and static analysis u The programmer has control over performance (order of evaluation, storage, registers) u C compilers nowadays spend most of the compilation time in static analysis u Sometimes C compilers have to work harder!

Software Quality Tools u Detecting hazards (lint) –Uninitialized variables a = malloc() ; b = a; cfree (a); c = malloc (); if (b == c) printf(“unexpected equality”); u References outside array bounds u Memory leaks (occurs even in Java!)

Foundation of Static Analysis u Static analysis can be viewed as interpreting the program over an “abstract domain” u Execute the program over larger set of execution paths u Guarantee sound results –Every identified constant is indeed a constant –But not every constant is identified as such

Example Abstract Interpretation Casting Out Nines u Check soundness of arithmetic using 9 values 0, 1, 2, 3, 4, 5, 6, 7, 8 u Whenever an intermediate result exceeds 8, replace by the sum of its digits (recursively) u Report an error if the values do not match u Example query “123 * = $?” –Left 123* = 6 * =6 + 7 = 4 –Right 3 –Report an error u Soundness (10a + b) mod 9 = (a + b) mod 9 (a+b) mod 9 = (a mod 9) + (b mod 9) (a*b) mod 9 = (a mod 9) * (b mod 9)

Even/Odd Abstract Interpretation u Determine if an integer variable is even or odd at a given program point

Example Program while (x !=1) do { if (x %2) == 0 { x := x / 2; } else { x := x * 3 + 1; assert (x %2 ==0); } } /* x=? */ /* x=E */ /* x=O */ /* x=? */ /* x=E */ /* x=O*/

  Abstract Abstract Interpretation Concrete  Sets of stores Descriptors of sets of stores 

Odd/Even Abstract Interpretation  {-2, 1, 5} {0,2} {2}{0}  EO ? All concrete states   {x: x  Even}

Odd/Even Abstract Interpretation  {-2, 1, 5} {0,2} {2}{0}  EO ?    All concrete states   {x: x  Even}

Odd/Even Abstract Interpretation  {-2, 1, 5} {0,2} {2}{0}  EO ?  All concrete states {x: x  Even}  

Example Program while (x !=1) do { if (x %2) == 0 { x := x / 2; } else { x := x * 3 + 1; assert (x %2 ==0); } } /* x=O *//* x=E */

(Best) Abstract Transformer Concrete Representation ConcretizationAbstraction Operational Semantics St Abstract Representation Abstract Semantics St

Concrete and Abstract Interpretation

Runtime vs. Static Testing RuntimeAbstract EffectivenessMissed ErrorsFalse alarms Locate rare errors CostProportional to program’s execution Proportional to program’s size No need to efficiently handle rare cases Can handle limited classes of programs and still be useful

Abstract (Conservative) interpretation abstract representation Set of states concretization Abstract semantics statement s abstract representation abstraction Operational semantics statement s Set of states

Example rule of signs u Safely identify the sign of variables at every program location u Abstract representation {P, N, ?} u Abstract (conservative) semantics of *

Abstract (conservative) interpretation {…,,…} concretization Abstract semantics x := x*#y abstraction Operational semantics x := x*y {…, …}

Example rule of signs (cont) u Safely identify the sign of variables at every program location u Abstract representation {P, N, ?} u  (C) = if all elements in C are positive then return P else if all elements in C are negative then return N else return ? u  (a) = if (a==P) then return{0, 1, 2, … } else if (a==N) return {-1, -2, -3, …, } else return Z

Example Constant Propagation u Abstract representation set of integer values and and extra value “?” denoting variables not known to be constants u Conservative interpretation of +

Example Constant Propagation(Cont) u Conservative interpretation of *

Example Program x = 5; y = 7; if (getc()) y = x + 2; z = x +y;

Example Program (2) if (getc()) x= 3 ; y = 2; else x =2; y = 3; z = x +y;

Undecidability Issues u It is undecidable if a program point is reachable in some execution u Some static analysis problems are undecidable even if the program conditions are ignored

The Constant Propagation Example while (getc()) { if (getc()) x_1 = x_1 + 1; if (getc()) x_2 = x_2 + 1;... if (getc()) x_n = x_n + 1; } y = truncate (1/ (1 + p 2 (x_1, x_2,..., x_n)) /* Is y=0 here? */

Coping with undecidabilty u Loop free programs u Simple static properties u Interactive solutions u Conservative estimations –Every enabled transformation cannot change the meaning of the code but some transformations are no enabled –Non optimal code –Every potential error is caught but some “false alarms” may be issued

Analogies with Numerical Analysis u Approximate the exact semantics u More precision can be obtained at greater u computational costs

Violation of soundness u Loop invariant code motion u Dead code elimination u Overflow ((x+y)+z) != (x + (y+z)) u Quality checking tools may decide to ignore certain kinds of errors

Abstract interpretation cannot be always homomorphic (rules of signs) abstraction abstraction Operational semantics x := x+y Abstract semantics x := x+#y

Local Soundness of Abstract Interpretation abstraction Operational semantics statement Abstract semantics statement# 

Optimality Criteria u Precise (with respect to a subset of the programs) u Precise under the assumption that all paths are executable (statically exact) u Relatively optimal with respect to the chosen abstract domain u Good enough

Complementary Techniques u Dynamic Analysis u Testing/Fuzzing u Bounded Model Checking u Deductive Verification u Proof Assistance (Coq)

Fuzzing [Miller 1990] Test programs on random unexpected data Can be realized using black/white testing Can be quite effective – Operating Systems – Networks … Usually implemented via instrumentation Tricky to scale for programs with many paths If (x == 10001) { …. if (f(*y) == *z) { …. int f(int *p) { if (p !=NULL) { return q ; }

Bounded Model Checking Program P Safety Q VC gen  P  (V 1, V 2 )   P  (V 2, V 3 )  …   P  (V k, V k+1 )   Q(V k+1 ) SAT Solver Counterexample Proof Bound k

Deductive Verification Program P Safety Q VC gen  P  (V, V’)   (V)   (V’)   (V)   Q(V) SAT Solver Counterexample Proof Candidate Inductive Invariant 

Origins of Abstract Interpretation u [Naur 1965] The Gier Algol compiler “A process which combines the operators and operands of the source text in the manner in which an actual evaluation would have to do it, but which operates on descriptions of the operands, not their value” u [Reynolds 1969] Interesting analysis which includes infinite domains (context free grammars) u [Syntzoff 1972] Well foudedness of programs and termination u [Cousot and Cousot 1976,77,79] The general theory u [Kamm and Ullman, Kildall 1977] Algorithmic foundations u [Tarjan 1981] Reductions to semi-ring problems u [Sharir and Pnueli 1981] Foundation of the interprocedural case u [Allen, Kennedy, Cock, Jones, Muchnick and Scwartz]

Tentative Schedule DateTopic 25/10Chaotic Iteration 1,8,15,22,29/11, 6/12Theory and practice of AI (4 assignments) 20,27/12, 3, 10/1ivy 17/1Project Selection

Summary u Static analysis is powerful u Precision and scalability is an issue u Static Analysis and Theorem Proving can be combined in many ways