Program: 61535
Project: 61535
Buggy source:
public ABC(ABCInputStream ais,SWF swf,ABCContainerTag tag) throws IOException {
  this.parentTag=tag;
  minor_version=ais.readU16("String_Node_Str");
  major_version=ais.readU16("String_Node_Str");
  logger.log(Level.FINE,"String_Node_Str",new Object[]{minor_version,major_version});
  constants=new AVM2ConstantPool();
  ais.newDumpLevel("String_Node_Str","String_Node_Str");
  int constant_int_pool_count=ais.readU30("String_Node_Str");
  constants.constant_int=new ArrayList<>(constant_int_pool_count);
  if (constant_int_pool_count > 0) {
    constants.addInt(0);
  }
  if (constant_int_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_int_pool_count; i++) {
      constants.addInt(ais.readS32("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  int constant_uint_pool_count=ais.readU30("String_Node_Str");
  constants.constant_uint=new ArrayList<>(constant_uint_pool_count);
  if (constant_uint_pool_count > 0) {
    constants.addUInt(0);
  }
  if (constant_uint_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_uint_pool_count; i++) {
      constants.addUInt(ais.readU32("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  int constant_double_pool_count=ais.readU30("String_Node_Str");
  constants.constant_double=new ArrayList<>(constant_double_pool_count);
  if (constant_double_pool_count > 0) {
    constants.addDouble(0);
  }
  if (constant_double_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_double_pool_count; i++) {
      constants.addDouble(ais.readDouble("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  if (minor_version >= MINORwithDECIMAL) {
    int constant_decimal_pool_count=ais.readU30("String_Node_Str");
    constants.constant_decimal=new ArrayList<>(constant_decimal_pool_count);
    if (constant_decimal_pool_count > 0) {
      constants.addDecimal(null);
    }
    if (constant_decimal_pool_count > 1) {
      ais.newDumpLevel("String_Node_Str","String_Node_Str");
      for (int i=1; i < constant_decimal_pool_count; i++) {
        constants.addDecimal(ais.readDecimal("String_Node_Str"));
      }
      ais.endDumpLevel();
    }
  }
 else {
    constants.constant_decimal=new ArrayList<>(0);
  }
  int constant_string_pool_count=ais.readU30("String_Node_Str");
  constants.constant_string=new ArrayList<>(constant_string_pool_count);
  stringOffsets=new long[constant_string_pool_count];
  if (constant_string_pool_count > 0) {
    constants.addString("String_Node_Str");
  }
  if (constant_string_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_string_pool_count; i++) {
      long pos=ais.getPosition();
      constants.addString(ais.readString("String_Node_Str"));
      stringOffsets[i]=pos;
    }
    ais.endDumpLevel();
  }
  int constant_namespace_pool_count=ais.readU30("String_Node_Str");
  constants.constant_namespace=new ArrayList<>(constant_namespace_pool_count);
  if (constant_namespace_pool_count > 0) {
    constants.addNamespace(null);
  }
  if (constant_namespace_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_namespace_pool_count; i++) {
      constants.addNamespace(ais.readNamespace("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  int constant_namespace_set_pool_count=ais.readU30("String_Node_Str");
  constants.constant_namespace_set=new ArrayList<>(constant_namespace_set_pool_count);
  if (constant_namespace_set_pool_count > 0) {
    constants.addNamespaceSet(null);
  }
  if (constant_namespace_set_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_namespace_set_pool_count; i++) {
      ais.newDumpLevel("String_Node_Str","String_Node_Str");
      constants.addNamespaceSet(new NamespaceSet());
      int namespace_count=ais.readU30("String_Node_Str");
      constants.getNamespaceSet(i).namespaces=new int[namespace_count];
      for (int j=0; j < namespace_count; j++) {
        constants.getNamespaceSet(i).namespaces[j]=ais.readU30("String_Node_Str");
      }
      ais.endDumpLevel();
    }
    ais.endDumpLevel();
  }
  int constant_multiname_pool_count=ais.readU30("String_Node_Str");
  constants.constant_multiname=new ArrayList<>(constant_multiname_pool_count);
  if (constant_multiname_pool_count > 0) {
    constants.addMultiname(null);
  }
  if (constant_multiname_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_multiname_pool_count; i++) {
      constants.addMultiname(ais.readMultiname("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  ais.endDumpLevel();
  int methods_count=ais.readU30("String_Node_Str");
  method_info=new ArrayList<>(methods_count);
  for (int i=0; i < methods_count; i++) {
    method_info.add(ais.readMethodInfo("String_Node_Str"));
  }
  int metadata_count=ais.readU30("String_Node_Str");
  metadata_info=new ArrayList<>(metadata_count);
  for (int i=0; i < metadata_count; i++) {
    int name_index=ais.readU30("String_Node_Str");
    int values_count=ais.readU30("String_Node_Str");
    int[] keys=new int[values_count];
    for (int v=0; v < values_count; v++) {
      keys[v]=ais.readU30("String_Node_Str");
    }
    int[] values=new int[values_count];
    for (int v=0; v < values_count; v++) {
      values[v]=ais.readU30("String_Node_Str");
    }
    metadata_info.add(new MetadataInfo(name_index,keys,values));
  }
  int class_count=ais.readU30("String_Node_Str");
  instance_info=new ArrayList<>(class_count);
  for (int i=0; i < class_count; i++) {
    instance_info.add(ais.readInstanceInfo("String_Node_Str"));
  }
  class_info=new ArrayList<>(class_count);
  for (int i=0; i < class_count; i++) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    ClassInfo ci=new ClassInfo(null);
    ci.cinit_index=ais.readU30("String_Node_Str");
    ci.static_traits=ais.readTraits("String_Node_Str");
    class_info.add(ci);
    ais.endDumpLevel();
  }
  int script_count=ais.readU30("String_Node_Str");
  script_info=new ArrayList<>(script_count);
  for (int i=0; i < script_count; i++) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    ScriptInfo si=new ScriptInfo(null);
    si.init_index=ais.readU30("String_Node_Str");
    si.traits=ais.readTraits("String_Node_Str");
    script_info.add(si);
    ais.endDumpLevel();
    si.setModified(false);
  }
  int bodies_count=ais.readU30("String_Node_Str");
  bodies=new ArrayList<>(bodies_count);
  for (int i=0; i < bodies_count; i++) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    MethodBody mb=new MethodBody(null,null,null);
    mb.method_info=ais.readU30("String_Node_Str");
    mb.max_stack=ais.readU30("String_Node_Str");
    mb.max_regs=ais.readU30("String_Node_Str");
    mb.init_scope_depth=ais.readU30("String_Node_Str");
    mb.max_scope_depth=ais.readU30("String_Node_Str");
    int code_length=ais.readU30("String_Node_Str");
    mb.setCodeBytes(ais.readBytes(code_length,"String_Node_Str"));
    int ex_count=ais.readU30("String_Node_Str");
    mb.exceptions=new ABCException[ex_count];
    for (int j=0; j < ex_count; j++) {
      ABCException abce=new ABCException();
      abce.start=ais.readU30("String_Node_Str");
      abce.end=ais.readU30("String_Node_Str");
      abce.target=ais.readU30("String_Node_Str");
      abce.type_index=ais.readU30("String_Node_Str");
      abce.name_index=ais.readU30("String_Node_Str");
      mb.exceptions[j]=abce;
    }
    mb.traits=ais.readTraits("String_Node_Str");
    bodies.add(mb);
    method_info.get(mb.method_info).setBody(mb);
    ais.endDumpLevel();
    SWFDecompilerPlugin.fireMethodBodyParsed(mb,swf);
  }
  SWFDecompilerPlugin.fireAbcParsed(this,swf);
}

Fixed version (ground truth):
public ABC(ABCInputStream ais,SWF swf,ABCContainerTag tag) throws IOException {
  this.parentTag=tag;
  minor_version=ais.readU16("String_Node_Str");
  major_version=ais.readU16("String_Node_Str");
  logger.log(Level.FINE,"String_Node_Str",new Object[]{minor_version,major_version});
  constants=new AVM2ConstantPool();
  ais.newDumpLevel("String_Node_Str","String_Node_Str");
  int constant_int_pool_count=ais.readU30("String_Node_Str");
  constants.constant_int=new ArrayList<>(constant_int_pool_count);
  if (constant_int_pool_count > 0) {
    constants.addInt(0);
  }
  if (constant_int_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_int_pool_count; i++) {
      constants.addInt(ais.readS32("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  int constant_uint_pool_count=ais.readU30("String_Node_Str");
  constants.constant_uint=new ArrayList<>(constant_uint_pool_count);
  if (constant_uint_pool_count > 0) {
    constants.addUInt(0);
  }
  if (constant_uint_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_uint_pool_count; i++) {
      constants.addUInt(ais.readU32("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  int constant_double_pool_count=ais.readU30("String_Node_Str");
  constants.constant_double=new ArrayList<>(constant_double_pool_count);
  if (constant_double_pool_count > 0) {
    constants.addDouble(0);
  }
  if (constant_double_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_double_pool_count; i++) {
      constants.addDouble(ais.readDouble("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  if (minor_version >= MINORwithDECIMAL) {
    int constant_decimal_pool_count=ais.readU30("String_Node_Str");
    constants.constant_decimal=new ArrayList<>(constant_decimal_pool_count);
    if (constant_decimal_pool_count > 0) {
      constants.addDecimal(null);
    }
    if (constant_decimal_pool_count > 1) {
      ais.newDumpLevel("String_Node_Str","String_Node_Str");
      for (int i=1; i < constant_decimal_pool_count; i++) {
        constants.addDecimal(ais.readDecimal("String_Node_Str"));
      }
      ais.endDumpLevel();
    }
  }
 else {
    constants.constant_decimal=new ArrayList<>(0);
  }
  int constant_string_pool_count=ais.readU30("String_Node_Str");
  constants.constant_string=new ArrayList<>(constant_string_pool_count);
  stringOffsets=new long[constant_string_pool_count];
  if (constant_string_pool_count > 0) {
    constants.addString("String_Node_Str");
  }
  if (constant_string_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_string_pool_count; i++) {
      long pos=ais.getPosition();
      constants.addString(ais.readString("String_Node_Str"));
      stringOffsets[i]=pos;
    }
    ais.endDumpLevel();
  }
  int constant_namespace_pool_count=ais.readU30("String_Node_Str");
  constants.constant_namespace=new ArrayList<>(constant_namespace_pool_count);
  if (constant_namespace_pool_count > 0) {
    constants.addNamespace(null);
  }
  if (constant_namespace_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_namespace_pool_count; i++) {
      constants.addNamespace(ais.readNamespace("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  int constant_namespace_set_pool_count=ais.readU30("String_Node_Str");
  constants.constant_namespace_set=new ArrayList<>(constant_namespace_set_pool_count);
  if (constant_namespace_set_pool_count > 0) {
    constants.addNamespaceSet(null);
  }
  if (constant_namespace_set_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_namespace_set_pool_count; i++) {
      ais.newDumpLevel("String_Node_Str","String_Node_Str");
      constants.addNamespaceSet(new NamespaceSet());
      int namespace_count=ais.readU30("String_Node_Str");
      constants.getNamespaceSet(i).namespaces=new int[namespace_count];
      for (int j=0; j < namespace_count; j++) {
        constants.getNamespaceSet(i).namespaces[j]=ais.readU30("String_Node_Str");
      }
      ais.endDumpLevel();
    }
    ais.endDumpLevel();
  }
  int constant_multiname_pool_count=ais.readU30("String_Node_Str");
  constants.constant_multiname=new ArrayList<>(constant_multiname_pool_count);
  if (constant_multiname_pool_count > 0) {
    constants.addMultiname(null);
  }
  if (constant_multiname_pool_count > 1) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    for (int i=1; i < constant_multiname_pool_count; i++) {
      constants.addMultiname(ais.readMultiname("String_Node_Str"));
    }
    ais.endDumpLevel();
  }
  ais.endDumpLevel();
  int methods_count=ais.readU30("String_Node_Str");
  method_info=new ArrayList<>(methods_count);
  for (int i=0; i < methods_count; i++) {
    method_info.add(ais.readMethodInfo("String_Node_Str"));
  }
  int metadata_count=ais.readU30("String_Node_Str");
  metadata_info=new ArrayList<>(metadata_count);
  for (int i=0; i < metadata_count; i++) {
    int name_index=ais.readU30("String_Node_Str");
    int values_count=ais.readU30("String_Node_Str");
    int[] keys=new int[values_count];
    for (int v=0; v < values_count; v++) {
      keys[v]=ais.readU30("String_Node_Str");
    }
    int[] values=new int[values_count];
    for (int v=0; v < values_count; v++) {
      values[v]=ais.readU30("String_Node_Str");
    }
    metadata_info.add(new MetadataInfo(name_index,keys,values));
  }
  int class_count=ais.readU30("String_Node_Str");
  instance_info=new ArrayList<>(class_count);
  for (int i=0; i < class_count; i++) {
    instance_info.add(ais.readInstanceInfo("String_Node_Str"));
  }
  class_info=new ArrayList<>(class_count);
  for (int i=0; i < class_count; i++) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    ClassInfo ci=new ClassInfo(null);
    ci.cinit_index=ais.readU30("String_Node_Str");
    ci.static_traits=ais.readTraits("String_Node_Str");
    class_info.add(ci);
    ais.endDumpLevel();
  }
  int script_count=ais.readU30("String_Node_Str");
  script_info=new ArrayList<>(script_count);
  for (int i=0; i < script_count; i++) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    ScriptInfo si=new ScriptInfo(null);
    si.init_index=ais.readU30("String_Node_Str");
    si.traits=ais.readTraits("String_Node_Str");
    script_info.add(si);
    ais.endDumpLevel();
    si.setModified(false);
  }
  int bodies_count=ais.readU30("String_Node_Str");
  bodies=new ArrayList<>(bodies_count);
  for (int i=0; i < bodies_count; i++) {
    ais.newDumpLevel("String_Node_Str","String_Node_Str");
    MethodBody mb=new MethodBody(this,null,null,null);
    mb.method_info=ais.readU30("String_Node_Str");
    mb.max_stack=ais.readU30("String_Node_Str");
    mb.max_regs=ais.readU30("String_Node_Str");
    mb.init_scope_depth=ais.readU30("String_Node_Str");
    mb.max_scope_depth=ais.readU30("String_Node_Str");
    int code_length=ais.readU30("String_Node_Str");
    mb.setCodeBytes(ais.readBytes(code_length,"String_Node_Str"));
    int ex_count=ais.readU30("String_Node_Str");
    mb.exceptions=new ABCException[ex_count];
    for (int j=0; j < ex_count; j++) {
      ABCException abce=new ABCException();
      abce.start=ais.readU30("String_Node_Str");
      abce.end=ais.readU30("String_Node_Str");
      abce.target=ais.readU30("String_Node_Str");
      abce.type_index=ais.readU30("String_Node_Str");
      abce.name_index=ais.readU30("String_Node_Str");
      mb.exceptions[j]=abce;
    }
    mb.traits=ais.readTraits("String_Node_Str");
    bodies.add(mb);
    method_info.get(mb.method_info).setBody(mb);
    ais.endDumpLevel();
    SWFDecompilerPlugin.fireMethodBodyParsed(mb,swf);
  }
  SWFDecompilerPlugin.fireAbcParsed(this,swf);
}