Program: 11880
Project: 11880
Buggy source:
/** 
 * Parse some tag attributes. The stream is assumed to be positioned right after the tag name. The syntax recognized is: <pre> tag-attrs := empty | attr-list ("&gt;" | "--&gt;" | %&gt;) attr-list := empty | av spaces attr-list empty     := spaces </pre> Where <em>av</em> is defined by <code>parseAttributeValue</code>.
 * @return A HashMap mapping String instances (variable names) intoString instances (variable values).
 */
public HashMap<String,String> parseTagAttributes() throws JETException {
  HashMap<String,String> values=new HashMap<String,String>(11);
  while (true) {
    skipSpaces();
    int ch=peekChar();
    if (ch == endTagFinalChar) {
      return values;
    }
    if (ch == '-') {
      JETMark mark=mark();
      nextChar();
      try {
        if (nextChar() == '-' && nextChar() == endTagFinalChar) {
          return values;
        }
      }
  finally {
        reset(mark);
      }
    }
 else     if (ch == endTagInitialChar) {
      JETMark mark=mark();
      nextChar();
      try {
        if (nextChar() == endTagFinalChar) {
          return values;
        }
      }
  finally {
        reset(mark);
      }
    }
 else     if (ch == '/') {
      JETMark mark=mark();
      nextChar();
      try {
        if (nextChar() == endTagFinalChar) {
          return values;
        }
      }
  finally {
        reset(mark);
      }
    }
    if (ch == -1) {
      break;
    }
    parseAttributeValue(values);
  }
  throw new JETException(CodeGenPlugin.getPlugin().getString("String_Node_Str",new Object[]{mark().toString()}));
}

Fixed version (ground truth):
/** 
 * Parse some tag attributes. The stream is assumed to be positioned right after the tag name. The syntax recognized is: <pre> tag-attributes := empty | attribute-list ("&gt;" | "--&gt;" | %&gt;) attribute-list := empty | attribute-value spaces attribute-list empty     := spaces </pre> Where <em>attribute-value</em> is defined by <code>parseAttributeValue</code>.
 * @return A HashMap mapping String instances (variable names) intoString instances (variable values).
 */
public HashMap<String,String> parseTagAttributes() throws JETException {
  HashMap<String,String> values=new HashMap<String,String>(11);
  while (true) {
    skipSpaces();
    int ch=peekChar();
    if (ch == endTagFinalChar) {
      return values;
    }
    if (ch == '-') {
      JETMark mark=mark();
      nextChar();
      try {
        if (nextChar() == '-' && nextChar() == endTagFinalChar) {
          return values;
        }
      }
  finally {
        reset(mark);
      }
    }
 else     if (ch == endTagInitialChar) {
      JETMark mark=mark();
      nextChar();
      try {
        if (nextChar() == endTagFinalChar) {
          return values;
        }
      }
  finally {
        reset(mark);
      }
    }
 else     if (ch == '/') {
      JETMark mark=mark();
      nextChar();
      try {
        if (nextChar() == endTagFinalChar) {
          return values;
        }
      }
  finally {
        reset(mark);
      }
    }
    if (ch == -1) {
      break;
    }
    parseAttributeValue(values);
  }
  throw new JETException(CodeGenPlugin.getPlugin().getString("String_Node_Str",new Object[]{mark().toString()}));
}