Making TLA+ Model Checking Symbolic
Igor Konnov Joining Interchain Foundation in August
Jure Kukovec Thanh-Hai Tran VeriDis + Matryoushka seminar, Amsterdam, June 2019
Making TLA + Model Checking Symbolic Igor Konnov Joining Interchain - - PowerPoint PPT Presentation
Making TLA + Model Checking Symbolic Igor Konnov Joining Interchain Foundation in August Jure Kukovec Thanh-Hai Tran VeriDis + Matryoushka seminar, Amsterdam, June 2019 Why TLA + ? Rich specification language TLA + is used in industry, e.g.,
Jure Kukovec Thanh-Hai Tran VeriDis + Matryoushka seminar, Amsterdam, June 2019
several bugs found
Igor Konnov 3 of 46
Igor Konnov 4 of 46
github.com/konnov/apalache
QF_UFNIA
c∈S
Igor Konnov 6 of 46
github.com/konnov/apalache
QF_UFNIA
c∈S
Igor Konnov 6 of 46
Igor Konnov 8 of 46
✞ ☎ local myvali ∈ {0, 1}
while true do i f myvali = 1 and not sent ECHO before then send ECHO to all i f received ECHO from at least n-2t distinct processes and not sent ECHO before then send ECHO to all i f received ECHO from at least n - t distinct processes then accept
✝ ✆
Igor Konnov 9 of 46
Igor Konnov 10 of 46
EXTENDS Integers ,
FiniteSets N
△
= 12 T
△
= 3 F
△
= 3 Corr
△
= 1 . . (N − F − 1) Faulty
△
= (N − F) . . N
VARIABLES pc , rcvd , sent
Init
△
= ∧ pc ∈ [Corr → {“V0“, “V1“}] some processes receive the broadcast ∧ sent = {} no messages sent initially ∧ rcvd ∈ [Corr → {}] no messages received initially
Next
△
= ∃p ∈ Corr : ∧ Receive(p) ∧ ∨ UponV1(p) ∨ UponNonFaulty(p) ∨ UponAccept(p) ∨ UNCHANGED pc, sent Receive ( p )
△
= ∃newMessages ∈ SUBSET(sent ∪ Faulty) : rcvd′ = [rcvd EXCEPT ![self] = rcvd[p] ∪ newMessages]
UponV1( p )
△
= ∧ pc[p] = “V1” ∧ pc′ = [pc EXCEPT ![p] = “SE”] ∧ sent′ = sent ∪ {p} UponNonFaulty ( p )
△
= ∧ pc[p] ∈ {“V0”, “V1”} ∧ Cardinality(rcvd′[p]) >= N − 2 ∗ T ∧ pc′ = [pc EXCEPT ![p] = “SE”] ∧ sent′ = sent ∪ {p} UponAccept ( p )
△
= ∧ pc[p] ∈ {“V0”, “V1”, “SE”} ∧ Cardinality(rcvd′[p]) >= N − T ∧ pc′ = [pc EXCEPT ![p] = “AC”] ∧ sent′ = sent ∪ (IF pc[p] = “SE” THEN {p} ELSE {})
\* a non-inductive invariant Unforg
△
= ∀p ∈ Corr : pc[p] = “AC” \* restricted initial states InitNoBcast
△
= Init ∧ pc ∈ [Corr → {“V0”}]
Igor Konnov 18 of 46
TLA+ specification Flat TLA+ specification Assignments & symbolic transitions Types Reduction rules SMT (UF_NIA)
Igor Konnov 19 of 46
Next
△
= ∃p ∈ Corr : ∧ Receive(p) ∧ ∨ UponV1(p) ∨ UponNonFaulty(p) ∨ UponAccept(p) ∨ UNCHANGED pc, sent
∃p ∈ Corr : ∧ Receive(p) ∧ UponV1(p) ∃p ∈ Corr : ∧ Receive(p) ∧ UponAccept(p) ∃p ∈ Corr : ∧ Receive(p) ∧ UponNonFaulty(p) ∃p ∈ Corr : ∧ Receive(p) ∧ UNCHANGED pc, sent
Igor Konnov 21 of 46
Next
△
= ∃p ∈ Corr : ∧ Receive(p) ∧ ∨ UponV1(p) ∨ UponNonFaulty(p) ∨ UponAccept(p) ∨ UNCHANGED pc, sent
∃p ∈ Corr : ∧ Receive(p) ∧ UponV1(p) ∃p ∈ Corr : ∧ Receive(p) ∧ UponAccept(p) ∃p ∈ Corr : ∧ Receive(p) ∧ UponNonFaulty(p) ∃p ∈ Corr : ∧ Receive(p) ∧ UNCHANGED pc, sent
Igor Konnov 21 of 46
Igor Konnov 22 of 46
Igor Konnov 23 of 46
Igor Konnov 23 of 46
Igor Konnov 24 of 46
“a”, “hello”
FALSE, TRUE
Set[Set[Int]]
Int → Bool
Int × Bool × (Int → Int)
[“a” → Int, “b” → Bool]
Seq[Int]
Igor Konnov 25 of 46
Igor Konnov 26 of 46
Igor Konnov 27 of 46
△
state 0 state 1 state 2 . . . Init x → i0 A[i0/x] x′ → a1 A[c1/x] x′ → a2 B[i0/x] x′ → b1 B[c1/x] x′ → b2 . . . x′ ∈ {a1, b1} x′ → c1 x′ ∈ {a2, b2} x′ → c2
Igor Konnov 28 of 46
Igor Konnov 29 of 46
Igor Konnov 30 of 46
sort Int
sort Bool
Igor Konnov 32 of 46
Igor Konnov 33 of 46
Igor Konnov 34 of 46
Igor Konnov 35 of 46
Igor Konnov 36 of 46
Igor Konnov 38 of 46
Igor Konnov 39 of 46
Igor Konnov 40 of 46
APALACHE TLC
Igor Konnov 41 of 46
0h 0m 2h 3,75m 4h 7,5m 6h 11,25m 8h 15m
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
BMC: a=3, b=5, deadlocks BMC: a=3, b=5, VotingInv TLC: a=3, b=5, VotingInv TLC: a=3, b=5, deadlocks Igor Konnov 42 of 46
Igor Konnov 43 of 46
Igor Konnov 43 of 46
VARIABLE x
Init
△
= x = 0 Next
△
= x′ = 1 − x ∨ x′ = x Invariant
△
= x = 3
Igor Konnov 44 of 46
Igor Konnov 46 of 46