[FIR] Add checker for uninitialized properties

This commit is contained in:
Dmitriy Novozhilov
2020-06-17 11:51:15 +03:00
parent 25621d699b
commit 26458875d5
96 changed files with 1476 additions and 1358 deletions
@@ -0,0 +1,32 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNREACHABLE_CODE -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
// SKIP_TXT
/*
* TESTCASE NUMBER: 1
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-35565
*/
fun case1() {
val x1: String
val x: Boolean
try {
val x0: Boolean = (throw Exception()) || true
!<!UNINITIALIZED_VARIABLE!>x<!> // UNINITIALIZED_VARIABLE should be
val a: Int = <!UNINITIALIZED_VARIABLE!>x1<!>.toInt() // UNINITIALIZED_VARIABLE should be
} catch (e: Exception) {
}
}
/*
* TESTCASE NUMBER: 2
* UNEXPECTED BEHAVIOUR
* ISSUES: KT-35565
*/
fun case2() {
val x: Boolean = false
try {
x = (throw Exception()) || true //VAL_REASSIGNMENT should be
} catch (e: Exception) {
}
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNREACHABLE_CODE -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION
// SKIP_TXT
@@ -44,10 +44,10 @@ import contracts.*
fun case_1(value_1: Int?) {
val value_2: Int
if (contracts.case_1(value_1) { value_2 = 10 }) {
println(value_2)
println(<!UNINITIALIZED_VARIABLE!>value_2<!>)
} else {
value_1.inv()
println(value_2)
println(<!UNINITIALIZED_VARIABLE!>value_2<!>)
}
}
@@ -57,18 +57,18 @@ fun case_2(value_1: Int?, value_2: Int?, value_3: Any?) {
when (value_1.case_2(value_2, value_3) { value_4 = 10 }) {
true -> {
<!AMBIGUITY!>println<!>(value_3?.xor(true))
println(value_4)
println(<!UNINITIALIZED_VARIABLE!>value_4<!>)
<!AMBIGUITY!>println<!>(value_1.inv())
<!AMBIGUITY!>println<!>(value_2.inv())
}
false -> {
println(value_4)
println(<!UNINITIALIZED_VARIABLE!>value_4<!>)
println(value_1)
println(value_2)
}
null -> {
println(value_3?.xor(true))
println(value_4)
println(<!UNINITIALIZED_VARIABLE!>value_4<!>)
println(value_1)
println(value_2)
}
@@ -12,14 +12,14 @@ fun case_1() {
fun case_2() {
val value_1: Int
funWithAtMostOnceCallsInPlace { value_1 = 10 }
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 3
fun case_3() {
val value_1: Int
funWithUnknownCallsInPlace { value_1 = 10 }
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 4
@@ -28,8 +28,8 @@ fun case_4() {
var value_2: Int
funWithAtMostOnceCallsInPlace { value_1 = 10 }
funWithUnknownCallsInPlace { value_2 = 10 }
value_1.dec()
value_2.div(10)
<!UNINITIALIZED_VARIABLE!>value_1<!>.dec()
<!UNINITIALIZED_VARIABLE!>value_2<!>.div(10)
}
// TESTCASE NUMBER: 5
@@ -53,7 +53,7 @@ fun case_6() {
val value_1: Int
for (i in 0..1)
funWithExactlyOnceCallsInPlace { value_1 = 10 }
value_1.dec()
<!UNINITIALIZED_VARIABLE!>value_1<!>.dec()
}
// TESTCASE NUMBER: 7
@@ -64,12 +64,12 @@ fun case_7() {
funWithExactlyOnceCallsInPlace { value_1 = 10 }
i++
}
value_1.dec()
<!UNINITIALIZED_VARIABLE!>value_1<!>.dec()
}
// TESTCASE NUMBER: 8
fun case_8() {
var value_1: Int
if (true) funWithAtLeastOnceCallsInPlace { value_1 = 10 }
value_1.dec()
<!UNINITIALIZED_VARIABLE!>value_1<!>.dec()
}
@@ -12,11 +12,11 @@ fun case_1() {
}
}
funWithExactlyOnceCallsInPlace {
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 2
@@ -27,14 +27,14 @@ fun case_2() {
value_1 = 1
}
funWithAtLeastOnceCallsInPlace {
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
funWithUnknownCallsInPlace {
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 3
@@ -48,11 +48,11 @@ fun case_3() {
}
}
funWithExactlyOnceCallsInPlace {
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 4
@@ -63,15 +63,15 @@ fun case_4() {
value_1 = 1
}
funWithAtLeastOnceCallsInPlace {
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
funWithUnknownCallsInPlace {
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
funWithExactlyOnceCallsInPlace {
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
@@ -12,7 +12,7 @@ fun case_1(value_1: EnumClass?) {
null -> funWithExactlyOnceCallsInPlace { value_2 = 5 }
}
value_2.inc()
<!UNINITIALIZED_VARIABLE!>value_2<!>.inc()
}
// TESTCASE NUMBER: 2
@@ -27,9 +27,9 @@ fun case_2(value_1: Any?) {
} else {
funWithAtMostOnceCallsInPlace { value_2 = 2 }
}
value_2.dec()
<!UNINITIALIZED_VARIABLE!>value_2<!>.dec()
}
value_2.dec()
<!UNINITIALIZED_VARIABLE!>value_2<!>.dec()
}
// TESTCASE NUMBER: 3
@@ -65,9 +65,9 @@ fun case_4(value_1: EnumClassSingle?) {
funWithUnknownCallsInPlace { value_2 = 2 }
}
}
value_2.minus(5)
<!UNINITIALIZED_VARIABLE!>value_2<!>.minus(5)
}
value_2.minus(5)
<!UNINITIALIZED_VARIABLE!>value_2<!>.minus(5)
}
// TESTCASE NUMBER: 5
@@ -80,7 +80,7 @@ fun case_5() {
funWithAtMostOnceCallsInPlace { value_2 = 1 }
}
value_2++
<!UNINITIALIZED_VARIABLE!>value_2<!>++
}
// TESTCASE NUMBER: 6
@@ -92,10 +92,10 @@ fun case_6() {
} catch (e: Exception) {
throw Exception()
} finally {
println(value_2.inc())
println(<!UNINITIALIZED_VARIABLE!>value_2<!>.inc())
}
value_2++
<!UNINITIALIZED_VARIABLE!>value_2<!>++
}
// TESTCASE NUMBER: 7
@@ -112,7 +112,7 @@ fun case_7() {
}
}
println(value_1.inc())
println(<!UNINITIALIZED_VARIABLE!>value_1<!>.inc())
}
// TESTCASE NUMBER: 8
@@ -127,7 +127,7 @@ fun case_8() {
}
throw Exception()
}
println(x.inc())
println(<!UNINITIALIZED_VARIABLE!>x<!>.inc())
}
// TESTCASE NUMBER: 9
@@ -139,7 +139,7 @@ fun case_9() {
return@outer
}
}
println(x.inc())
println(<!UNINITIALIZED_VARIABLE!>x<!>.inc())
}
// TESTCASE NUMBER: 10
@@ -156,5 +156,5 @@ fun case_10() {
}
return@outer
}
println(x.inc())
println(<!UNINITIALIZED_VARIABLE!>x<!>.inc())
}
@@ -8,7 +8,7 @@ fun case_1() {
val value_1 = 10
value_1.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 2
@@ -24,7 +24,7 @@ fun case_2() {
}
value_1.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 3
@@ -36,14 +36,14 @@ fun case_3() {
value_1 = 10
}
funWithAtMostOnceCallsInPlace {
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
funWithAtMostOnceCallsInPlace {
value_1 = 10
}
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 4
@@ -62,7 +62,7 @@ fun case_4() {
funWithAtMostOnceCallsInPlace {
value_1 = 1
}
value_1.dec()
<!UNINITIALIZED_VARIABLE!>value_1<!>.dec()
}
// TESTCASE NUMBER: 5
@@ -81,5 +81,5 @@ fun case_5() {
funWithUnknownCallsInPlace {
value_1 = 1
}
value_1.dec()
<!UNINITIALIZED_VARIABLE!>value_1<!>.dec()
}
@@ -13,7 +13,7 @@ fun case_2() {
var value_1: Int
val l = { value_1 = 10 }
funWithAtLeastOnceCallsInPlace(l)
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 3
@@ -21,7 +21,7 @@ fun case_3() {
var value_1: Int
val l = fun () { value_1 = 10 }
funWithAtLeastOnceCallsInPlace(l)
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
// TESTCASE NUMBER: 4
@@ -38,5 +38,5 @@ fun case_5() {
fun l() { value_1 = 10 }
}
funWithExactlyOnceCallsInPlace(o::l)
value_1.inc()
<!UNINITIALIZED_VARIABLE!>value_1<!>.inc()
}
@@ -17,12 +17,12 @@ fun case_2(arg: Int?) {
fun case_3() {
val value_1: Boolean?
funWithAtMostOnceCallsInPlace { value_1 = false }
value_1.<!INAPPLICABLE_CANDIDATE!>not<!>()
<!UNINITIALIZED_VARIABLE!>value_1<!>.<!INAPPLICABLE_CANDIDATE!>not<!>()
}
// TESTCASE NUMBER: 4
fun case_4() {
val value_1: Boolean?
funWithUnknownCallsInPlace { value_1 = true }
value_1.<!INAPPLICABLE_CANDIDATE!>not<!>()
<!UNINITIALIZED_VARIABLE!>value_1<!>.<!INAPPLICABLE_CANDIDATE!>not<!>()
}
@@ -85,6 +85,6 @@ fun case_6() {
null!!
}
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?")!>x<!>.<!AMBIGUITY!>minus<!>(10.0)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?"), UNINITIALIZED_VARIABLE!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any?"), UNINITIALIZED_VARIABLE!>x<!>.<!AMBIGUITY!>minus<!>(10.0)
}