@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
}
}