Static Contract Checking for Haskell - PowerPoint PPT Presentation

About This Presentation
Title:

Static Contract Checking for Haskell

Description:

Work done at University of Cambridge. Joint work with. Simon Peyton Jones ... Chalmers University of Technology. 2. Module UserPgm where. f :: [Int] - Int ... – PowerPoint PPT presentation

Number of Views:24
Avg rating:3.0/5.0
Slides: 55
Provided by: nx3
Category:

less

Transcript and Presenter's Notes

Title: Static Contract Checking for Haskell


1
Static Contract Checking for Haskell
  • Dana N. Xu
  • INRIA France
  • Work done at University of Cambridge
  • Joint work with

Simon Peyton Jones Microsoft Research Cambridge
Koen Claessen Chalmers University of Technology
2
Program Errors Give Headache!
  • Module UserPgm where
  • f Int -gt Int
  • f xs head xs max 0
  • f

Module Prelude where head a -gt a head
(xxs) x head error empty list
Glasgow Haskell Compiler (GHC) gives at
run-time Exception Prelude.head empty list
3
From Types to Contracts
  • head (xxs) x
  • head Int -gt Int
  • (head 1)
  • head 2 xs not (null xs) -gt r True
  • (head )

Type
not Bool -gt Bool not True False not False
True null a -gt Bool null True null
(xxs) False
Bug!
Contract (original Haskell boolean expression)
Bug!
4
What we want?
Haskell Program
Contract
Glasgow Haskell Compiler (GHC)
Where the bug is
Why it is a bug
5
Contract Checking
  • head 2 xs not (null xs) -gt r True
  • head (xxs) x
  • f xs head xs max 0
  • Warning f calls head
  • which may fail heads precondition!
  • f_ok xs if null xs then 0
  • else head xs max 0

No more warnings from the compiler!
6
Satisfying a Predicate Contract
Arbitrary boolean-valued Haskell expression
  • e 2 x p if (1) pe/x gives True and
  • (2) e is crash-free.

Recursive function, higher-order function,
partial function can be called!
7
Expressiveness of the Specification Language
data T T1 Bool T2 Int T3 T T sumT T -gt
Int sumT 2 x noT1 x -gt r True sumT (T2
a) a sumT (T3 t1 t2) sumT t1 sumT
t2 noT1 T -gt Bool noT1 (T1 _) False noT1
(T2 _) True noT1 (T3 t1 t2) noT1 t1 noT1
t2
8
Expressiveness of the Specification Language
  • sumT T -gt Int
  • sumT 2 x noT1 x -gt r True
  • sumT (T2 a) a
  • sumT (T3 t1 t2) sumT t1 sumT t2
  • rmT1 T -gt T
  • rmT1 2 x True -gt r noT1 r
  • rmT1 (T1 a) if a then T2 1 else T2 0
  • rmT1 (T2 a) T2 a
  • rmT1 (T3 t1 t2) T3 (rmT1 t1) (rmT1 t2)
  • For all crash-free tT, sumT (rmT1 t) will not
    crash.

9
Higher Order Functions
  • all (a -gt Bool) -gt a -gt Bool
  • all f True
  • all f (xxs) f x all f xs
  • filter (a -gt Bool) -gt a -gt a
  • filter 2 f True -gt xs True -gt r all f
    r
  • filter f
  • filter f (xxs) case (f x) of
  • True -gt x filter f xs
  • False -gt filter f xs

10
Contracts for Higher-order Functions Parameter
f1 (Int -gt Int) -gt Int f1 2 (x True -gt y
y gt 0) -gt r r gt 0 f1 g (g 1) - 1 f2
r True f2 f1 (\x -gt x 1)
Error f1s postcondition fails when (g 1)
gt 0 holds (g 1) 1 gt 0 does not
hold Error f2 calls f1 which fails f1s
precondition
FindlerFelleisenICFP02, BlumeMcAllesterICFP
04
11
Various Examples
  • zip a -gt b -gt (a,b)
  • zip 2 xs True -gt ys sameLen xs ys
  • -gt rs sameLen rs xs
  • sameLen True
  • sameLen (xxs) (yys) sameLen xs ys
  • sameLen _ _ False
  • f91 Int -gt Int
  • f91 2 n True -gt r (nlt100 r91)

    rn-10
  • f91 n case (n lt 100) of
  • True -gt f91 (f91 (n 11))
  • False -gt n 10

