import org.checkerframework.checker.tainting.qual.Tainted
import org.checkerframework.checker.tainting.qual.Untainted
class Simple {
fun simple() {
val s = source()
sink(s)
}
fun alias() {
val s1 = source()
sink(s1)
}
fun unknown() {
val s = foo()
sink(s)
}
fun unknown2(v: String) {
val s = foo2(v)
sink(s)
}
fun literalOnly() {
var s: String? = null
s = "safe"
sink(s)
}
fun safeCall() {
var s: String? = "safe"
s = safe()
sink(s)
}
fun sourceCallToSink() {
sink(source())
}
fun safeCallToSink() {
sink(safe())
}
fun sourceFromClass() {
val s = WithSourceParent().source()
sink(s)
}
fun sourceFromChildClass() {
val child = WithSourceChild()
val s = child.source()
sink(s)
}
fun withParenthesis() {
var s1 = (source())
s1 = (foo())
val s = (s1)
sink((s))
}
fun unsafeReturn(): @Untainted String? {
return source()
}
fun unsafeConcat() {
@Tainted val s = source()
val s1 = "safe"
val s2 = "safe2"
sink(s1 + s + s2)
}
fun unsafeTernary(b: Boolean) {
@Tainted val s = source()
sink(if (b) s else null)
}
fun unknownIfExpression(b: Boolean): @Untainted String {
var s: String = if (b) bar() else foo()
return s
}
fun unknownIfExpression(b: Boolean, v: String): @Untainted String {
var s: String = if (b) bar() else foo2(v)
return s
}
fun callSource(): String {
return source()
}
fun foo(): String {
return "some"
}
fun foo2(v: String): String {
return v
}
fun bar(): String {
return "other"
}
fun safe(): @Untainted String? {
return "safe"
}
@Tainted
fun source(): String {
return "tainted"
}
fun sink(s1: @Untainted String?) {}
internal open inner class WithSourceParent {
@Tainted
open fun source(): String {
return "tainted"
}
}
internal inner class WithSourceChild : WithSourceParent() {
override fun source(): String {
return super.source()
}
}
}