package org.checkerframework.checker.tainting.qual; public class Simple { void simple() { String s = source(); sink(s); } void alias() { String s1 = source(); String s = s1; sink(s); } void unknown() { String s = foo(); sink(s); } void literalOnly() { String s = null; s = "safe"; sink(s); } void safeCall() { String s = "safe"; s = safe(); sink(s); } void sourceCallToSink() { sink(source()); } void safeCallToSink() { sink(safe()); } void sourceFromClass() { String s = (new WithSourceParent()).source(); sink(s); } void sourceFromChildClass() { WithSourceChild child = new WithSourceChild(); String s = child.source(); sink(s); } void withParenthesis() { String s1 = (source()); s1 = (foo()); String s = (s1); sink((s)); } @Untainted String unsafeReturn() { return source(); } void sourceToSafeString() { @Untainted String s = "safe"; s = source(); } void unsafeConcat() { @Tainted String s = source(); String s1 = "safe"; String s2 = "safe2"; sink(s1 + s + s2); } void unsafeTernary(boolean b) { @Tainted String s = source(); sink(b ? s : null); } void fieldFromGetter() { String s = getField(); sink(s); } void assignToSafeLocalVar() { String s1 = getField(); @Untainted String safe = s1; String s2 = source(); safe = s2; } private final String field = foo(); public String getField() { return field; } String callSource() { return source(); } String foo() { return "some"; } @Untainted String safe() { return "safe"; } @Tainted String source() { return "tainted"; } void sink(@Untainted String s1) {} class WithSourceParent { @Tainted String source() { return "tainted"; } } class WithSourceChild extends WithSourceParent { @Override String source() { return super.source(); } } }