12
Sorting
(gt) True x x (gt) False x True
  • sorted True
  • sorted (x) True
  • sorted (xyxs) x lt y sorted (y xs)
  • insert Int -gt Int -gt Int
  • insert 2 i True -gt xs sorted xs -gt r
    sorted r
  • merge Int -gt Int -gt Int
  • merge 2 xs sorted xs-gtys sorted ys-gtr
    sorted r
  • bubbleHelper Int -gt (Int, Bool)
  • bubbleHelper 2 xs True
  • -gt r not (snd r) gt sorted (fst
    r)
  • insertsort, mergesort, bubblesort 2 xs True
  • -gt r sorted r

13
AVL Tree
() True x x () False x False
  • balanced AVL -gt Bool
  • balanced L True
  • balanced (N t u) balanced t balanced u
  • abs (depth t - depth u) lt 1
  • data AVL L N Int AVL AVL
  • insert, delete AVL -gt Int -gt AVL
  • insert 2 x balanced x -gt y True -gt
  • r notLeaf r balanced r
          0 lt depth r - depth x
          depth r - depth x lt 1
  • delete 2 x balanced x -gt y True -gt
  • r balanced r 0 lt depth x - depth
    r         depth x -
    depth r lt 1

14
Functions without Contracts
  • data T T1 Bool T2 Int T3 T T
  • noT1 T -gt Bool
  • noT1 (T1 _) False
  • noT1 (T2 _) True
  • noT1 (T3 t1 t2) noT1 t1 noT1 t2
  • () True x x
  • () False x False

No abstraction is more compact than the function
definition itself!
15
Lots of Questions
  • What does crash mean?
  • What is a contract?
  • What does it mean to satisfy a contract?
  • How can we verify that a function does satisfy a
    contract?
  • What if the contract itself diverges? Or crashes?
  • Its time to get precise...

16
What is the Language?
  • Programmer sees Haskell
  • Translated (by GHC) into Core language
  • Lambda calculus
  • Plus algebraic data types, and case expressions
  • BAD and UNR are (exceptional) values
  • Standard reduction semantics e1 ! e2

17
Two Exceptional Values
Real Haskell Program
  • BAD is an expression that crashes.
  • error String -gt a
  • error s BAD
  • head (xxs) x
  • head BAD
  • UNR (short for unreachable) is an expression
    that gets stuck. This is not a crash, although
    execution comes to a halt without delivering a
    result. (identifiable infinite loop)

div x y case y 0 of True -gt error divide
by zero False -gt x / y head (xxs) x
18
Crashing
  • Definition (Crash).
  • A closed term e crashes iff e ! BAD
  • Definition (Crash-free Expression)
  • An expression e is crash-free iff
  • 8 C. BAD 2s C, Ce (), Ce ! BAD
  • Non-termination is not a crash (i.e. partial
    correctness).

19
Crash-free Examples
Crash-free?
(1,BAD) NO
(1, True) YES
\x -gt x YES
\x -gt if x gt 0 then x else (BAD, x) NO
\x -gt if xx gt 0 then x 1 else BAD Hmm.. YES
Lemma For all closed e, e is syntactically
safe ) e is crash-free.
20
What is a Contract(related to FindlerICFP02,Blu
meICFP04,HinzeFLOPS06,FlanaganPOPL06)
t 2 Contract t x p Predicate Contract
xt1 ! t2 Dependent Function Contract
(t1, t2) Tuple Contract Any
Polymorphic Any Contract
Full version xx x gt0 -gt r r gt
x Short hand x x gt 0 -gt r r gt
x k(x x gt 0 -gt y y gt 0) -gt r r gt k
5
21
Questions on e 2 t
  • 3 2 x x gt 0
  • 5 2 x True
  • (True, 2) 2 x (snd x) gt 0 ?
  • (head , 3) 2 x (snd x) gt 0 ?
  • BAD 2 ?
  • ? 2 x False
  • ? 2 x BAD
  • \x-gt BAD 2 x False -gt r True ?
  • \x-gt BAD 2 x True -gt ?
  • \x-gt x 2 x True ?

