@file:Suppress("unused", "UNUSED_PARAMETER", "UNUSED_VARIABLE", "ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE", "UNUSED_VALUE") import org.checkerframework.checker.tainting.qual.Tainted import org.checkerframework.checker.tainting.qual.Untainted val dirty: @Tainted String = "" var clean: @Untainted String = dirty //warn var clean2: @Untainted String = "" class SinkTestKotlin { fun breakClean2(dirty: String) { clean2 = dirty // warn } companion object { val dirty: @Tainted String = "" var clean: @Untainted String = dirty //warn var clean2: @Untainted String = "" fun breakClean2(dirty: String) { clean2 = dirty // warn } } fun test(string: String?) { sink(string) //warn } fun returnDirty(dirty: String?): @Untainted String? { return dirty //warn } fun sink(clear: @Untainted String?) { } fun assignDirty(clear: @Untainted String?, dirty: String?) { var clear1 = clear var clear2: String? = clear1 clear1 = dirty //warn clear2 = dirty } var dirty: @Untainted String? = getFromStatic() //warn private fun getFromStatic(): @Tainted String { return "" } var clear: @Untainted String? = "" fun spoil(dirty: String?) { clear = dirty //warn } fun testLocal(dirty: String?) { val clean: @Untainted String? = dirty //warn } fun testParameter(clean: @Untainted String = getDirty()) { //warn } fun getDirty(): @Tainted String = "" fun testLocal2(dirty: String?) { var clean: @Untainted String? = "" clean = dirty //warn } fun println(t: String): String { return t } }