extracting a data flow analyser in constructive logic
play

Extracting a Data Flow Analyser in Constructive Logic David - PowerPoint PPT Presentation

Extracting a Data Flow Analyser in Constructive Logic David Cachera, Thomas Jensen, David Pichardie and Vlad Rusu APPSEM04, Tallinn Static program analysis The goals of static program analysis To prove properties about the run-time


  1. Extracting a Data Flow Analyser in Constructive Logic David Cachera, Thomas Jensen, David Pichardie and Vlad Rusu APPSEM’04, Tallinn

  2. Static program analysis The goals of static program analysis ◮ To prove properties about the run-time behaviour of a program ◮ In a fully automatic way ◮ Without actually executing this program

  3. Static program analysis The goals of static program analysis ◮ To prove properties about the run-time behaviour of a program ◮ In a fully automatic way ◮ Without actually executing this program Solid foundations for designing an analyser ◮ Formalization and correctness proof by abstract interpretation ◮ Resolution of constraints on lattices by iteration and symbolic computation

  4. Formalization approximation domain programming language (lattice) + semantics correctness analysis specification proof

  5. Resolution program to analyze (in)equation generation abstract domains (in)equation system computable resolution informations about the run-time behaviour of the program

  6. So what’s the problem ?

  7. Formalization part � P c . Cousot

  8. Implementation part Formalization part int main(int argc, char **argv) { int i, j, t, parent_a, parent_b; int **swap, **newpop, **oldpop; double *fit, *normfit; get_options(argc, argv, options, help_string); srandom(seed); read_specs(specs); size += (size / 2 * 2 != size); newpop = xmalloc(sizeof(int *) * size); oldpop = xmalloc(sizeof(int *) * size); fit = xmalloc(sizeof(double) * size); normfit = xmalloc(sizeof(double) * size); for(i = 0; i < size; i++) { newpop[i] = xmalloc(sizeof(int) * len); oldpop[i] = xmalloc(sizeof(int) * len); for(j = 0; j < len * 2; j++) random_solution(oldpop[i]); } for(t = 0; t < gens; t++) { compute_fitness(oldpop, fit, normfit); dump_stats(t, oldpop, fit); for(i = 0; i < size; i += 2) { parent_a = select_one(normfit); parent_b = select_one(normfit); reproduce(oldpop, newpop, parent_a, parent_b, i); } swap = newpop; newpop = oldpop; oldpop = swap; } exit(0); } � P c . Cousot

  9. Implementation part Formalization part int main(int argc, char **argv) { int i, j, t, parent_a, parent_b; int **swap, **newpop, **oldpop; double *fit, *normfit; get_options(argc, argv, options, help_string); srandom(seed); read_specs(specs); size += (size / 2 * 2 != size); newpop = xmalloc(sizeof(int *) * size); oldpop = xmalloc(sizeof(int *) * size); Do both parts talk about the same ? fit = xmalloc(sizeof(double) * size); normfit = xmalloc(sizeof(double) * size); for(i = 0; i < size; i++) { newpop[i] = xmalloc(sizeof(int) * len); oldpop[i] = xmalloc(sizeof(int) * len); for(j = 0; j < len * 2; j++) random_solution(oldpop[i]); } for(t = 0; t < gens; t++) { compute_fitness(oldpop, fit, normfit); dump_stats(t, oldpop, fit); for(i = 0; i < size; i += 2) { parent_a = select_one(normfit); parent_b = select_one(normfit); reproduce(oldpop, newpop, parent_a, parent_b, i); } swap = newpop; newpop = oldpop; oldpop = swap; } exit(0); } � P c . Cousot

  10. Static Analysis for real-life languages Example of real-life language : bytecode JavaCard ◮ 180 instructions ◮ Real need of static analysis to verify properties about security, memory management, ... For this kind of languages, ◮ Abstract domains can be complex ◮ Correctness proofs become long and tiresome ◮ Implementation and maintenance of the analyser become a software engineering task

  11. In this work We propose a technique based on the Coq proof assistant ◮ To specify a static analysis, ◮ To prove its correctness wrt. the semantics of the language, ◮ To extract a static analyser from the proof of existence of a correct program analysis result Program-as-proofs paradigm: Write a function f which ⇒ Make a constructive proof verifies a specification P ⇐ of ∀ x , ∃ y , P ( x , y ) ∀ x , P ( x , f ( x ))

  12. Outline ◮ Motivation ◮ A Static Analysis for Carmel ◮ Building a certified static analyser ◮ Conclusion

  13. Outline ◮ Motivation ◮ A Static Analysis for Carmel ◮ Building a certified static analyser ◮ Conclusion

  14. Case study : a static analysis for Carmel e Rydhof Hansen 1 We follow the analysis proposed by Ren´ ◮ Carmel : an intermediate representation of Java Card byte code ◮ Construction of a certified data flow analyser for Carmel 1 Ren´ e Rydhof Hansen. Flow Logic for Carmel. SECSAFE-IMM-001, 2002

  15. Syntax of Carmel Instruction ::= nop  push c   stack manipulation pop numop op � load x local variables manipulation store x � if pc jump goto pc  new cl  putfield f  heap manipulation getfield f � invokevirtual m id method call and return return

  16. Semantic domains Val ::= num n n ∈ N ref r r ∈ Reference null Val ∗ Stack = LocalVar = Var → Val Frame = PointProg × NameMethod × LocalVar × Stack Frame ∗ CallStack = Object = FieldName → Val Heap = Reference → Object ⊥ State = Heap × CallStack Example : ( H , � m , pc , L , v :: S � :: SF )

  17. Dynamic semantics Operational semantics with rules like instructionAt P ( m , pc ) = push c ( H , � m , pc , L , S � :: SF ) ⇒ ( H , � m , pc + 1 , L , c :: S � :: SF ) instructionAt P ( m , pc ) = invokevirtual m id m ′ = methodLookup ( m id , h ( loc )) f ′ � m ′ , 1 , V , ε � = f ′′ = � m , pc , l , s � ( h , � m , pc , l , loc :: V :: s � :: sf ) ⇒ ( h , f ′ :: f ′′ :: sf )

  18. A Static Analysis for Carmel � � H , ˆ ˆ L , ˆ We want to calculate an approximation S on the domain � � � State = � � × NameMethod × PointProg → Heap LocalVar � � NameMethod × PointProg → � × Stack ◮ An approximation for all reachable heaps ◮ For each program points, an approximation of the operand stack and the local variables ◮ An object is abstracted to its class ◮ Numeric values are abstracted using Killdall’s Constant Propagation domain

  19. Analysis specification � � H , ˆ ˆ L , ˆ Each instruction impose constraints on S . Example 0 : push 1 1 : push 2 2 : store 0 3 : load 0 4 : numop mult 5 : goto 1

  20. Analysis specification � � H , ˆ ˆ L , ˆ Each instruction impose constraints on S . Example nil ⊑ ˆ b ⊤ ⊑ ˆ S ( m , 0 ) L ( m , 0 ) 0 : push 1 1 : push 2 2 : store 0 3 : load 0 4 : numop mult 5 : goto 1

  21. Analysis specification � � H , ˆ ˆ L , ˆ Each instruction impose constraints on S . Example nil ⊑ ˆ b ⊤ ⊑ ˆ S ( m , 0 ) L ( m , 0 ) 0 : push 1 � push (ˆ 1 , ˆ S ( m , 0 )) ⊑ ˆ ˆ L ( m , 0 ) ⊑ ˆ S ( m , 1 ) L ( m , 1 ) 1 : push 2 2 : store 0 3 : load 0 4 : numop mult 5 : goto 1

  22. Analysis specification � � H , ˆ ˆ L , ˆ Each instruction impose constraints on S . Example nil ⊑ ˆ b ⊤ ⊑ ˆ S ( m , 0 ) L ( m , 0 ) 0 : push 1 � push (ˆ 1 , ˆ S ( m , 0 )) ⊑ ˆ ˆ L ( m , 0 ) ⊑ ˆ S ( m , 1 ) L ( m , 1 ) 1 : push 2 � push (ˆ 2 , ˆ S ( m , 1 )) ⊑ ˆ ˆ L ( m , 1 ) ⊑ ˆ S ( m , 2 ) L ( m , 2 ) 2 : store 0 pop (ˆ S ( m , 2 )) ⊑ ˆ L ( m , 2 )[ 0 �→ c ˆ top (ˆ S ( m , 2 ))] ⊑ ˆ d S ( m , 3 ) L ( m , 3 ) 3 : load 0 � push (ˆ L ( m , 3 )[ 0 ] , ˆ S ( m , 3 )) ⊑ ˆ L ( m , 3 ) ⊑ ˆ ˆ S ( m , 4 ) L ( m , 4 ) 4 : numop mult ˆ L ( m , 4 ) ⊑ ˆ L ( m , 5 ) . . . 5 : goto 1 S ( m , 5 ) ⊑ ˆ ˆ ˆ L ( m , 5 ) ⊑ ˆ S ( m , 1 ) L ( m , 1 )

  23. Analysis solution The smallest value which verifies all constraints. Example b nil [ 0 �→ ⊤ ; 1 �→ ⊤ ] 0 : push 1 < ˆ [ 0 �→ ˆ 2 > 1 ; 1 �→ ⊤ ] 1 : push 2 < ˆ 1 :: ˆ [ 0 �→ ˆ 1 ; 1 �→ ⊤ ] 2 > 2 : store 0 < ˆ [ 0 �→ ˆ 2 > 1 ; 1 �→ ⊤ ] 3 : load 0 < ˆ 1 :: ˆ [ 0 �→ ˆ 2 > 1 ; 1 �→ ⊤ ] 4 : numop mult < ˆ [ 0 �→ ˆ 2 > 1 ; 1 �→ ⊤ ] 5 : goto 1 ⊥ ⊥

  24. Outline ◮ Motivation ◮ A Static Analysis for Carmel ◮ Building a certified static analyser ◮ Conclusion

  25. Building a certified static analyser ◮ A puzzle with 8 pieces, ◮ Each piece interacts with its neighbors

  26. Building a certified static analyser semantic domains ◮ Each semantic domain is modeled with a type ◮ Following exactly the definitions already seen in a previous slide

  27. Building a certified static analyser semantic abstract domains domains ◮ Each semantic domain is in relation with an abstract domain ◮ an abstract domain is a lattice (formalization of lattices in Coq to follow...)

  28. Building a certified static analyser semantic correctness abstract domains relations domains ◮ A relation ∼ between State and � State ◮ s ∼ � Σ interprets as “ � Σ is a correct approximation of s ” ◮ ∼ must be monotone : Σ 2 ∈ � ∀ s ∈ State , ∀ � Σ 1 , � State , if s ∼ � Σ 1 and � Σ 1 ⊑ � Σ 2 then s ∼ � Σ 2

  29. Building a certified static analyser semantic correctness abstract domains relations domains semantic rules ◮ The transition relation · ⇒ · is defined using Coq inductive types ◮ Collecting semantics : ] = { s | ∃ s 0 an initial state , with s 0 ⇒ ∗ s } [ [ P ] We want to compute a correct approximation of [ [ P ] ]

  30. Building a certified static analyser semantic correctness abstract domains relations domains analysis semantic specification rules ◮ we define a predicate P ⊢ � Σ which imposes a set of constraints on an abstract state � Σ

Recommend


More recommend