[FIR] Add checker for uninitialized properties
This commit is contained in:
+32
@@ -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
@@ -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
|
||||
|
||||
+5
-5
@@ -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)
|
||||
}
|
||||
|
||||
+7
-7
@@ -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()
|
||||
}
|
||||
|
||||
+15
-15
@@ -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
-12
@@ -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())
|
||||
}
|
||||
|
||||
+7
-7
@@ -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()
|
||||
}
|
||||
|
||||
+3
-3
@@ -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()
|
||||
}
|
||||
|
||||
Vendored
+2
-2
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user