Program: 93625
Project: 93625
Buggy source:
/** 
 * {@inheritDoc}
 */
public void createMatches(Comparison comparison,Iterator<? extends EObject> leftEObjects,Iterator<? extends EObject> rightEObjects,Iterator<? extends EObject> originEObjects,Monitor monitor){
  Delegating subMonitor=new BasicMonitor.Delegating(monitor);
  subMonitor.beginTask("String_Node_Str",1);
  int nbElements=0;
  while (leftEObjects.hasNext() || rightEObjects.hasNext() || leftEObjects.hasNext()) {
    if (leftEObjects.hasNext()) {
      EObject next=leftEObjects.next();
      nbElements++;
      index.index(next,Side.LEFT);
      eObjectsToSide.put(next,Side.LEFT);
    }
    if (rightEObjects.hasNext()) {
      EObject next=rightEObjects.next();
      nbElements++;
      index.index(next,Side.RIGHT);
      eObjectsToSide.put(next,Side.RIGHT);
    }
    if (originEObjects.hasNext()) {
      EObject next=originEObjects.next();
      nbElements++;
      index.index(next,Side.ORIGIN);
      eObjectsToSide.put(next,Side.ORIGIN);
    }
  }
  subMonitor.worked(1);
  subMonitor.done();
  subMonitor=new BasicMonitor.Delegating(monitor);
  subMonitor.beginTask("String_Node_Str",nbElements);
  Iterator<EObject> todo=index.getValuesStillThere(Side.LEFT).iterator();
  while (todo.hasNext()) {
    Iterator<EObject> remainingResult=matchList(comparison,todo,subMonitor).iterator();
    todo=remainingResult;
  }
  todo=index.getValuesStillThere(Side.RIGHT).iterator();
  while (todo.hasNext()) {
    Iterator<EObject> remainingResult=matchList(comparison,todo,subMonitor).iterator();
    todo=remainingResult;
  }
  for (  EObject notFound : index.getValuesStillThere(Side.RIGHT)) {
    areMatching(comparison,null,notFound,null);
  }
  for (  EObject notFound : index.getValuesStillThere(Side.LEFT)) {
    areMatching(comparison,notFound,null,null);
  }
  for (  EObject notFound : index.getValuesStillThere(Side.ORIGIN)) {
    areMatching(comparison,null,null,notFound);
  }
  subMonitor.done();
  restructureMatchModel(comparison);
}

Fixed version (ground truth):
/** 
 * {@inheritDoc}
 */
public void createMatches(Comparison comparison,Iterator<? extends EObject> leftEObjects,Iterator<? extends EObject> rightEObjects,Iterator<? extends EObject> originEObjects,Monitor monitor){
  Monitor subMonitor=new BasicMonitor();
  subMonitor.beginTask("String_Node_Str",1);
  int nbElements=0;
  while (leftEObjects.hasNext() || rightEObjects.hasNext() || leftEObjects.hasNext()) {
    if (leftEObjects.hasNext()) {
      EObject next=leftEObjects.next();
      nbElements++;
      index.index(next,Side.LEFT);
      eObjectsToSide.put(next,Side.LEFT);
    }
    if (rightEObjects.hasNext()) {
      EObject next=rightEObjects.next();
      nbElements++;
      index.index(next,Side.RIGHT);
      eObjectsToSide.put(next,Side.RIGHT);
    }
    if (originEObjects.hasNext()) {
      EObject next=originEObjects.next();
      nbElements++;
      index.index(next,Side.ORIGIN);
      eObjectsToSide.put(next,Side.ORIGIN);
    }
  }
  subMonitor.worked(1);
  subMonitor.done();
  subMonitor=new BasicMonitor();
  subMonitor.beginTask("String_Node_Str",nbElements);
  Iterator<EObject> todo=index.getValuesStillThere(Side.LEFT).iterator();
  while (todo.hasNext()) {
    Iterator<EObject> remainingResult=matchList(comparison,todo,subMonitor).iterator();
    todo=remainingResult;
  }
  todo=index.getValuesStillThere(Side.RIGHT).iterator();
  while (todo.hasNext()) {
    Iterator<EObject> remainingResult=matchList(comparison,todo,subMonitor).iterator();
    todo=remainingResult;
  }
  for (  EObject notFound : index.getValuesStillThere(Side.RIGHT)) {
    areMatching(comparison,null,notFound,null);
  }
  for (  EObject notFound : index.getValuesStillThere(Side.LEFT)) {
    areMatching(comparison,notFound,null,null);
  }
  for (  EObject notFound : index.getValuesStillThere(Side.ORIGIN)) {
    areMatching(comparison,null,null,notFound);
  }
  subMonitor.done();
  restructureMatchModel(comparison);
}