Horn Binary Serialization Analysis
Gabriele Paganelli https://gapag.noblogs.org/ gapag@distruzione.org HCVS 2016 3rd Workshop
- n Horn Clauses
for Verification and Synthesis
Horn Binary Serialization Analysis HCVS 2016 3rd Workshop on - - PowerPoint PPT Presentation
Horn Binary Serialization Analysis HCVS 2016 3rd Workshop on Horn Clauses for Verification and Synthesis Gabriele Paganelli https://gapag.noblogs.org/ gapag@distruzione.org Length Type Data CRC 0 3 4 7 8 N N+1 N+4 Type
Gabriele Paganelli https://gapag.noblogs.org/ gapag@distruzione.org HCVS 2016 3rd Workshop
for Verification and Synthesis
Cat.png Length Type Data CRC 3 4 7 8 N N+1 N+4 Type Data Length CRC 3 4 N N+1 N+4 N+5 N+8
Is there a parser that can parse any instance stream? Or: is the layout deserializable? In practice: describe a left-to-right parser behaviour using Horn clauses and forward chaining
Length Type Data CRC 3 4 7 8 N N+1 N+4
Length Type Data CRC 3 4 7 8 N N+1 N+4
span
Length Type Data CRC 3 4 7 8 N N+1 N+4
0 f1 v2 f3
Length Type Data CRC 3 4 7 8 N N+1 N+4
0 f1 v2 f3
Length Type Data CRC 3 4 7 8 N N+1 N+4 Beg(0) Len(0) Beg(1) Val(0) forward backward
∧ (i) ∧ Beg(o)
∧ (i) ∧ Beg(o+s)
Length Type Data CRC 3 4 7 8 N N+1 N+4 Ptr(0,4,0) Val(0) Beg(0) Beg(4) Jump right Jump left
Length Type Data CRC 3 4 7 8 N N+1 N+4 Beg(1) Len(1) Beg(4) Len(3) Beg(2) Val(1) forward backward
Length Type Data CRC 3 4 7 8 N N+1 N+4 Beg(1) Len(1) Beg(4) Len(3) Beg(2) Val(1) Beg(3) Val(3) forward backward
Length Type Data CRC 3 4 7 8 N N+1 N+4 Beg(1) Len(1) Beg(4) Len(3) Beg(2) Val(1) Beg(3) Val(3) backward forward
Beg(3) Length Type Data CRC 3 4 7 8 N N+1 N+4 Beg(2) Len(2) join
Beg(3) Length Type Data CRC 3 4 7 8 N N+1 N+4 Beg(2) Len(2) join
Yes: Layout is deserializable No: Layout is not deserializable.
(Length 4)Length f v f → Yes (Length 4)Length →
0 f1 v2 f3
Axioms ∀ i ⇒ len(i) ?
– for every vi – There is a (foo → s)p , xfooq
– e.g. : f v f – (Length 4) Length
→
0 f1 v2 f3
– But: (Foo 4)Foo v v v
→
0[fBar v f]*1
– Referencing into an inner scope.
Pointers cannot
(Bar 2) →
0[fBar v f fBar v f fBar v f fBar v f
fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f
0 f1 [f2.0 v2.1 f2.2 ]*2
Beg(b.a) Beg(b.a+1) ∧
join Jump right
0 f1 [f2.0 v2.1 f2.2 ]*2
(Foo 2)Foo →
0 f1 [f2.0 v2.1 f2.2 ]*2
Forward Forward Jump right
(Foo 2)Foo →
0 f1 [f2.0 v2.1 f2.2 ]*2
join forward backward
(Foo 2)Foo →
0 f1 [f2.0 v2.1 f2.2 f2.3 v2.4 f2.5 ]*2
Forward Forward Jump forward
(Foo 2)Foo →
0 f1 [f2.0 v2.1 f2.2 ]*2
(Foo 2)Foo →
0 f1 [f2.0 v2.1 f2.2 f2.3 v2.4 f2.5 ]*2
forward backward
(Foo 2)Foo →
0 f1 [f2.0 v2.1 f2.2 ]*2
(Foo 2)Foo →
0 f1 [f2.0 v2.1 f2.2 f2.3 v2.4 f2.5]*2
(Foo 2)Foo →
0 f1 [f2.0 v2.1 f2.2 ]*2
(A 2)A →
0 f1 [f2.0
f2.2 f2.3 [D 1)D v]* →
2.4 f2.5]*2
Axioms are left undisturbed.
[(B 1)B v (C 1)C v]* → →
2.1
(A 2)A →
0 f1 [f2.0
F
m a l l y g u a r a n t e e d : I f L 2 i s d e s e r i a l i z a b l e , T h e n L i s d e s e r i a l i z a b l e L2 L
[(B 1)B, v]* →
2.1
f2.2]*2 If L2 is (not) deserializable Then all LN>2 are (not) deserializable
(Length 4)Length [f v]* f → NO (Length 4)Length →
0 [f2.0 v2.1 f2.2 v2.3]*2 f3
Axioms ∀ i ⇒ len(i) ? ∀ Rep(i,j) ⇒ RepLen(i) ? (Length 4)Length [f v →
f v]* f
– Rule-based parser generation? – Associate to each proof of deserializability a
– Erlang, haskell, c... – Pads – Protocol buffers, avro, cap'n'proto, bson...
– Necessary condition for deserializability – Doubling repetitions
Gabriele Paganelli https://github.com/gapag/horn-binary-deserialization https://gapag.noblogs.org/ gapag@distruzione.org