Program: 88701
Project: 88701
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();
  int numParams=sootMethod.getParameterCount();
  int numFinals=0;
  if (fields != null) {
    numFinals=fields.size();
  }
  int startFinals=numParams - numFinals;
  ArrayList paramsForFinals=new ArrayList();
  soot.Local outerLocal=null;
  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;
}

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();
  int numParams=sootMethod.getParameterCount();
  int numFinals=0;
  if (fields != null) {
    numFinals=fields.size();
  }
  int startFinals=numParams - numFinals;
  ArrayList paramsForFinals=new ArrayList();
  soot.Local outerLocal=null;
  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 (fType.equals(thisOuterType)) {
      outerLocal=local;
    }
    if ((counter != 0) && (counter < startFinals)) {
      invokeTypeList.add(fType);
      invokeList.add(local);
    }
 else     if ((counter == 0) && (!inStaticMethod)) {
      outerLocal=local;
    }
 else {
      paramsForFinals.add(local);
    }
    body.getUnits().add(stmt);
    counter++;
  }
  SootClass superClass=sootMethod.getDeclaringClass().getSuperclass();
  if ((superClass.getName().indexOf("String_Node_Str") != -1) && !soot.Modifier.isStatic(superClass.getModifiers())) {
    invokeTypeList.add(0,superOuterType);
  }
  SootMethod callMethod=sootMethod.getDeclaringClass().getSuperclass().getMethod("String_Node_Str",invokeTypeList,VoidType.v());
  if ((superClass.getName().indexOf("String_Node_Str") != -1) && !soot.Modifier.isStatic(superClass.getModifiers())) {
    if (superOuterType.equals(thisOuterType)) {
      invokeList.add(0,outerLocal);
    }
 else {
      invokeList.add(0,Util.getThisGivenOuter(superOuterType,new HashMap(),body,new LocalGenerator(body),outerLocal));
    }
  }
  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;
}