Pseudocode: Introduce pseudo-value analysis
This commit is contained in:
+6
-6
@@ -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:
|
||||
|
||||
+6
-6
@@ -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:
|
||||
|
||||
+8
-5
@@ -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:
|
||||
|
||||
+7
-7
@@ -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>]
|
||||
=====================
|
||||
|
||||
Reference in New Issue
Block a user