Program: 165068
Project: 165068
Buggy source:
public static List<String> extractTypeNames(String sig){
  final List<String> types=new ArrayList<String>();
  SignatureReader reader=new SignatureReader(sig);
  reader.accept(new SignatureVisitor(Opcodes.ASM5){
class AppendType extends SignatureVisitor {
      StringBuilder sb=new StringBuilder();
      int l=0;
      public AppendType(){
        super(Opcodes.ASM5);
      }
      @Override public void visitBaseType(      char descriptor){
        if (descriptor != 'V') {
          sb.append(descriptor);
          visitEnd();
        }
      }
      @Override public void visitTypeVariable(      String name){
        sb.append("String_Node_Str");
        sb.append(name);
        visitEnd();
      }
      @Override public SignatureVisitor visitArrayType(){
        sb.append("String_Node_Str");
        return this;
      }
      @Override public void visitClassType(      String name){
        sb.append("String_Node_Str");
        sb.append(name);
        visitEnd();
      }
      @Override public void visitInnerClassType(      String name){
        visitClassType(name);
      }
      @Override public void visitTypeArgument(){
      }
      @Override public SignatureVisitor visitTypeArgument(      char wildcard){
        l++;
        if (sb.length() == 0) {
          String t=types.remove(types.size() - 1);
          if (t.endsWith("String_Node_Str")) {
            t=t.substring(0,t.length() - 1);
          }
          sb.append(t);
          sb.append("String_Node_Str");
        }
        if (wildcard != '=') {
          sb.append(wildcard);
        }
        return this;
      }
      @Override public void visitEnd(){
        if (l == 0) {
          flush();
        }
 else {
          sb.append("String_Node_Str");
          l--;
        }
      }
      private void flush(){
        if (sb.length() > 0) {
          if (sb.charAt(0) == 'L' || sb.charAt(0) == 'T') {
            sb.append("String_Node_Str");
          }
          types.add(sb.toString());
          sb=new StringBuilder();
        }
      }
    }
    @Override public void visitFormalTypeParameter(    String name){
    }
    @Override public SignatureVisitor visitClassBound(){
      return super.visitInterfaceBound();
    }
    @Override public SignatureVisitor visitInterfaceBound(){
      return super.visitInterfaceBound();
    }
    @Override public SignatureVisitor visitParameterType(){
      return new AppendType();
    }
    @Override public SignatureVisitor visitReturnType(){
      return new AppendType();
    }
    @Override public SignatureVisitor visitExceptionType(){
      return new AppendType();
    }
  }
);
  return types;
}

Fixed version (ground truth):
public static List<String> extractTypeNames(String sig){
  final List<String> types=new ArrayList<String>();
  SignatureReader reader=new SignatureReader(sig);
  reader.accept(new SignatureVisitor(Opcodes.ASM5){
class AppendType extends SignatureVisitor {
      StringBuilder sb=new StringBuilder();
      int l=0;
      public AppendType(){
        super(Opcodes.ASM5);
      }
      @Override public void visitBaseType(      char descriptor){
        if (descriptor != 'V') {
          sb.append(descriptor);
          visitEnd();
        }
      }
      @Override public void visitTypeVariable(      String name){
        sb.append("String_Node_Str");
        sb.append(name);
        visitEnd();
      }
      @Override public SignatureVisitor visitArrayType(){
        sb.append("String_Node_Str");
        return this;
      }
      @Override public void visitClassType(      String name){
        sb.append("String_Node_Str");
        sb.append(name);
        visitEnd();
      }
      @Override public void visitInnerClassType(      String name){
        visitClassType(name);
      }
      @Override public void visitTypeArgument(){
      }
      @Override public SignatureVisitor visitTypeArgument(      char wildcard){
        l++;
        if (sb.length() == 0) {
          String t=types.remove(types.size() - 1);
          if (t.endsWith("String_Node_Str")) {
            t=t.substring(0,t.length() - 1);
          }
          if (t.endsWith("String_Node_Str")) {
            t=t.substring(0,t.length() - 1);
            sb.append(t);
          }
 else {
            sb.append(t);
            sb.append("String_Node_Str");
          }
        }
        if (wildcard != '=') {
          sb.append(wildcard);
        }
        return this;
      }
      @Override public void visitEnd(){
        if (l == 0) {
          flush();
        }
 else {
          sb.append("String_Node_Str");
          l--;
        }
      }
      private void flush(){
        if (sb.length() > 0) {
          if (sb.charAt(0) == 'L' || sb.charAt(0) == 'T') {
            sb.append("String_Node_Str");
          }
          types.add(sb.toString());
          sb=new StringBuilder();
        }
      }
    }
    @Override public void visitFormalTypeParameter(    String name){
    }
    @Override public SignatureVisitor visitClassBound(){
      return super.visitInterfaceBound();
    }
    @Override public SignatureVisitor visitInterfaceBound(){
      return super.visitInterfaceBound();
    }
    @Override public SignatureVisitor visitParameterType(){
      return new AppendType();
    }
    @Override public SignatureVisitor visitReturnType(){
      return new AppendType();
    }
    @Override public SignatureVisitor visitExceptionType(){
      return new AppendType();
    }
  }
);
  return types;
}