Program: 88590
Project: 88590
Buggy source:
/** 
 * For Inner Classes - to access private fields of their outer class
 */
private soot.Local getPrivateAccessFieldLocal(polyglot.ast.Field field){
  soot.SootMethod toInvoke;
  if (field.fieldInstance().flags().isPrivate()) {
    toInvoke=addGetFieldAccessMeth(((soot.RefType)Util.getSootType(field.fieldInstance().container())).getSootClass(),field);
  }
 else {
    if (InitialResolver.v().hierarchy() == null) {
      InitialResolver.v().hierarchy(new soot.FastHierarchy());
    }
    soot.SootClass addToClass=body.getMethod().getDeclaringClass().getOuterClass();
    soot.SootClass containingClass=((soot.RefType)Util.getSootType(field.fieldInstance().container())).getSootClass();
    while (!InitialResolver.v().hierarchy().canStoreType(containingClass.getType(),addToClass.getType())) {
      if (addToClass.hasOuterClass()) {
        addToClass=addToClass.getOuterClass();
      }
 else {
        break;
      }
    }
    toInvoke=addGetFieldAccessMeth(addToClass,field);
  }
  ArrayList params=new ArrayList();
  if (!field.fieldInstance().flags().isStatic()) {
    params.add((soot.Local)getBaseLocal(field.target()));
  }
  return Util.getPrivateAccessFieldInvoke(toInvoke.makeRef(),params,body,lg);
}

Fixed version (ground truth):
/** 
 * For Inner Classes - to access private fields of their outer class
 */
private soot.Local getPrivateAccessFieldLocal(polyglot.ast.Field field){
  System.out.println("String_Node_Str" + field);
  System.out.println("String_Node_Str" + field.target().getClass());
  soot.SootMethod toInvoke;
  soot.SootClass invokeClass;
  if (field.fieldInstance().flags().isPrivate()) {
    toInvoke=addGetFieldAccessMeth(((soot.RefType)Util.getSootType(field.fieldInstance().container())).getSootClass(),field);
    invokeClass=((soot.RefType)Util.getSootType(field.fieldInstance().container())).getSootClass();
  }
 else {
    if (InitialResolver.v().hierarchy() == null) {
      InitialResolver.v().hierarchy(new soot.FastHierarchy());
    }
    soot.SootClass containingClass=((soot.RefType)Util.getSootType(field.fieldInstance().container())).getSootClass();
    soot.SootClass addToClass;
    if (body.getMethod().getDeclaringClass().hasOuterClass()) {
      addToClass=body.getMethod().getDeclaringClass().getOuterClass();
      while (!InitialResolver.v().hierarchy().canStoreType(containingClass.getType(),addToClass.getType())) {
        if (addToClass.hasOuterClass()) {
          addToClass=addToClass.getOuterClass();
        }
 else {
          break;
        }
      }
    }
 else {
      addToClass=containingClass;
    }
    invokeClass=addToClass;
    toInvoke=addGetFieldAccessMeth(addToClass,field);
  }
  ArrayList params=new ArrayList();
  if (!field.fieldInstance().flags().isStatic()) {
    if (field.target() instanceof polyglot.ast.Expr) {
      params.add((soot.Local)getBaseLocal(field.target()));
    }
 else     if (body.getMethod().getDeclaringClass().declaresFieldByName("String_Node_Str")) {
      params.add(getThis(invokeClass.getType()));
    }
 else {
      soot.Local local=(soot.Local)getBaseLocal(field.target());
      params.add(local);
    }
  }
  return Util.getPrivateAccessFieldInvoke(toInvoke.makeRef(),params,body,lg);
}