Program: 27708
Project: 27708
Buggy source:
/** 
 * Mixin methods from the mixin class into the target class
 * @param targetClass
 * @param mixinClass
 */
private void applyMixinMethods(ClassNode targetClass,ClassNode mixinClass){
  for (  MethodNode mixinMethod : mixinClass.methods) {
    this.transformMethod(mixinMethod,mixinClass.name,targetClass.name);
    boolean isShadow=ASMHelper.getVisibleAnnotation(mixinMethod,Shadow.class) != null;
    boolean isOverwrite=ASMHelper.getVisibleAnnotation(mixinMethod,Overwrite.class) != null;
    boolean isAbstract=MixinTransformer.hasFlag(mixinMethod,Opcodes.ACC_ABSTRACT);
    if (isShadow || isAbstract) {
      MethodNode target=this.findTargetMethod(targetClass,mixinMethod);
      if (target == null) {
        throw new InvalidMixinException(String.format("String_Node_Str",mixinMethod.name));
      }
    }
 else     if (!mixinMethod.name.startsWith("String_Node_Str")) {
      if (MixinTransformer.hasFlag(mixinMethod,Opcodes.ACC_STATIC) && !MixinTransformer.hasFlag(mixinMethod,Opcodes.ACC_PRIVATE) && !isOverwrite) {
        throw new InvalidMixinException(String.format("String_Node_Str",mixinMethod.name));
      }
      MethodNode target=this.findTargetMethod(targetClass,mixinMethod);
      if (target != null) {
        targetClass.methods.remove(target);
      }
 else       if (isOverwrite) {
        throw new InvalidMixinException(String.format("String_Node_Str",mixinMethod.name));
      }
      targetClass.methods.add(mixinMethod);
    }
 else     if ("String_Node_Str".equals(mixinMethod.name)) {
      this.appendInsns(targetClass,mixinMethod.name,mixinMethod);
    }
  }
}

Fixed version (ground truth):
/** 
 * Mixin methods from the mixin class into the target class
 * @param targetClass
 * @param mixin
 */
private void applyMixinMethods(ClassNode targetClass,MixinData mixin){
  for (  MethodNode mixinMethod : mixin.getClassNode().methods) {
    this.transformMethod(mixinMethod,mixin.getClassNode().name,targetClass.name);
    boolean isShadow=ASMHelper.getVisibleAnnotation(mixinMethod,Shadow.class) != null;
    boolean isOverwrite=ASMHelper.getVisibleAnnotation(mixinMethod,Overwrite.class) != null;
    boolean isAbstract=MixinTransformer.hasFlag(mixinMethod,Opcodes.ACC_ABSTRACT);
    if (isShadow || isAbstract) {
      MethodNode target=this.findTargetMethod(targetClass,mixinMethod);
      if (target == null) {
        throw new InvalidMixinException(String.format("String_Node_Str",mixinMethod.name));
      }
    }
 else     if (!mixinMethod.name.startsWith("String_Node_Str")) {
      if (MixinTransformer.hasFlag(mixinMethod,Opcodes.ACC_STATIC) && !MixinTransformer.hasFlag(mixinMethod,Opcodes.ACC_PRIVATE) && !isOverwrite) {
        throw new InvalidMixinException(String.format("String_Node_Str",mixinMethod.name));
      }
      MethodNode target=this.findTargetMethod(targetClass,mixinMethod);
      if (target != null) {
        targetClass.methods.remove(target);
      }
 else       if (isOverwrite) {
        throw new InvalidMixinException(String.format("String_Node_Str",mixinMethod.name));
      }
      targetClass.methods.add(mixinMethod);
    }
 else     if ("String_Node_Str".equals(mixinMethod.name)) {
      this.appendInsns(targetClass,mixinMethod.name,mixinMethod);
    }
  }
}