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