22
What exactly does it mean to say that e
satisfies contract t? e 2 t
23
Contract Satisfaction(related to
FindlerICFP02,BlumeICFP04,HinzeFLOPS06)
Given e ? and c t ?, we define e 2 t as
follows
e 2 x p , e" or (e is crash-free and
pe/x!BAD,
False A1 e2 xt1! t2 , e" or
(e !x.e and A2 8
e1 2 t1. (e e1) 2 t2e1/x) e 2 (t1, t2) ,
e" or (e !(e1,e2) and A3
e1 2 t1 and e2 2
t2) e 2 Any , True
A4
e" means e diverges or e ! UNR
24
Only Crash-free Expression Satisfies a Predicate
Contract
e 2 x p , e" or (e is crash-free and
pe/x!BAD, False e2 xt1! t2 ,
e" or (e !x.e and 8 e1 2 t1. (e e1) 2
t2e1/x ) e 2 (t1, t2) ,
e" or (e !(e1,e2) and e1 2 t1 and e2 2 t2) e 2
Any , True
YES or NO?
(True, 2) 2 x (snd x) gt 0 YES
(head , 3) 2 x (snd x) gt 0 NO
\x-gt x 2 x True YES
\x-gt x 2 x loop YES
5 2 x BAD NO
loop 2 x False YES
loop 2 x BAD YES
25
All Expressions Satisfy Any
  • fst 2 (x True, Any) -gt r True
  • fst (a,b) a
  • g x fst (x, BAD)

Inlining may help, but breaks down when
function definition is big or recursive
YES or NO?
5 2 Any YES
BAD 2 Any YES
(head , 3) 2 (Any, x xgt 0) YES
\x -gt x 2 Any YES
BAD 2 Any -gt Any NO
BAD 2 (Any, Any) NO
26
All Contracts are Inhabited
e 2 x p , e" or (e is crash-free and
pe/x!BAD, False e2 xt1! t2 ,
e" or (e !x.e and 8 e1 2 t1. (e e1) 2
t2e1/x) e 2 (t1, t2) ,
e" or (e !(e1,e2) and e1 2 t1 and e2 2 t2) e 2
Any , True
YES or NO?
\x-gt BAD 2 Any -gt Any YES
\x-gt BAD 2 x True -gt Any YES
\x-gt BAD 2 x False -gt r True NO
BlumeMcAllesterJFP06 say YES
27
What to Check?
  • Does function f satisfy its contract t (written
    f2 t)?
  • At the definition of each function f,
  • Check f 2 t assuming all functions called in f
    satisfy their contracts.
  • Goal main 2 x True
  • (main is crash-free, hence the program cannot
    crash)

28
How to Check?
Part I
Define e 2 t
Grand Theorem e 2 t , e B t is crash-free
(related to BlumeMcAllesterJFP06)
Construct e B t (e ensures t)
Part II
Simplify (e B t)
some e
If e is syntactically safe, then Done!
29
What we cant do?
  • g1, g2 2 Ok -gt Ok
  • g1 x case (prime x gt square x) of
  • True -gt x
  • False -gt error urk
  • g2 xs ys
  • case (rev (xs ys) rev ys rev xs) of
  • True -gt xs
  • False -gt error urk

Crash!
Crash!
Hence, three possible outcomes (1) Definitely
Safe (no crash, but may loop) (2) Definite Bug
(definitely crashes) (3) Possible Bug
30
Wrappers B and C (B pronounced ensures C
pronounced requires)
  • e B x p case pe/x of
  • True -gt e
  • False -gt BAD
  • e B xt1 ! t2
  • ? v. (e (vC t1)) B t2vCt1/x
  • e B (t1, t2) case e of
  • (e1, e2) -gt (e1 B t1, e2 B t2)
  • e B Any UNR

related to FindlerICFP02,BlumeJFP06,HinzeFLOPS
06
31
Wrappers B and C (B pronounced ensures C
pronounced requires)
  • e C x p case pe/x of
  • True -gt e
  • False -gt UNR
  • e C xt1 ! t2
  • ? v. (e (v B t1)) C t2v B t1/x
  • e C (t1, t2) case e of
  • (e1, e2) -gt (e1 C t1, e2 C t2)
  • e C Any BAD

