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() } } }