class SpringUnvalidatedRedirectDetector implements Detector {
    private static final String SPRING_UNVALIDATED_REDIRECT_TYPE = "SPRING_UNVALIDATED_REDIRECT";
    private static final List<String> REQUEST_MAPPING_ANNOTATION_TYPES = Arrays.asList(
            "Lorg/springframework/web/bind/annotation/RequestMapping;", //
            "Lorg/springframework/web/bind/annotation/GetMapping;", //
            "Lorg/springframework/web/bind/annotation/PostMapping;", //
            "Lorg/springframework/web/bind/annotation/PutMapping;", //
            "Lorg/springframework/web/bind/annotation/DeleteMapping;", //
            "Lorg/springframework/web/bind/annotation/PatchMapping;");

    private BugReporter reporter;

    public SpringUnvalidatedRedirectDetector(BugReporter bugReporter) {
        this.reporter = bugReporter;
    }

    @Override
    public void visitClassContext(ClassContext classContext) {
        JavaClass clazz = classContext.getJavaClass();

        if (hasRequestMapping(clazz)) {
            Method[] methods = clazz.getMethods();
            for (Method m: methods) {

                try {
                    analyzeMethod(m, classContext);
                } catch (CFGBuilderException e){
                }
            }
        }
    }

    private boolean hasRequestMapping(JavaClass clazz) {
        Method[] methods = clazz.getMethods();
        for (Method m: methods) {
            AnnotationEntry[] annotations = m.getAnnotationEntries();

            for (AnnotationEntry ae: annotations) {
                if (REQUEST_MAPPING_ANNOTATION_TYPES.contains(ae.getAnnotationType())) {
                    return true;
                }
            }
        }
        return false;
    }

    private void analyzeMethod(Method m, ClassContext classContext) throws CFGBuilderException{<FILL_FUNCTION_BODY>}

    @Override
    public void report() {

    }
}

        JavaClass clazz = classContext.getJavaClass();
        ConstantPoolGen cpg = classContext.getConstantPoolGen();
        CFG cfg = classContext.getCFG(m);

        for (Iterator<Location> i = cfg.locationIterator(); i.hasNext(); ) {
            Location loc = i.next();
            Instruction inst = loc.getHandle().getInstruction();

            if (inst instanceof INVOKEVIRTUAL) {
                INVOKEVIRTUAL invoke = (INVOKEVIRTUAL)inst;
                if( "java.lang.StringBuilder".equals(invoke.getClassName(cpg)) && "append".equals(invoke.getMethodName(cpg))) {
                    Instruction prev = loc.getHandle().getPrev().getInstruction();

                    if (prev instanceof LDC) {
                        LDC ldc = (LDC)prev;
                        Object value = ldc.getValue(cpg);

                        if (value instanceof String) {
                            String v = (String)value;

                            if ("redirect:".equals(v)) {
                                BugInstance bug = new BugInstance(this, SPRING_UNVALIDATED_REDIRECT_TYPE, Priorities.NORMAL_PRIORITY);
                                bug.addClass(clazz).addMethod(clazz,m).addSourceLine(classContext,m,loc);
                                reporter.reportBug(bug);
                            }
                        }
                    }
                }
            }
        }
    
<no_super_class>