related to FindlerICFP02,BlumeJFP06,HinzeFLOPS
06
32
Example
head a -gt a head BAD head (xxs) x
head ? xs not (null xs) -gt Ok
head ?xs not (null xs) -gt Ok \v. head (v ?
xs not (null xs)) ? Ok
e ? Ok e
\v. head (v ? xs not (null xs)) \v.
head (case not (null v) of True -gt v False
-gt UNR)
33
\v. head (case not (null v) of True -gt
v False -gt UNR)
null a -gt Bool null True null
(xxs) False not Bool -gt Bool not True
False not False True
Now inline not and null
\v. head (case v of -gt UNR (pps) -gt
p)
Now inline head
\v. case v of -gt UNR (pps) -gt p
So head fails with UNR, not BAD, blaming the
caller
34
Higher-Order Function
f1 (Int -gt Int) -gt Int f1 2 (x True -gt y
y gt 0) -gt r r gt 0 f1 g (g 1) - 1 f2
r True f2 f1 (\x -gt x 1)
  • f1 B (x True -gt y y gt 0) -gt r r gt
    0
  • B C
    B
  • ? v1. case (v1 1) gt 0 of
  • True -gt case (v1 1) - 1 gt 0 of
  • True -gt (v1 1) -1
  • False -gt BAD
  • False -gt UNR

35
Grand Theorem e 2 t , e B t is crash-free
  • e B x p case pe/x of
  • True -gt e
  • False -gt BAD
  • loop 2x False
  • loop Bx False
  • case False of True -gt loop False -gt BAD
  • BAD, which is not crash-free
  • BAD 2 Ok -gt Any
  • BAD B Ok -gt Any
  • \v -gt ((BAD (v C Ok)) B Any
  • \v -gt UNR, which is crash-free

?
36
Grand Theorem e 2 t , e B t is crash-free
  • e B x p e seq case pe/x of
  • True -gt e
  • False -gt BAD
  • loop 2x False
  • loop Bx False
  • loop seq case False of
  • loop, which is crash-free
  • BAD 2 Ok -gt Any
  • BAD B Ok -gt Any
  • BAD seq \v -gt ((BAD (v C Ok)) B Any
  • BAD, which is not crash-free

e_1 seq e_2 case e_1 of DEFAULT -gt e_2
?
37
Contracts that Diverge
  • \x-gtBAD 2 x loop ? NO
  • But
  • \x-gtBAD B x loop
  • \x-gtBAD seq case loop of
  • True -gt \x -gt BAD
  • False -gt BAD

crash-free
e B x p e seq case fin pe/x of
True -gt e False -gt BAD
fin converts divergence to True
38
Contracts that Crash
Grand Theorem e 2 t , e B t is crash-free
  • much trickier
  • ()) does not hold, (() still holds
  • Open Problem
  • Suppose fin converts BAD to False
  • Not sure if Grand Theorem holds because
  • NO proof, and NO counter example either.

39
Well-formed Contracts
Grand Theorem e 2 t , e B t is crash-free
Well-formed t
t is Well-formed (WF) iff t x p and p is
crash-free or t xt1 ! t2 and t1 is WF and
8e12 t1, t2e1/x is WF or t (t1, t2) and both
t1 and t2 are WF or t Any
40
Properties of B and C
  • Key Lemma
  • For all closed, crash-free e, and closed t,
  • (e C t) 2 t
  • Projections (related to FindlerBlumeFLOPS06)
  • For all e and t, if e 2 t, then
  • e ¹ e B t
  • e C t ¹ e
  • Definition (Crashes-More-Often)
  • e1 ¹ e2 iff for all C, Cei () for
    i1,2 and
  • Ce2 ! BAD ) Ce1 !
    BAD

41
More Lemmas ?
  • Lemma Monotonicity of Satisfaction
  • If e1 2 t and e1 ¹ e2, then e22 t
  • Lemma Congruence of ¹
  • e1 ¹ e2 ) 8 C. Ce1 ¹ Ce2
  • Lemma Idempotence of Projection
  • 8 e, t. e B t B t e B t
  • 8 e, t. e C t C t eC t
  • Lemma A Projection Pair
  • 8 e, t. e B t C t ¹ e
  • Lemma A Closure Pair
  • 8 e, t. e ¹ eC t B t

