Program: 40863
Project: 40863
Buggy source:
public Iterator<ExplodedSupergraphNode<T>> getPredNodes(ExplodedSupergraphNode<T> node){
  T dest=node.getSupergraphNode();
  HashSet<ExplodedSupergraphNode<T>> result=HashSetFactory.make(supergraph.getPredNodeCount(dest));
  for (Iterator<? extends T> it=supergraph.getPredNodes(dest); it.hasNext(); ) {
    T src=it.next();
    if (supergraph.classifyEdge(src,dest) != ISupergraph.RETURN_EDGE) {
      IFlowFunction f=getFlowFunction(src,dest);
      if (f instanceof IReversibleFlowFunction) {
        IReversibleFlowFunction rf=(IReversibleFlowFunction)f;
        IntSet sources=rf.getSources(node.getFact());
        if (sources != null) {
          for (IntIterator ii=sources.intIterator(); ii.hasNext(); ) {
            int t=ii.next();
            result.add(new ExplodedSupergraphNode<T>(src,t));
          }
        }
      }
 else {
        Assertions.UNREACHABLE("String_Node_Str" + f.getClass());
      }
    }
 else {
      for (Iterator it2=supergraph.getCallSites(dest); it2.hasNext(); ) {
        Object callBlock=it2.next();
        IFlowFunction f=flowFunctions.getReturnFlowFunction(callBlock,src,dest);
        if (f instanceof IReversibleFlowFunction) {
          IReversibleFlowFunction rf=(IReversibleFlowFunction)f;
          IntSet sources=rf.getSources(node.getFact());
          if (sources != null) {
            for (IntIterator ii=sources.intIterator(); ii.hasNext(); ) {
              int t=ii.next();
              result.add(new ExplodedSupergraphNode<T>(src,t));
            }
          }
        }
 else {
          Assertions.UNREACHABLE("String_Node_Str" + f.getClass());
        }
      }
    }
  }
  return result.iterator();
}

Fixed version (ground truth):
public Iterator<ExplodedSupergraphNode<T>> getPredNodes(ExplodedSupergraphNode<T> node){
  T dest=node.getSupergraphNode();
  HashSet<ExplodedSupergraphNode<T>> result=HashSetFactory.make(supergraph.getPredNodeCount(dest));
  for (Iterator<? extends T> it=supergraph.getPredNodes(dest); it.hasNext(); ) {
    T src=it.next();
    if (supergraph.classifyEdge(src,dest) != ISupergraph.RETURN_EDGE) {
      IFlowFunction f=getFlowFunction(src,dest);
      if (f instanceof IReversibleFlowFunction) {
        IReversibleFlowFunction rf=(IReversibleFlowFunction)f;
        IntSet sources=rf.getSources(node.getFact());
        if (sources != null) {
          for (IntIterator ii=sources.intIterator(); ii.hasNext(); ) {
            int t=ii.next();
            result.add(new ExplodedSupergraphNode<T>(src,t));
          }
        }
      }
 else {
        Assertions.UNREACHABLE("String_Node_Str" + f.getClass());
      }
    }
 else {
      for (Iterator<? extends T> it2=supergraph.getCallSites(dest); it2.hasNext(); ) {
        T callBlock=it2.next();
        IFlowFunction f=flowFunctions.getReturnFlowFunction(callBlock,src,dest);
        if (f instanceof IReversibleFlowFunction) {
          IReversibleFlowFunction rf=(IReversibleFlowFunction)f;
          IntSet sources=rf.getSources(node.getFact());
          if (sources != null) {
            for (IntIterator ii=sources.intIterator(); ii.hasNext(); ) {
              int t=ii.next();
              result.add(new ExplodedSupergraphNode<T>(src,t));
            }
          }
        }
 else {
          Assertions.UNREACHABLE("String_Node_Str" + f.getClass());
        }
      }
    }
  }
  return result.iterator();
}