Program: 88715
Project: 88715
Buggy source:
public soot.Body getBody(soot.SootMethod sootMethod,String phaseName){
  soot.Body body=soot.jimple.Jimple.v().newBody(sootMethod);
  soot.RefType type=sootMethod.getDeclaringClass().getType();
  soot.Local thisLocal=soot.jimple.Jimple.v().newLocal("String_Node_Str",type);
  body.getLocals().add(thisLocal);
  soot.jimple.ThisRef thisRef=soot.jimple.Jimple.v().newThisRef(type);
  soot.jimple.Stmt thisStmt=soot.jimple.Jimple.v().newIdentityStmt(thisLocal,thisRef);
  body.getUnits().add(thisStmt);
  ArrayList invokeList=new ArrayList();
  ArrayList invokeTypeList=new ArrayList();
  soot.Local outerLocal=null;
  int numParams=sootMethod.getParameterCount();
  int numFinals=0;
  if (fields != null) {
    numFinals=fields.size();
  }
  int startFinals=numParams - numFinals;
  ArrayList paramsForFinals=new ArrayList();
  Iterator fIt=sootMethod.getParameterTypes().iterator();
  int counter=0;
  while (fIt.hasNext()) {
    soot.Type fType=(soot.Type)fIt.next();
    soot.Local local=soot.jimple.Jimple.v().newLocal("String_Node_Str" + counter,fType);
    body.getLocals().add(local);
    soot.jimple.ParameterRef paramRef=soot.jimple.Jimple.v().newParameterRef(fType,counter);
    soot.jimple.Stmt stmt=soot.jimple.Jimple.v().newIdentityStmt(local,paramRef);
    if ((counter != 0) && (counter < startFinals)) {
      invokeTypeList.add(fType);
      invokeList.add(local);
    }
 else     if (counter == 0) {
      outerLocal=local;
    }
 else {
      paramsForFinals.add(local);
    }
    body.getUnits().add(stmt);
    counter++;
  }
  soot.SootMethod callMethod=sootMethod.getDeclaringClass().getSuperclass().getMethod("String_Node_Str",invokeTypeList,soot.VoidType.v());
  soot.jimple.InvokeExpr invoke=soot.jimple.Jimple.v().newSpecialInvokeExpr(thisLocal,callMethod,invokeList);
  soot.jimple.Stmt invokeStmt=soot.jimple.Jimple.v().newInvokeStmt(invoke);
  body.getUnits().add(invokeStmt);
  soot.SootField field=sootMethod.getDeclaringClass().getField("String_Node_Str",outerClassType);
  soot.jimple.InstanceFieldRef ref=soot.jimple.Jimple.v().newInstanceFieldRef(thisLocal,field);
  soot.jimple.AssignStmt assign=soot.jimple.Jimple.v().newAssignStmt(ref,outerLocal);
  body.getUnits().add(assign);
  if (fields != null) {
    Iterator finalsIt=paramsForFinals.iterator();
    Iterator fieldsIt=fields.iterator();
    while (finalsIt.hasNext() && fieldsIt.hasNext()) {
      soot.Local pLocal=(soot.Local)finalsIt.next();
      soot.SootField pField=(soot.SootField)fieldsIt.next();
      soot.jimple.FieldRef pRef=soot.jimple.Jimple.v().newInstanceFieldRef(thisLocal,pField);
      soot.jimple.AssignStmt pAssign=soot.jimple.Jimple.v().newAssignStmt(pRef,pLocal);
      body.getUnits().add(pAssign);
    }
  }
  soot.jimple.ReturnVoidStmt retStmt=soot.jimple.Jimple.v().newReturnVoidStmt();
  body.getUnits().add(retStmt);
  PackManager.v().getPack("String_Node_Str").apply(body);
  return body;
}

Fixed version (ground truth):
public soot.Body getBody(soot.SootMethod sootMethod,String phaseName){
  soot.Body body=soot.jimple.Jimple.v().newBody(sootMethod);
  soot.RefType type=sootMethod.getDeclaringClass().getType();
  soot.Local thisLocal=soot.jimple.Jimple.v().newLocal("String_Node_Str",type);
  body.getLocals().add(thisLocal);
  soot.jimple.ThisRef thisRef=soot.jimple.Jimple.v().newThisRef(type);
  soot.jimple.Stmt thisStmt=soot.jimple.Jimple.v().newIdentityStmt(thisLocal,thisRef);
  body.getUnits().add(thisStmt);
  ArrayList invokeList=new ArrayList();
  ArrayList invokeTypeList=new ArrayList();
  soot.Local outerLocal=null;
  int numParams=sootMethod.getParameterCount();
  int numFinals=0;
  if (fields != null) {
    numFinals=fields.size();
  }
  int startFinals=numParams - numFinals;
  ArrayList paramsForFinals=new ArrayList();
  Iterator fIt=sootMethod.getParameterTypes().iterator();
  int counter=0;
  while (fIt.hasNext()) {
    soot.Type fType=(soot.Type)fIt.next();
    soot.Local local=soot.jimple.Jimple.v().newLocal("String_Node_Str" + counter,fType);
    body.getLocals().add(local);
    soot.jimple.ParameterRef paramRef=soot.jimple.Jimple.v().newParameterRef(fType,counter);
    soot.jimple.Stmt stmt=soot.jimple.Jimple.v().newIdentityStmt(local,paramRef);
    if ((counter != 0) && (counter < startFinals)) {
      invokeTypeList.add(fType);
      invokeList.add(local);
    }
 else     if (counter == 0) {
      outerLocal=local;
    }
 else {
      paramsForFinals.add(local);
    }
    body.getUnits().add(stmt);
    counter++;
  }
  soot.SootMethod callMethod=sootMethod.getDeclaringClass().getSuperclass().getMethod("String_Node_Str",invokeTypeList,soot.VoidType.v());
  soot.jimple.InvokeExpr invoke=soot.jimple.Jimple.v().newSpecialInvokeExpr(thisLocal,callMethod,invokeList);
  soot.jimple.Stmt invokeStmt=soot.jimple.Jimple.v().newInvokeStmt(invoke);
  body.getUnits().add(invokeStmt);
  if (!inStaticMethod) {
    soot.SootField field=sootMethod.getDeclaringClass().getField("String_Node_Str",outerClassType);
    soot.jimple.InstanceFieldRef ref=soot.jimple.Jimple.v().newInstanceFieldRef(thisLocal,field);
    soot.jimple.AssignStmt assign=soot.jimple.Jimple.v().newAssignStmt(ref,outerLocal);
    body.getUnits().add(assign);
  }
  if (fields != null) {
    Iterator finalsIt=paramsForFinals.iterator();
    Iterator fieldsIt=fields.iterator();
    while (finalsIt.hasNext() && fieldsIt.hasNext()) {
      soot.Local pLocal=(soot.Local)finalsIt.next();
      soot.SootField pField=(soot.SootField)fieldsIt.next();
      soot.jimple.FieldRef pRef=soot.jimple.Jimple.v().newInstanceFieldRef(thisLocal,pField);
      soot.jimple.AssignStmt pAssign=soot.jimple.Jimple.v().newAssignStmt(pRef,pLocal);
      body.getUnits().add(pAssign);
    }
  }
  soot.jimple.ReturnVoidStmt retStmt=soot.jimple.Jimple.v().newReturnVoidStmt();
  body.getUnits().add(retStmt);
  PackManager.v().getPack("String_Node_Str").apply(body);
  return body;
}