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
@@ -18,16 +18,16 @@ class AnonymousInitializers() {
L0:
1 <START>
v(val k = 34)
r(34)
w(k)
r(34) -> <v0>
w(k|<v0>)
v(val i: Int)
2 mark({ $i = 12 })
r(12)
w($i)
r(12) -> <v1>
w($i|<v1>)
1 v(val j: Int get() = 20)
2 mark({ $i = 13 })
r(13)
w($i)
r(13) -> <v2>
w($i|<v2>)
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -7,16 +7,16 @@ L0:
1 <START>
2 mark({ {} })
mark({})
jmp?(L2) NEXT:[r({}), d({})]
d({}) NEXT:[<SINK>]
jmp?(L2) NEXT:[r({}) -> <v0>, d({})]
d({}) NEXT:[<SINK>]
L2:
r({}) PREV:[jmp?(L2)]
r({}) -> <v0> PREV:[jmp?(L2)]
L1:
1 <END> NEXT:[<SINK>]
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>, d({})]
<SINK> PREV:[<ERROR>, <END>, d({})]
=====================
== anonymous_0 ==
{}
@@ -9,12 +9,12 @@ L0:
mark(throw java.lang.RuntimeException())
mark(java.lang.RuntimeException())
mark(RuntimeException())
call(RuntimeException, <init>)
throw (throw java.lang.RuntimeException()) NEXT:[<ERROR>]
call(RuntimeException, <init>) -> <v0>
throw (throw java.lang.RuntimeException()|<v0>) NEXT:[<ERROR>]
L1:
1 <END> NEXT:[<SINK>] PREV:[]
1 <END> NEXT:[<SINK>] PREV:[]
error:
<ERROR> PREV:[throw (throw java.lang.RuntimeException())]
<ERROR> PREV:[throw (throw java.lang.RuntimeException()|<v0>)]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
@@ -7,6 +7,7 @@ L0:
1 <START>
2 mark({ T })
error(T, No resolved call)
magic(T) -> <v0>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -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:
@@ -18,26 +18,26 @@ fun component1() = 1
---------------------
L0:
1 <START>
r(1)
r(1) -> <v0>
L1:
<END> NEXT:[<SINK>]
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== component2 ==
fun component2() = 2
---------------------
L0:
1 <START>
r(2)
r(2) -> <v0>
L1:
<END> NEXT:[<SINK>]
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== test ==
fun test(c: C) {
@@ -48,18 +48,19 @@ fun test(c: C) {
L0:
1 <START>
v(c: C)
w(c)
magic(c: C) -> <v0>
w(c|<v0>)
2 mark({ val (a, b) = c val d = 1 })
r(c)
r(c) -> <v1>
v(a)
call(a, component1)
w(a)
call(a, component1|<v1>) -> <v2>
w(a|<v2>)
v(b)
call(b, component2)
w(b)
call(b, component2|<v1>) -> <v3>
w(b|<v3>)
v(val d = 1)
r(1)
w(d)
r(1) -> <v4>
w(d|<v4>)
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -7,14 +7,17 @@ fun foo(x: Int) {
L0:
1 <START>
v(x: Int)
w(x)
magic(x: Int) -> <v0>
w(x|<v0>)
2 mark({ val (a, b) = x a })
r(x)
r(x) -> <v1>
v(a)
w(a)
magic(a|<v1>) -> <v2>
w(a|<v2>)
v(b)
w(b)
r(a)
magic(b|<v1>) -> <v3>
w(b|<v3>)
r(a) -> <v4>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -18,16 +18,18 @@ fun get(_this: Any, p: PropertyMetadata): Int = 0
L0:
1 <START>
v(_this: Any)
w(_this)
magic(_this: Any) -> <v0>
w(_this|<v0>)
v(p: PropertyMetadata)
w(p)
r(0)
magic(p: PropertyMetadata) -> <v1>
w(p|<v1>)
r(0) -> <v2>
L1:
<END> NEXT:[<SINK>]
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== a ==
val a = Delegate()
@@ -36,14 +38,14 @@ L0:
1 <START>
v(val a = Delegate())
mark(Delegate())
call(Delegate, <init>)
w(a)
call(Delegate, <init>) -> <v0>
w(a|<v0>)
L1:
<END> NEXT:[<SINK>]
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== b ==
val b by a
@@ -51,7 +53,7 @@ val b by a
L0:
1 <START>
v(val b by a)
r(a)
r(a) -> <v0>
L1:
<END> NEXT:[<SINK>]
error:
@@ -12,7 +12,7 @@ L0:
1 <START>
v(val a: Int get() = 1)
2 mark({ $a })
r($a)
r($a) -> <v0>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -21,15 +21,15 @@ L0:
1 <START>
mark("foo" + this.$bar)
mark("foo")
r("foo")
r("foo") -> <v0>
mark(this.$bar)
r(this)
r($bar)
call(+, plus)
r(this) -> <v1>
r($bar|<v1>) -> <v2>
call(+, plus|<v0>, <v2>) -> <v3>
L1:
<END> NEXT:[<SINK>]
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================