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

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

Embed Size (px)

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 .

Citation preview

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