KT-12152 : leaking this inspection: accessing non-final member / this in non-final class

This commit is contained in:
Mikhail Glukhikh
2016-05-24 16:38:00 +03:00
parent 3d6bd81933
commit a22e7d3bcf
10 changed files with 301 additions and 0 deletions
@@ -0,0 +1,56 @@
class First {
val x: String
init {
use(<!DEBUG_INFO_LEAKING_THIS!>this<!>) // NPE! Leaking this
x = <!DEBUG_INFO_LEAKING_THIS!>foo<!>() // NPE! Own function
}
fun foo() = x
}
fun use(first: First) = first.x.hashCode()
abstract class Second {
val x: String
init {
use(<!DEBUG_INFO_LEAKING_THIS!>this<!>) // Leaking this in non-final
x = <!DEBUG_INFO_LEAKING_THIS!>bar<!>() // Own function in non-final
<!DEBUG_INFO_LEAKING_THIS!>foo<!>() // Non-final function call
}
private fun bar() = foo()
abstract fun foo(): String
}
fun use(second: Second) = second.x
class SecondDerived : Second() {
val y = x // null!
override fun foo() = y
}
open class Third {
open var x: String
constructor() {
<!DEBUG_INFO_LEAKING_THIS!>x<!> = "X" // Non-final property access
}
}
class ThirdDerived : Third() {
override var x: String = "Y"
set(arg) { field = "$arg$y" }
val y = ""
}
class Fourth {
val x: String
get() = y
val y = <!DEBUG_INFO_LEAKING_THIS!>x<!> // null!
}
@@ -0,0 +1,60 @@
package
public fun use(/*0*/ first: First): kotlin.Int
public fun use(/*0*/ second: Second): kotlin.String
public final class First {
public constructor First()
public final val x: kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Fourth {
public constructor Fourth()
public final val x: kotlin.String
public final val y: kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public abstract class Second {
public constructor Second()
public final val x: kotlin.String
private final fun bar(): kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class SecondDerived : Second {
public constructor SecondDerived()
public final override /*1*/ /*fake_override*/ val x: kotlin.String
public final val y: kotlin.String
invisible_fake final override /*1*/ /*fake_override*/ fun bar(): kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class Third {
public constructor Third()
public open var x: kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class ThirdDerived : Third {
public constructor ThirdDerived()
public open override /*1*/ var x: kotlin.String
public final val y: kotlin.String = ""
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}