import org.checkerframework.checker.tainting.qual.Untainted; public class MethodPropagation { public void test1(String dirty, @Untainted String clean) { sink(dirty); //warn sink(clean); } private String recursive(String dirty, @Untainted String clean) { if (clean == "") { String a = recursive(dirty, clean); sink(a); //warn return recursive(dirty, clean); } return recursive(clean, clean); } public void test2(String dirty, @Untainted String clean) { sink(next(dirty)); //warn sink(next(clean)); sink(nextPublic(dirty)); //warn sink(nextPublic(clean)); //warn (public) sink(alwaysClean(dirty)); sink(alwaysClean(clean)); sink(staticNext(dirty)); //warn sink(staticNext(clean)); sink(next(next(clean))); sink(next(next(next(next(next(clean)))))); sink(next(next(next(next(next(dirty)))))); //warn sink(alwaysClean(next(next(next(next(clean)))))); sink(alwaysClean(next(next(next(next(dirty)))))); sink(next(next(next(next(alwaysClean(clean)))))); sink(next(next(next(next(alwaysClean(dirty)))))); sink(next(alwaysClean(clean))); sink(next((alwaysClean(dirty)))); String alwaysClean = alwaysClean(next(next(next(clean)))); sink(alwaysClean); String alwaysClean2 = alwaysClean(next(next(next(dirty)))); sink(alwaysClean2); } private String next(String next) { return next; } public static String staticNext(String next) { return next; } private String alwaysClean(String next) { return "next"; } public String nextPublic(String next) { return next; } public static void sink(@Untainted String string) { } }