Program: 40526
Project: 40526
Buggy source:
/** 
 * Is c a subclass of T?
 * @throws IllegalArgumentException if c is null
 */
public boolean isSubclassOf(IClass c,IClass T){
  if (c == null) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (Assertions.verifyAssertions) {
    Assertions._assert(T != null,"String_Node_Str");
  }
  if (c.isArrayClass()) {
    if (T.getReference() == TypeReference.JavaLangObject) {
      return true;
    }
 else     if (T.getReference().isArrayType()) {
      TypeReference elementType=T.getReference().getArrayElementType();
      if (elementType.isPrimitiveType()) {
        return elementType.equals(c.getReference().getArrayElementType());
      }
 else {
        IClass elementKlass=lookupClass(elementType);
        if (elementKlass == null) {
          Warnings.add(ClassHierarchyWarning.create("String_Node_Str" + elementType));
          return false;
        }
        IClass ce=((ArrayClass)c).getElementClass();
        if (ce == null) {
          return false;
        }
        return isSubclassOf(ce,elementKlass);
      }
    }
 else {
      return false;
    }
  }
 else {
    if (T.getReference().isArrayType()) {
      return false;
    }
    if (c.getReference().equals(T.getReference())) {
      return true;
    }
    Node n1=map.get(c);
    if (n1 == null) {
      return false;
    }
    Node n2=map.get(T);
    if (n2 == null) {
      return false;
    }
    if (n1.left == -1) {
      return slowIsSubclass(c,T);
    }
 else     if (n2.left == -1) {
      return slowIsSubclass(c,T);
    }
 else {
      return (n2.left <= n1.left) && (n1.left <= n2.right);
    }
  }
}

Fixed version (ground truth):
/** 
 * Is c a subclass of T?
 * @throws IllegalArgumentException if c is null
 */
public boolean isSubclassOf(IClass c,IClass T){
  if (c == null) {
    throw new IllegalArgumentException("String_Node_Str");
  }
  if (Assertions.verifyAssertions) {
    Assertions._assert(T != null,"String_Node_Str");
  }
  if (c.isArrayClass()) {
    if (T.getReference() == TypeReference.JavaLangObject) {
      return true;
    }
 else     if (T.getReference().isArrayType()) {
      TypeReference elementType=T.getReference().getArrayElementType();
      if (elementType.isPrimitiveType()) {
        return elementType.equals(c.getReference().getArrayElementType());
      }
 else {
        IClass elementKlass=lookupClass(elementType);
        if (elementKlass == null) {
          Warnings.add(ClassHierarchyWarning.create("String_Node_Str" + elementType));
          return false;
        }
        IClass ce=((ArrayClass)c).getElementClass();
        if (ce == null) {
          return false;
        }
        if (elementKlass.isInterface()) {
          return implementsInterface(ce,elementKlass);
        }
 else {
          return isSubclassOf(ce,elementKlass);
        }
      }
    }
 else {
      return false;
    }
  }
 else {
    if (T.getReference().isArrayType()) {
      return false;
    }
    if (c.getReference().equals(T.getReference())) {
      return true;
    }
    Node n1=map.get(c);
    if (n1 == null) {
      return false;
    }
    Node n2=map.get(T);
    if (n2 == null) {
      return false;
    }
    if (n1.left == -1) {
      return slowIsSubclass(c,T);
    }
 else     if (n2.left == -1) {
      return slowIsSubclass(c,T);
    }
 else {
      return (n2.left <= n1.left) && (n1.left <= n2.right);
    }
  }
}