Pseudocode: Introduce pseudo-value analysis

This commit is contained in:
Alexey Sedunov
2014-05-12 17:42:44 +04:00
parent 3ce96671d9
commit d2c055e9da
103 changed files with 2417 additions and 1432 deletions
@@ -20,8 +20,8 @@ class C() {
L0:
1 <START>
v(val a: Int = 1)
r(1)
w(a)
r(1) -> <v0>
w(a|<v0>)
L1:
<END> NEXT:[<SINK>]
error:
@@ -35,15 +35,16 @@ fun doSmth(i: Int) {}
L0:
1 <START>
v(i: Int)
w(i)
magic(i: Int) -> <v0>
w(i|<v0>)
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== test1 ==
fun test1() {
@@ -62,10 +63,10 @@ L0:
mark(object { val x : Int { $x = 1 } })
v(val x : Int)
3 mark({ $x = 1 })
r(1)
w($x)
2 r(object { val x : Int { $x = 1 } })
w(a)
r(1) -> <v0>
w($x|<v0>)
2 r(object { val x : Int { $x = 1 } }) -> <v1>
w(a|<v1>)
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -85,8 +86,8 @@ L0:
1 <START>
v(val x : Int)
2 mark({ $x = 1 })
r(1)
w($x)
r(1) -> <v0>
w($x|<v0>)
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -106,15 +107,15 @@ L0:
1 <START>
2 mark({ val b = 1 val a = object { val x = b } })
v(val b = 1)
r(1)
w(b)
r(1) -> <v0>
w(b|<v0>)
v(val a = object { val x = b })
mark(object { val x = b })
v(val x = b)
r(b)
w(x)
r(object { val x = b })
w(a)
r(b) -> <v1>
w(x|<v1>)
r(object { val x = b }) -> <v2>
w(a|<v2>)
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -138,11 +139,11 @@ L0:
v(val a = object { val y : Int fun inner_bar() { y = 10 } })
mark(object { val y : Int fun inner_bar() { y = 10 } })
v(val y : Int)
jmp?(L2) NEXT:[r(object { val y : Int fun inner_bar() { y = 10 } }), d(fun inner_bar() { y = 10 })]
jmp?(L2) NEXT:[r(object { val y : Int fun inner_bar() { y = 10 } }) -> <v0>, d(fun inner_bar() { y = 10 })]
d(fun inner_bar() { y = 10 }) NEXT:[<SINK>]
L2:
r(object { val y : Int fun inner_bar() { y = 10 } }) PREV:[jmp?(L2)]
w(a)
r(object { val y : Int fun inner_bar() { y = 10 } }) -> <v0> PREV:[jmp?(L2)]
w(a|<v0>)
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -158,8 +159,8 @@ fun inner_bar() {
L3:
3 <START>
4 mark({ y = 10 })
r(10)
w(y)
r(10) -> <v0>
w(y|<v0>)
L4:
3 <END> NEXT:[<SINK>]
error:
@@ -189,13 +190,13 @@ L0:
v(val x : Int)
v(val y : Int)
3 mark({ $x = 1 })
r(1)
w($x)
2 jmp?(L2) NEXT:[r(object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } }), d(fun ggg() { y = 10 })]
r(1) -> <v0>
w($x|<v0>)
2 jmp?(L2) NEXT:[r(object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } }) -> <v1>, d(fun ggg() { y = 10 })]
d(fun ggg() { y = 10 }) NEXT:[<SINK>]
L2:
r(object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } }) PREV:[jmp?(L2)]
w(a)
r(object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } }) -> <v1> PREV:[jmp?(L2)]
w(a|<v1>)
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -211,8 +212,8 @@ fun ggg() {
L3:
3 <START>
4 mark({ y = 10 })
r(10)
w(y)
r(10) -> <v0>
w(y|<v0>)
L4:
3 <END> NEXT:[<SINK>]
error:
@@ -242,19 +243,19 @@ L0:
v(val a = object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } })
mark(object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } })
v(var x = 1)
r(1)
w(x)
r(1) -> <v0>
w(x|<v0>)
3 mark({ $x = 2 })
r(2)
w($x)
r(2) -> <v1>
w($x|<v1>)
2 jmp?(L2) NEXT:[jmp?(L5), d(fun foo() { x = 3 })]
d(fun foo() { x = 3 }) NEXT:[<SINK>]
L2:
jmp?(L5) NEXT:[r(object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } }), d(fun bar() { x = 4 })] PREV:[jmp?(L2)]
jmp?(L5) NEXT:[r(object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } }) -> <v2>, d(fun bar() { x = 4 })] PREV:[jmp?(L2)]
d(fun bar() { x = 4 }) NEXT:[<SINK>]
L5:
r(object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } }) PREV:[jmp?(L5)]
w(a)
r(object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } }) -> <v2> PREV:[jmp?(L5)]
w(a|<v2>)
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -270,8 +271,8 @@ fun foo() {
L3:
3 <START>
4 mark({ x = 3 })
r(3)
w(x)
r(3) -> <v0>
w(x|<v0>)
L4:
3 <END> NEXT:[<SINK>]
error:
@@ -287,8 +288,8 @@ fun bar() {
L6:
3 <START>
4 mark({ x = 4 })
r(4)
w(x)
r(4) -> <v0>
w(x|<v0>)
L7:
3 <END> NEXT:[<SINK>]
error:
@@ -44,13 +44,13 @@ override fun foo() = 10
---------------------
L0:
1 <START>
r(10)
r(10) -> <v0>
L1:
<END> NEXT:[<SINK>]
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo(b: B) : Int {
@@ -61,18 +61,19 @@ fun foo(b: B) : Int {
L0:
1 <START>
v(b: B)
w(b)
magic(b: B) -> <v0>
w(b|<v0>)
2 mark({ val o = object : A by b {} return o.foo() })
v(val o = object : A by b {})
mark(object : A by b {})
r(b)
r(object : A by b {})
w(o)
r(b) -> <v1>
r(object : A by b {}) -> <v2>
w(o|<v2>)
mark(o.foo())
mark(foo())
r(o)
call(foo, foo)
ret(*) L1
r(o) -> <v3>
call(foo, foo|<v3>) -> <v4>
ret(*|<v4>) L1
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -38,8 +38,8 @@ L3:
4 mark({ val x = "" fun loc() { val x3 = "" } })
v(val x = "")
mark("")
r("")
w(x)
r("") -> <v0>
w(x|<v0>)
jmp?(L5) NEXT:[<END>, d(fun loc() { val x3 = "" })]
d(fun loc() { val x3 = "" }) NEXT:[<SINK>]
L4:
@@ -60,8 +60,8 @@ L6:
6 mark({ val x3 = "" })
v(val x3 = "")
mark("")
r("")
w(x3)
r("") -> <v0>
w(x3|<v0>)
L7:
5 <END> NEXT:[<SINK>]
error:
@@ -33,8 +33,8 @@ L3:
3 <START>
4 mark({ val b: Int return b })
v(val b: Int)
r(b)
ret(*) L4
r(b) -> <v0>
ret(*|<v0>) L4
L4:
3 <END> NEXT:[<SINK>]
error: