Program: 88521
Project: 88521
Buggy source:
protected void processMethod(SootMethod source){
  MethodNodeFactory mnf=new MethodNodeFactory(source,gnf);
  final SootClass scl=source.getDeclaringClass();
  if (source.isNative() || source.isPhantom())   return;
  Body b=source.retrieveActiveBody();
  boolean warnedAlready=false;
  for (Iterator sIt=b.getUnits().iterator(); sIt.hasNext(); ) {
    final Stmt s=(Stmt)sIt.next();
    if (s.containsInvokeExpr()) {
      InvokeExpr ie=(InvokeExpr)s.getInvokeExpr();
      if (ie instanceof InstanceInvokeExpr) {
        Scene.v().getUnitNumberer().add(s);
        InstanceInvokeExpr iie=(InstanceInvokeExpr)ie;
        VarNode receiver=(VarNode)mnf.getNode(iie.getBase());
        if (ie instanceof SpecialInvokeExpr) {
          SootMethod tgt=VirtualCalls.v().resolveSpecial((SpecialInvokeExpr)ie,ie.getMethodRef().getSubSignature(),source);
          specials.add(receiver,source,s,tgt);
          change=true;
        }
 else {
          NumberedString subSig=iie.getMethodRef().getSubSignature();
          receivers.add(receiver,source,s,iie.getMethodRef().declaringClass().getType(),subSig,Edge.ieToKind(iie));
          change=true;
          if (subSig == sigStart) {
            receivers.add(receiver,source,s,iie.getMethodRef().declaringClass().getType(),sigRun,Kind.THREAD);
            change=true;
          }
        }
      }
 else {
        SootMethod tgt=((StaticInvokeExpr)ie).getMethod();
        addEdge(source,s,tgt);
        if (tgt.getSignature().equals("String_Node_Str") || tgt.getSignature().equals("String_Node_Str")) {
          VarNode receiver=(VarNode)mnf.getNode(ie.getArg(0));
          receivers.add(receiver,source,s,RefType.v("String_Node_Str"),sigObjRun,Kind.PRIVILEGED);
          change=true;
        }
        if (tgt.getSignature().equals("String_Node_Str") || tgt.getSignature().equals("String_Node_Str")) {
          VarNode receiver=(VarNode)mnf.getNode(ie.getArg(0));
          receivers.add(receiver,source,s,RefType.v("String_Node_Str"),sigObjRun,Kind.PRIVILEGED);
          change=true;
        }
      }
      if (ie.getMethod().getSignature().equals("String_Node_Str")) {
        if (!warnedAlready) {
          if (options.verbose()) {
            G.v().out.println("String_Node_Str" + "String_Node_Str" + source + "String_Node_Str");
          }
          warnedAlready=true;
        }
      }
      if (ie.getMethod().getSignature().equals("String_Node_Str")) {
        if (options.safe_newinstance()) {
          for (Iterator tgtIt=EntryPoints.v().inits().iterator(); tgtIt.hasNext(); ) {
            final SootMethod tgt=(SootMethod)tgtIt.next();
            addEdge(source,s,tgt,Kind.NEWINSTANCE);
          }
        }
 else {
          for (Iterator clsIt=Scene.v().dynamicClasses().iterator(); clsIt.hasNext(); ) {
            final SootClass cls=(SootClass)clsIt.next();
            if (cls.declaresMethod(sigInit)) {
              addEdge(source,s,cls.getMethod(sigInit),Kind.NEWINSTANCE);
            }
          }
          if (options.verbose() && Scene.v().dynamicClasses().isEmpty()) {
            G.v().out.println("String_Node_Str" + source + "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str");
          }
        }
      }
      if (ie instanceof StaticInvokeExpr) {
        SootClass cl=ie.getMethodRef().declaringClass();
        for (Iterator clinitIt=EntryPoints.v().clinitsOf(cl).iterator(); clinitIt.hasNext(); ) {
          final SootMethod clinit=(SootMethod)clinitIt.next();
          addEdge(source,s,clinit,Kind.CLINIT);
        }
      }
      if (ie.getMethodRef().getSubSignature() == sigForName) {
        Value className=ie.getArg(0);
        if (className instanceof StringConstant) {
          String cls=((StringConstant)className).value;
          constantForName(cls,source,s);
        }
 else {
          VarNode constant=(VarNode)mnf.getNode(className);
          if (options.safe_forname()) {
            for (Iterator tgtIt=EntryPoints.v().clinits().iterator(); tgtIt.hasNext(); ) {
              final SootMethod tgt=(SootMethod)tgtIt.next();
              addEdge(source,s,tgt,Kind.CLINIT);
            }
          }
 else {
            receivers.add(constant,source,s,null,null,Kind.CLINIT);
            change=true;
          }
        }
      }
    }
    if (s.containsFieldRef()) {
      FieldRef fr=(FieldRef)s.getFieldRef();
      if (fr instanceof StaticFieldRef) {
        SootClass cl=fr.getFieldRef().declaringClass();
        for (Iterator clinitIt=EntryPoints.v().clinitsOf(cl).iterator(); clinitIt.hasNext(); ) {
          final SootMethod clinit=(SootMethod)clinitIt.next();
          addEdge(source,s,clinit,Kind.CLINIT);
        }
      }
    }
    if (s instanceof AssignStmt) {
      Value rhs=((AssignStmt)s).getRightOp();
      if (rhs instanceof NewExpr) {
        NewExpr r=(NewExpr)rhs;
        SootClass cl=r.getBaseType().getSootClass();
        for (Iterator clinitIt=EntryPoints.v().clinitsOf(cl).iterator(); clinitIt.hasNext(); ) {
          final SootMethod clinit=(SootMethod)clinitIt.next();
          addEdge(source,s,clinit,Kind.CLINIT);
        }
        while (true) {
          if (!cl.hasSuperclass())           break;
          if (cl.declaresMethod(sigFinalize)) {
            if (Scene.v().containsClass("String_Node_Str")) {
              addEdge(source,s,Scene.v().getSootClass("String_Node_Str").getMethod(sigRegister),Kind.FINALIZE);
            }
            break;
          }
          cl=cl.getSuperclass();
        }
      }
 else       if (rhs instanceof NewArrayExpr || rhs instanceof NewMultiArrayExpr) {
        Type t=rhs.getType();
        if (t instanceof ArrayType)         t=((ArrayType)t).baseType;
        if (t instanceof RefType) {
          SootClass cl=((RefType)t).getSootClass();
          for (Iterator clinitIt=EntryPoints.v().clinitsOf(cl).iterator(); clinitIt.hasNext(); ) {
            final SootMethod clinit=(SootMethod)clinitIt.next();
            addEdge(source,s,clinit,Kind.CLINIT);
          }
        }
      }
    }
  }
}

Fixed version (ground truth):
protected void processMethod(SootMethod source){
  MethodNodeFactory mnf=new MethodNodeFactory(source,gnf);
  final SootClass scl=source.getDeclaringClass();
  if (source.isNative() || source.isPhantom())   return;
  Body b=source.retrieveActiveBody();
  boolean warnedAlready=false;
  for (Iterator sIt=b.getUnits().iterator(); sIt.hasNext(); ) {
    final Stmt s=(Stmt)sIt.next();
    if (s.containsInvokeExpr()) {
      InvokeExpr ie=(InvokeExpr)s.getInvokeExpr();
      if (ie instanceof InstanceInvokeExpr) {
        Scene.v().getUnitNumberer().add(s);
        InstanceInvokeExpr iie=(InstanceInvokeExpr)ie;
        VarNode receiver=(VarNode)mnf.getNode(iie.getBase());
        if (ie instanceof SpecialInvokeExpr) {
          SootMethod tgt=VirtualCalls.v().resolveSpecial((SpecialInvokeExpr)ie,ie.getMethodRef().getSubSignature(),source);
          specials.add(receiver,source,s,tgt);
          change=true;
        }
 else {
          NumberedString subSig=iie.getMethodRef().getSubSignature();
          receivers.add(receiver,source,s,iie.getMethodRef().declaringClass().getType(),subSig,Edge.ieToKind(iie));
          change=true;
          if (subSig == sigStart) {
            receivers.add(receiver,source,s,iie.getMethodRef().declaringClass().getType(),sigRun,Kind.THREAD);
            change=true;
          }
        }
      }
 else {
        SootMethod tgt=((StaticInvokeExpr)ie).getMethod();
        addEdge(source,s,tgt);
        if (tgt.getSignature().equals("String_Node_Str") || tgt.getSignature().equals("String_Node_Str")) {
          VarNode receiver=(VarNode)mnf.getNode(ie.getArg(0));
          receivers.add(receiver,source,s,RefType.v("String_Node_Str"),sigObjRun,Kind.PRIVILEGED);
          change=true;
        }
        if (tgt.getSignature().equals("String_Node_Str") || tgt.getSignature().equals("String_Node_Str")) {
          VarNode receiver=(VarNode)mnf.getNode(ie.getArg(0));
          receivers.add(receiver,source,s,RefType.v("String_Node_Str"),sigObjRun,Kind.PRIVILEGED);
          change=true;
        }
      }
      if (ie.getMethod().getSignature().equals("String_Node_Str")) {
        if (!warnedAlready) {
          if (options.verbose()) {
            G.v().out.println("String_Node_Str" + "String_Node_Str" + source + "String_Node_Str");
          }
          warnedAlready=true;
        }
      }
      if (ie.getMethod().getSignature().equals("String_Node_Str")) {
        if (options.safe_newinstance()) {
          for (Iterator tgtIt=EntryPoints.v().inits().iterator(); tgtIt.hasNext(); ) {
            final SootMethod tgt=(SootMethod)tgtIt.next();
            addEdge(source,s,tgt,Kind.NEWINSTANCE);
          }
        }
 else {
          for (Iterator clsIt=Scene.v().dynamicClasses().iterator(); clsIt.hasNext(); ) {
            final SootClass cls=(SootClass)clsIt.next();
            if (cls.declaresMethod(sigInit)) {
              addEdge(source,s,cls.getMethod(sigInit),Kind.NEWINSTANCE);
            }
          }
          if (options.verbose() && Scene.v().dynamicClasses().isEmpty()) {
            G.v().out.println("String_Node_Str" + source + "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str"+ "String_Node_Str");
          }
        }
      }
      if (ie instanceof StaticInvokeExpr) {
        SootClass cl=ie.getMethodRef().declaringClass();
        for (Iterator clinitIt=EntryPoints.v().clinitsOf(cl).iterator(); clinitIt.hasNext(); ) {
          final SootMethod clinit=(SootMethod)clinitIt.next();
          addEdge(source,s,clinit,Kind.CLINIT);
        }
      }
      if (ie.getMethodRef().getSubSignature() == sigForName) {
        Value className=ie.getArg(0);
        if (className instanceof StringConstant) {
          String cls=((StringConstant)className).value;
          constantForName(cls,source,s);
        }
 else {
          VarNode constant=(VarNode)mnf.getNode(className);
          if (options.safe_forname()) {
            for (Iterator tgtIt=EntryPoints.v().clinits().iterator(); tgtIt.hasNext(); ) {
              final SootMethod tgt=(SootMethod)tgtIt.next();
              addEdge(source,s,tgt,Kind.CLINIT);
            }
          }
 else {
            receivers.add(constant,source,s,null,null,Kind.CLINIT);
            change=true;
          }
        }
      }
    }
    if (s.containsFieldRef()) {
      FieldRef fr=(FieldRef)s.getFieldRef();
      if (fr instanceof StaticFieldRef) {
        SootClass cl=fr.getFieldRef().declaringClass();
        for (Iterator clinitIt=EntryPoints.v().clinitsOf(cl).iterator(); clinitIt.hasNext(); ) {
          final SootMethod clinit=(SootMethod)clinitIt.next();
          addEdge(source,s,clinit,Kind.CLINIT);
        }
      }
    }
    if (s instanceof AssignStmt) {
      Value rhs=((AssignStmt)s).getRightOp();
      if (rhs instanceof NewExpr) {
        NewExpr r=(NewExpr)rhs;
        SootClass cl=r.getBaseType().getSootClass();
        for (Iterator clinitIt=EntryPoints.v().clinitsOf(cl).iterator(); clinitIt.hasNext(); ) {
          final SootMethod clinit=(SootMethod)clinitIt.next();
          addEdge(source,s,clinit,Kind.CLINIT);
        }
        while (true) {
          if (!cl.hasSuperclass())           break;
          if (cl.declaresMethod(sigFinalize)) {
            if (Scene.v().containsClass("String_Node_Str")) {
              addEdge(source,s,Scene.v().getSootClass("String_Node_Str").getMethod(sigRegister),Kind.FINALIZE);
            }
            break;
          }
          cl=cl.getSuperclass();
        }
      }
    }
  }
}