Program: 83411
Project: 83411
Buggy source:
private static int readTyped(String desc,int start,ITypeConsumer consumer){
  int array=0;
  char c;
  while ((c=desc.charAt(start)) == '[') {
    array++;
    start++;
  }
switch (c) {
case 'V':
    consumer.setType(ArrayType.getArrayType(Types.VOID,array));
  return start + 1;
case 'Z':
consumer.setType(ArrayType.getArrayType(Types.BOOLEAN,array));
return start + 1;
case 'B':
consumer.setType(ArrayType.getArrayType(Types.BYTE,array));
return start + 1;
case 'S':
consumer.setType(ArrayType.getArrayType(Types.SHORT,array));
return start + 1;
case 'C':
consumer.setType(ArrayType.getArrayType(Types.CHAR,array));
return start + 1;
case 'I':
consumer.setType(ArrayType.getArrayType(Types.INT,array));
return start + 1;
case 'J':
consumer.setType(ArrayType.getArrayType(Types.LONG,array));
return start + 1;
case 'F':
consumer.setType(ArrayType.getArrayType(Types.FLOAT,array));
return start + 1;
case 'D':
consumer.setType(ArrayType.getArrayType(Types.DOUBLE,array));
return start + 1;
case 'L':
{
int end1=getMatchingSemicolon(desc,start,desc.length());
IType type=readReferenceType(desc,start + 1,end1);
if (array > 0) {
type=ArrayType.getArrayType(type,array);
}
consumer.setType(type);
return end1 + 1;
}
case 'T':
{
int end1=desc.indexOf(';',start);
IType type=new InternalTypeVarType(desc.substring(start + 1,end1));
if (array > 0) {
type=ArrayType.getArrayType(type,array);
}
consumer.setType(type);
return end1 + 1;
}
case '*':
consumer.setType(new WildcardType());
return start + 1;
case '+':
{
int end1=getMatchingSemicolon(desc,start,desc.length());
WildcardType var=new WildcardType();
var.addUpperBound(readType(desc,start + 1,end1));
consumer.setType(var);
return end1 + 1;
}
case '-':
{
int end1=getMatchingSemicolon(desc,start,desc.length());
WildcardType var=new WildcardType();
var.setLowerBound(readType(desc,start + 1,end1));
consumer.setType(var);
return end1 + 1;
}
}
return start;
}

Fixed version (ground truth):
private static int readTyped(String desc,int start,ITypeConsumer consumer){
  int array=0;
  char c;
  while ((c=desc.charAt(start)) == '[') {
    array++;
    start++;
  }
switch (c) {
case 'V':
    consumer.setType(ArrayType.getArrayType(Types.VOID,array));
  return start + 1;
case 'Z':
consumer.setType(ArrayType.getArrayType(Types.BOOLEAN,array));
return start + 1;
case 'B':
consumer.setType(ArrayType.getArrayType(Types.BYTE,array));
return start + 1;
case 'S':
consumer.setType(ArrayType.getArrayType(Types.SHORT,array));
return start + 1;
case 'C':
consumer.setType(ArrayType.getArrayType(Types.CHAR,array));
return start + 1;
case 'I':
consumer.setType(ArrayType.getArrayType(Types.INT,array));
return start + 1;
case 'J':
consumer.setType(ArrayType.getArrayType(Types.LONG,array));
return start + 1;
case 'F':
consumer.setType(ArrayType.getArrayType(Types.FLOAT,array));
return start + 1;
case 'D':
consumer.setType(ArrayType.getArrayType(Types.DOUBLE,array));
return start + 1;
case 'L':
{
int end1=getMatchingSemicolon(desc,start,desc.length());
IType type=readReferenceType(desc,start + 1,end1);
if (array > 0) {
type=ArrayType.getArrayType(type,array);
}
consumer.setType(type);
return end1 + 1;
}
case 'T':
{
int end1=desc.indexOf(';',start);
IType type=new InternalTypeVarType(desc.substring(start + 1,end1));
if (array > 0) {
type=ArrayType.getArrayType(type,array);
}
consumer.setType(type);
return end1 + 1;
}
case '*':
consumer.setType(new WildcardType());
return start + 1;
case '+':
{
int end1=getMatchingSemicolon(desc,start,desc.length());
WildcardType var=new WildcardType();
var.setUpperBound(readType(desc,start + 1,end1));
consumer.setType(var);
return end1 + 1;
}
case '-':
{
int end1=getMatchingSemicolon(desc,start,desc.length());
WildcardType var=new WildcardType();
var.setLowerBound(readType(desc,start + 1,end1));
consumer.setType(var);
return end1 + 1;
}
}
return start;
}