abstract interpretation meets model checking near the 1000000 loc mark: finding errors in the linux...

23
Abstract Interpretation meets model checking near the 1000000 LOC mark - Finding errors in the Linux Kernel Source Peter T. Breuer & Simon Pickin Universidad Carlos III de Madrid

Upload: peter-breuer

Post on 10-Jun-2015

49 views

Category:

Technology


1 download

DESCRIPTION

Slides for presentation on "Abstract Interpretation meets model checking near the 1000000 LOC mark" at 5th International Workshop on Automated Verification of Infinite-State Systems (AVIS'06), Apr 1, 2006. A preprint of the full paper is available at http://www.academia.edu/2494187/Abstract_Interpretation_meets_Model_Checking_near_the_10_6_LOC_mark .

TRANSCRIPT

Page 1: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Abstract Interpretation meets model checking near the 1000000 LOC

mark- Finding errors in the Linux Kernel

Source

Peter T. Breuer & Simon PickinUniversidad Carlos III de Madrid

Page 2: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Goal•

ApplyFormal Methods

to theLinux kernel

Methods must be➢ post-hoc

➢ capable of application by non-experts

➢ able to handle 6.5 millions of lines of rapidly changing C code

Page 3: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Analysis Example -Sleep under Spinlock Hunt (SluSH)

Page 4: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Output from SluSH run

Page 5: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

What is sleep under spinlock?

• Sleep = thread scheduled out of CPU

• Spinlock = busy wait for lock release

• Two CPUs + two threads waiting on spinlocks= one dead machine

Page 6: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Example of bad code

• snd_sb_csp_load() in sb16_csp.c

Page 7: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Another piece of guilty code

• Kernel 2.6.12 sound/oss/sequencer.c midi_outc()

Page 8: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Cox owns up

Page 9: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Output summarises liklihoods

Page 10: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Other classes of problems detected

• Access (read/write) to kfreed memory

• Overflow 4096B of stack

• Spinlock under spinlock

• Call to function that expects non-NULL parameters with possibly NULL argument

• ...– Logic is configured, so new tests can be invented

Page 11: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Example of kfree/access

• drivers/scsi/aix7xxx_old.c in kernel 2.6.3

Page 12: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Basic technique

Page 13: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

The abstract view

Page 14: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Components of analysis system

• Description of statements as logic transformers– p .... p[n-1/n]

• Trigger/action system for raising alarms!

• Combining logic NRB

• Guiding abstract interpretation s to state x x ∈s ∩ p

stops dead code evaluation, etc.

Page 15: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Statement Logic - NRB

• Single code statement

– maintains condition P normally

– empty statement cannot return (F)

– empty statement cannot break (F)

Page 16: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Sequence logic -NRB• normal exit: traverse A then B

• return exit: return from A OR traverse A then return from B

• break exit: break from AOR traverse A then break from B

Page 17: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Loop logic -NRB

• break from body is only normal exit from while(1)

• relax p until it is invariant

Page 18: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Conditional logic -NRB

Page 19: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Programmable trigger/action engine

• Three rules handle propagation of call graph and other housekeeping.

– a sleep call while the objective function is positive causes output:

Page 20: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Using the analyser

• Call with the same arguments as given to the gcc compiler

Page 21: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Limitations

• Predicates are restricted to unions of n-cubes

• State is not followed well enough:– x = 1; if (x) A else B;

● treated correctly - only A is evaluated

– if (x) A else B; if (x) C else D;● over-abstracted - A;C | A;D | B;C | B;D

– possible solution is to push state into the predicates((x!=0);A | (x==0);B) ; ((x!=0);C | (x==0);D)

● but we can't follow calculation well - quickly get to

Page 22: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Implication of predicates is decidable

• Basic evaluation is C U Ci of cubes

– i.e. U Ci covers C

Page 23: Abstract Interpretation meets model checking near the 1000000 LOC mark: Finding errors in the Linux Kernel Source (AVIS '06)

Summary

• A step towards analyses of 100MLoC.– No expertise needed

– Fast

– Copes with massive amounts of code

– Soundly based

• Negatives– Not good tracking program state; model

checking?

– Not yet easy to extend to new problem classes