Program: 40569
Project: 40569
Buggy source:
protected void addStatementsForTypeAbstraction(TypeAbstraction T){
  if (DEBUG) {
    Trace.println("String_Node_Str" + T + "String_Node_Str"+ method);
  }
  T=interceptType(T);
  if (T == null) {
    return;
  }
  if ((T instanceof PointType) || (T instanceof ConeType)) {
    TypeReference ref=T.getType().getReference();
    NewSiteReference site=NewSiteReference.make(0,ref);
    IClass klass=options.getClassTargetSelector().getAllocatedTarget(null,site);
    if (DEBUG) {
      Trace.println("String_Node_Str" + klass + "String_Node_Str"+ T);
    }
    if (T instanceof PointType) {
      addStatementsForConcreteType(ref);
    }
 else     if (T instanceof ConeType) {
      if (DEBUG) {
        Trace.println("String_Node_Str" + T);
      }
      if (((ConeType)T).isInterface()) {
        Set implementors=T.getType().getClassHierarchy().getImplementors(ref);
        if (DEBUG) {
          Trace.println("String_Node_Str" + T + "String_Node_Str"+ implementors);
        }
        if (implementors.isEmpty()) {
          if (DEBUG) {
            Trace.println("String_Node_Str" + T);
          }
          Warnings.add(NoSubtypesWarning.create(T));
        }
        if (implementors.size() > CONE_BOUND) {
          Warnings.add(ManySubtypesWarning.create(T,implementors.size()));
        }
        addStatementsForSetOfTypes(implementors.iterator());
      }
 else {
        Collection<IClass> subclasses=T.getType().getClassHierarchy().computeSubClasses(ref);
        if (DEBUG) {
          Trace.println("String_Node_Str" + T + "String_Node_Str"+ subclasses);
        }
        if (subclasses.isEmpty()) {
          if (DEBUG) {
            Trace.println("String_Node_Str" + T);
          }
          Warnings.add(NoSubtypesWarning.create(T));
        }
        if (subclasses.size() > CONE_BOUND) {
          Warnings.add(ManySubtypesWarning.create(T,subclasses.size()));
        }
        addStatementsForSetOfTypes(subclasses.iterator());
      }
    }
 else {
      Assertions.UNREACHABLE("String_Node_Str" + T.getClass());
    }
  }
 else   if (T instanceof SetType) {
    addStatementsForSetOfTypes(((SetType)T).iteratePoints());
  }
 else {
    Assertions.UNREACHABLE("String_Node_Str" + T.getClass());
  }
}

Fixed version (ground truth):
protected void addStatementsForTypeAbstraction(TypeAbstraction T){
  if (DEBUG) {
    Trace.println("String_Node_Str" + T + "String_Node_Str"+ method);
  }
  T=interceptType(T);
  if (T == null) {
    return;
  }
  if ((T instanceof PointType) || (T instanceof ConeType)) {
    TypeReference ref=T.getType().getReference();
    NewSiteReference site=NewSiteReference.make(0,ref);
    IClass klass=options.getClassTargetSelector().getAllocatedTarget(null,site);
    if (DEBUG) {
      Trace.println("String_Node_Str" + klass + "String_Node_Str"+ T);
    }
    if (T instanceof PointType) {
      if (!typesAllocated.contains(ref)) {
        addStatementsForConcreteType(ref);
      }
    }
 else     if (T instanceof ConeType) {
      if (DEBUG) {
        Trace.println("String_Node_Str" + T);
      }
      if (((ConeType)T).isInterface()) {
        Set implementors=T.getType().getClassHierarchy().getImplementors(ref);
        if (DEBUG) {
          Trace.println("String_Node_Str" + T + "String_Node_Str"+ implementors);
        }
        if (implementors.isEmpty()) {
          if (DEBUG) {
            Trace.println("String_Node_Str" + T);
          }
          Warnings.add(NoSubtypesWarning.create(T));
        }
        if (implementors.size() > CONE_BOUND) {
          Warnings.add(ManySubtypesWarning.create(T,implementors.size()));
        }
        addStatementsForSetOfTypes(implementors.iterator());
      }
 else {
        Collection<IClass> subclasses=T.getType().getClassHierarchy().computeSubClasses(ref);
        if (DEBUG) {
          Trace.println("String_Node_Str" + T + "String_Node_Str"+ subclasses);
        }
        if (subclasses.isEmpty()) {
          if (DEBUG) {
            Trace.println("String_Node_Str" + T);
          }
          Warnings.add(NoSubtypesWarning.create(T));
        }
        if (subclasses.size() > CONE_BOUND) {
          Warnings.add(ManySubtypesWarning.create(T,subclasses.size()));
        }
        addStatementsForSetOfTypes(subclasses.iterator());
      }
    }
 else {
      Assertions.UNREACHABLE("String_Node_Str" + T.getClass());
    }
  }
 else   if (T instanceof SetType) {
    addStatementsForSetOfTypes(((SetType)T).iteratePoints());
  }
 else {
    Assertions.UNREACHABLE("String_Node_Str" + T.getClass());
  }
}