Program: 40468
Project: 40468
Buggy source:
@Override public void visitGetField(GetFieldLabel label,Object dst){
  IField field=(label).getField();
  PointerKey loadBase=(PointerKey)dst;
  if (refineFieldAccesses(field,loadBase,curPk,label,curState)) {
    if (DEBUG_TOPLEVEL) {
      System.err.println("String_Node_Str" + field);
    }
    OrdinalSet<InstanceKeyAndState> basePToSet=h.getPToSetFromComputer(ptoComputer,new PointerKeyAndState(loadBase,curState));
    if (DEBUG_TOPLEVEL) {
      System.err.println("String_Node_Str" + basePToSet);
    }
    h.computeFlowsTo(ptoComputer,basePToSet);
    if (DEBUG_TOPLEVEL) {
      System.err.println("String_Node_Str");
    }
    for (    MemoryAccess fieldWrite : mam.getFieldWrites(convertToHeapModel(loadBase,mam.getHeapModel()),field)) {
      IR ir=fieldWrite.getNode().getIR();
      SSAPutInstruction s=(SSAPutInstruction)ir.getInstructions()[fieldWrite.getInstructionIndex()];
      if (s == null) {
        continue;
      }
      PointerKey putfieldBase=heapModel.getPointerKeyForLocal(fieldWrite.getNode(),s.getRef());
      PointerKey writtenPk=heapModel.getPointerKeyForLocal(fieldWrite.getNode(),s.getVal());
      Collection<State> reachedFlowStates=h.getFlowedToStates(ptoComputer,basePToSet,putfieldBase);
      for (      State nextState : reachedFlowStates) {
        System.err.println("String_Node_Str" + s);
        h.propagate(new PointerKeyAndState(writtenPk,nextState));
      }
    }
  }
 else {
    for (Iterator<PointerKey> writesToInstanceField=g.getWritesToInstanceField(loadBase,field); writesToInstanceField.hasNext(); ) {
      final PointerKey writtenPk=writesToInstanceField.next();
      doTransition(curState,MatchLabel.v(),new Function<State,Object>(){
        public Object apply(        State nextState){
          h.propagate(new PointerKeyAndState(writtenPk,nextState));
          return null;
        }
      }
);
    }
  }
}

Fixed version (ground truth):
@Override public void visitGetField(GetFieldLabel label,Object dst){
  IField field=(label).getField();
  PointerKey loadBase=(PointerKey)dst;
  if (refineFieldAccesses(field,loadBase,curPk,label,curState)) {
    if (DEBUG_TOPLEVEL) {
      System.err.println("String_Node_Str" + field);
    }
    OrdinalSet<InstanceKeyAndState> basePToSet=h.getPToSetFromComputer(ptoComputer,new PointerKeyAndState(loadBase,curState));
    if (DEBUG_TOPLEVEL) {
      System.err.println("String_Node_Str" + basePToSet);
    }
    h.computeFlowsTo(ptoComputer,basePToSet);
    if (DEBUG_TOPLEVEL) {
      System.err.println("String_Node_Str");
    }
    for (    MemoryAccess fieldWrite : mam.getFieldWrites(convertToHeapModel(loadBase,mam.getHeapModel()),field)) {
      IR ir=fieldWrite.getNode().getIR();
      SSAPutInstruction s=(SSAPutInstruction)ir.getInstructions()[fieldWrite.getInstructionIndex()];
      if (s == null) {
        continue;
      }
      PointerKey putfieldBase=heapModel.getPointerKeyForLocal(fieldWrite.getNode(),s.getRef());
      PointerKey writtenPk=heapModel.getPointerKeyForLocal(fieldWrite.getNode(),s.getVal());
      Collection<State> reachedFlowStates=h.getFlowedToStates(ptoComputer,basePToSet,putfieldBase);
      for (      State nextState : reachedFlowStates) {
        if (DEBUG_TOPLEVEL) {
          System.err.println("String_Node_Str" + s);
        }
        h.propagate(new PointerKeyAndState(writtenPk,nextState));
      }
    }
  }
 else {
    for (Iterator<PointerKey> writesToInstanceField=g.getWritesToInstanceField(loadBase,field); writesToInstanceField.hasNext(); ) {
      final PointerKey writtenPk=writesToInstanceField.next();
      doTransition(curState,MatchLabel.v(),new Function<State,Object>(){
        public Object apply(        State nextState){
          h.propagate(new PointerKeyAndState(writtenPk,nextState));
          return null;
        }
      }
);
    }
  }
}