Pseudocode: Introduce pseudo-value analysis
This commit is contained in:
@@ -20,50 +20,51 @@ fun f(a : Boolean) : Unit {
|
||||
L0:
|
||||
1 <START>
|
||||
v(a : Boolean)
|
||||
w(a)
|
||||
magic(a : Boolean) -> <v0>
|
||||
w(a|<v0>)
|
||||
2 mark({ 1 a 2.toLong() foo(a, 3) genfun<Any>() flfun {1} 3.equals(4) 3 equals 4 1 + 2 a && true a || false })
|
||||
r(1)
|
||||
r(a)
|
||||
r(1) -> <v1>
|
||||
r(a) -> <v2>
|
||||
mark(2.toLong())
|
||||
mark(toLong())
|
||||
r(2)
|
||||
call(toLong, toLong)
|
||||
r(2) -> <v3>
|
||||
call(toLong, toLong|<v3>) -> <v4>
|
||||
mark(foo(a, 3))
|
||||
r(a)
|
||||
r(3)
|
||||
call(foo, foo)
|
||||
r(a) -> <v5>
|
||||
r(3) -> <v6>
|
||||
call(foo, foo|<v5>, <v6>) -> <v7>
|
||||
mark(genfun<Any>())
|
||||
call(genfun, genfun)
|
||||
call(genfun, genfun) -> <v8>
|
||||
mark(flfun {1})
|
||||
mark({1})
|
||||
jmp?(L2) NEXT:[r({1}), d({1})]
|
||||
jmp?(L2) NEXT:[r({1}) -> <v9>, d({1})]
|
||||
d({1}) NEXT:[<SINK>]
|
||||
L2:
|
||||
r({1}) PREV:[jmp?(L2)]
|
||||
call(flfun, flfun)
|
||||
r({1}) -> <v9> PREV:[jmp?(L2)]
|
||||
call(flfun, flfun|<v9>) -> <v10>
|
||||
mark(3.equals(4))
|
||||
mark(equals(4))
|
||||
r(3)
|
||||
r(4)
|
||||
call(equals, equals)
|
||||
r(3) -> <v11>
|
||||
r(4) -> <v12>
|
||||
call(equals, equals|<v11>, <v12>) -> <v13>
|
||||
mark(3 equals 4)
|
||||
r(3)
|
||||
r(4)
|
||||
call(equals, equals)
|
||||
r(3) -> <v14>
|
||||
r(4) -> <v15>
|
||||
call(equals, equals|<v14>, <v15>) -> <v16>
|
||||
mark(1 + 2)
|
||||
r(1)
|
||||
r(2)
|
||||
call(+, plus)
|
||||
r(a)
|
||||
jf(L5) NEXT:[r(a && true), r(true)]
|
||||
r(true)
|
||||
r(1) -> <v17>
|
||||
r(2) -> <v18>
|
||||
call(+, plus|<v17>, <v18>) -> <v19>
|
||||
r(a) -> <v20>
|
||||
jf(L5|<v20>) NEXT:[magic(a && true|<v20>, <v21>) -> <v22>, r(true) -> <v21>]
|
||||
r(true) -> <v21>
|
||||
L5:
|
||||
r(a && true) PREV:[jf(L5), r(true)]
|
||||
r(a)
|
||||
jt(L6) NEXT:[r(false), r(a || false)]
|
||||
r(false)
|
||||
magic(a && true|<v20>, <v21>) -> <v22> PREV:[jf(L5|<v20>), r(true) -> <v21>]
|
||||
r(a) -> <v23>
|
||||
jt(L6|<v23>) NEXT:[r(false) -> <v24>, magic(a || false|<v23>, <v24>) -> <v25>]
|
||||
r(false) -> <v24>
|
||||
L6:
|
||||
r(a || false) PREV:[jt(L6), r(false)]
|
||||
magic(a || false|<v23>, <v24>) -> <v25> PREV:[jt(L6|<v23>), r(false) -> <v24>]
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -77,13 +78,13 @@ sink:
|
||||
L3:
|
||||
3 <START>
|
||||
4 mark(1)
|
||||
r(1)
|
||||
r(1) -> <v0>
|
||||
L4:
|
||||
3 <END> NEXT:[<SINK>]
|
||||
3 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
== foo ==
|
||||
fun foo(a : Boolean, b : Int) : Unit {}
|
||||
@@ -91,17 +92,19 @@ fun foo(a : Boolean, b : Int) : Unit {}
|
||||
L0:
|
||||
1 <START>
|
||||
v(a : Boolean)
|
||||
w(a)
|
||||
magic(a : Boolean) -> <v0>
|
||||
w(a|<v0>)
|
||||
v(b : Int)
|
||||
w(b)
|
||||
magic(b : Int) -> <v1>
|
||||
w(b|<v1>)
|
||||
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>]
|
||||
=====================
|
||||
== genfun ==
|
||||
fun genfun<T>() : Unit {}
|
||||
@@ -123,13 +126,14 @@ fun flfun(f : () -> Any) : Unit {}
|
||||
L0:
|
||||
1 <START>
|
||||
v(f : () -> Any)
|
||||
w(f)
|
||||
magic(f : () -> Any) -> <v0>
|
||||
w(f|<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>]
|
||||
=====================
|
||||
|
||||
Reference in New Issue
Block a user