42
How to Check?
Part I
Define e 2 t
Grand Theorem e 2 t , e B t is crash-free
(related to BlumeMcAllesterICFP04)
Construct e B t (e ensures t)
Part II
Simplify (e B t)
Normal form e
If e is syntactically safe, then Done!
43
Simplification Rules
44
Arithmetic via External Theorem Prover
  • goo B tgoo \i -gt
  • case (i8 gt i) of
  • False -gt BAD foo
  • True -gt

gtgtThmProver i8gti gtgtValid!
gtgtThmProver push(igtj) push(not (jlt0)) (igt0) gtgtVali
d!
case i gt j of True -gt case j lt 0 of False -gt
case i gt 0 of False -gt BAD f
45
Counter-Example Guided Unrolling
sumT T -gt Int sumT 2 x noT1 x -gt r
True sumT (T2 a) a sumT (T3 t1 t2) sumT t1
sumT t2
After simplifying (sumT B tsumT) , we may have
case (noT1 x) of True -gt case x of T1 a
-gt BAD T2 a -gt a T3 t1 t2 -gt
case (noT1 t1) of False -gt
BAD True -gt case (noT1 t2)
of False -gt BAD
True -gt sumT t1 sumT t2

46
Step 1Program Slicing Focus on the BAD Paths
case (noT1 x) of True -gt case x of T1 a
-gt BAD T3 t1 t2 -gt case (noT1 t1) of
False -gt BAD True
-gt case (noT1 t2) of
False -gt BAD
47
Step 2 Unrolling
case (case x of T1 a -gt False
T2 a -gt True T3 t1 t2 -gt noT1 t1
noT1 t2) of True -gt case x of T1 a -gt
BAD T3 t1 t2 -gt case (noT1 t1) of
False -gt BAD True -gt
case (noT1 t2) of
False -gt BAD
48
Counter-Example Guided Unrolling The Algorithm
49
Tracing (Achieve the same goal as Meunier,
Findler, FelleisenPOPL06
  • g 2 tg
  • g
  • f 2 tf
  • f g
  • f B tf g C tg

Inside g lc (g C tg)
case fin pe/x of True -gt e False -gt BAD f
  • (\g ! g ) B tg ! tf

50
Counter-Example Generation
f3 z 0 f3 (xxs) z case x gt z of
True -gt f2 x z False -gt ...
f1 2 xOk -gt x lt z -gt Ok f2 x z 1 f1 x z
  • f3 B Ok \xs -gt \z -gt
  • case xs of
  • -gt 0
  • (xy) -gt case x gt z of
  • True -gt Inside f2 ltl2gt
  • (Inside f1 ltl1gt (BAD f1))
  • False -gt
  • Warning ltl3gt f3 (xy) z where xgtz
  • calls f2
  • which calls f1
  • which may fail f1s precondition!

51
Conclusion
Haskell Program
Contract
Glasgow Haskell Compiler (GHC)
Where the bug is
Why it is a bug
52
Summary
  • Static contract checking is a fertile and
    under-researched area
  • Distinctive features of our approach
  • Full Haskell in contracts absolutely crucial
  • Declarative specification of satisfies
  • Nice theory (with some very tricky corners)
  • Static proofs
  • Modular Checking
  • Compiler as theorem prover

53
Contract Synonym
  • contract Ok x True
  • contract NonNull x not (null x)
  • head Int -gt Int
  • head 2 NonNull -gt Ok
  • head (xxs) x
  • - contract Ok x True -
  • - contract NonNull x not (null x) -
  • - contract head NonNull -gt Ok -

Actual Syntax
54
Recursion
  • f Bt
  • \f-gtf B t-gtt
  • ( (f C t)) B t
  • Suppose t t1 -gt t_2
  • f B t1 -gt t2
  • \f-gtf B(t1 -gt t2) -gt (t1 -gt t2)
  • ( (f C t1 -gt t2)) B t1 -gt t2
  • \v2.(((\v1.((f (v1 Bt1)) C t2)) (v2C t1) ) B
    t2)
Write a Comment
User Comments (0)
About PowerShow.com