Program: 147313
Project: 147313
Buggy source:
/** 
 * this is the backend for System.arraycopy implementations, but since it only throws general exceptions it can also be used in other contexts that require type and objRef checking note that we have to do some additional type checking here because we store reference arrays as int[], i.e. for reference arrays we can't rely on System.arraycopy to do the element type checking for us
 * @throws java.lang.ArrayIndexOutOfBoundsException
 * @throws java.lang.ArrayStoreException
 */
public void copyElements(FeatureExpr ctx,ThreadInfo ti,ElementInfo eiSrc,int srcIdx,int dstIdx,int length){
  if (!isArray()) {
    throw new ArrayStoreException("String_Node_Str" + ci.getName());
  }
  if (!eiSrc.isArray()) {
    throw new ArrayStoreException("String_Node_Str" + eiSrc.getClassInfo().getName());
  }
  boolean isRefArray=isReferenceArray();
  if (eiSrc.isReferenceArray() != isRefArray) {
    throw new ArrayStoreException("String_Node_Str" + eiSrc.getClassInfo().getName() + "String_Node_Str"+ ci.getName());
  }
  if (isRefArray) {
    ClassInfo dstElementCi=ci.getComponentClassInfo();
    Conditional<Integer>[] srcRefs=((ArrayFields)eiSrc.fields).asReferenceArray();
    int max=srcIdx + length;
    for (int i=srcIdx; i < max; i++) {
      List<Integer> erefs=srcRefs[i].simplify(ctx).toList();
      for (      int eref : erefs) {
        if (eref != MJIEnv.NULL) {
          ClassInfo srcElementCi=ti.getClassInfo(eref);
          if (!srcElementCi.isInstanceOf(dstElementCi)) {
            throw new ArrayStoreException("String_Node_Str" + dstElementCi.getName() + "String_Node_Str"+ srcElementCi.getName());
          }
        }
      }
    }
  }
  checkIsModifiable();
  Conditional<?> srcVals=((ArrayFields)eiSrc.getFields()).getValues();
  Conditional<?> dstVals=((ArrayFields)fields).getValues();
  if (srcVals instanceof One && dstVals instanceof One) {
    if (srcVals.getValue() instanceof Conditional[]) {
      try {
        Fields src=eiSrc.getFields();
        if (src == fields) {
          src=src.clone();
        }
        if (src instanceof DoubleArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setDoubleValue(ctx,dstIdx + i,src.getDoubleValue(i + srcIdx));
          }
        }
 else         if (eiSrc.getFields() instanceof LongArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setLongValue(ctx,dstIdx + i,src.getLongValue(i + srcIdx));
          }
        }
 else         if (eiSrc.getFields() instanceof IntArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setIntValue(ctx,dstIdx + i,src.getIntValue(i + srcIdx));
          }
        }
 else         if (eiSrc.getFields() instanceof ByteArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setByteValue(ctx,dstIdx + i,src.getByteValue(i + srcIdx));
          }
        }
 else         if (eiSrc.getFields() instanceof ReferenceArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setReferenceValue(ctx,dstIdx + i,src.getReferenceValue(i + srcIdx));
          }
        }
 else {
          throw new RuntimeException("String_Node_Str" + src.getClass());
        }
      }
 catch (      JPFException e) {
        throw new ArrayStoreException(e.getMessage());
      }
    }
 else {
      System.arraycopy(srcVals.getValue(),srcIdx,dstVals.getValue(),dstIdx,length);
    }
  }
 else {
    if (fields instanceof CharArrayFields) {
      for (int i=0; i < length; i++) {
        fields.setCharValue(ctx,dstIdx + i,eiSrc.getFields().getCharValue(i + srcIdx));
      }
    }
 else {
      throw new RuntimeException("String_Node_Str");
    }
  }
  if (eiSrc.hasFieldAttr()) {
    if (eiSrc == this && srcIdx < dstIdx) {
      for (int i=length - 1; i >= 0; i--) {
        Object a=eiSrc.getElementAttr(srcIdx + i);
        setElementAttr(dstIdx + i,a);
      }
    }
 else {
      for (int i=0; i < length; i++) {
        Object a=eiSrc.getElementAttr(srcIdx + i);
        setElementAttr(dstIdx + i,a);
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * this is the backend for System.arraycopy implementations, but since it only throws general exceptions it can also be used in other contexts that require type and objRef checking note that we have to do some additional type checking here because we store reference arrays as int[], i.e. for reference arrays we can't rely on System.arraycopy to do the element type checking for us
 * @throws java.lang.ArrayIndexOutOfBoundsException
 * @throws java.lang.ArrayStoreException
 */
public void copyElements(FeatureExpr ctx,ThreadInfo ti,ElementInfo eiSrc,int srcIdx,int dstIdx,int length){
  if (ctx.isContradiction()) {
    return;
  }
  if (!isArray()) {
    throw new ArrayStoreException("String_Node_Str" + ci.getName());
  }
  if (!eiSrc.isArray()) {
    throw new ArrayStoreException("String_Node_Str" + eiSrc.getClassInfo().getName());
  }
  boolean isRefArray=isReferenceArray();
  if (eiSrc.isReferenceArray() != isRefArray) {
    throw new ArrayStoreException("String_Node_Str" + eiSrc.getClassInfo().getName() + "String_Node_Str"+ ci.getName());
  }
  if (isRefArray) {
    ClassInfo dstElementCi=ci.getComponentClassInfo();
    Conditional<Integer>[] srcRefs=((ArrayFields)eiSrc.fields).asReferenceArray();
    int max=srcIdx + length;
    for (int i=srcIdx; i < max; i++) {
      List<Integer> erefs=srcRefs[i].simplify(ctx).toList();
      for (      int eref : erefs) {
        if (eref != MJIEnv.NULL) {
          ClassInfo srcElementCi=ti.getClassInfo(eref);
          if (!srcElementCi.isInstanceOf(dstElementCi)) {
            throw new ArrayStoreException("String_Node_Str" + dstElementCi.getName() + "String_Node_Str"+ srcElementCi.getName());
          }
        }
      }
    }
  }
  checkIsModifiable();
  Conditional<?> srcVals=((ArrayFields)eiSrc.getFields()).getValues();
  Conditional<?> dstVals=((ArrayFields)fields).getValues();
  if (srcVals instanceof One && dstVals instanceof One) {
    if (srcVals.getValue() instanceof Conditional[]) {
      try {
        Fields src=eiSrc.getFields();
        if (src == fields) {
          src=src.clone();
        }
        if (src instanceof DoubleArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setDoubleValue(ctx,dstIdx + i,src.getDoubleValue(i + srcIdx));
          }
        }
 else         if (eiSrc.getFields() instanceof LongArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setLongValue(ctx,dstIdx + i,src.getLongValue(i + srcIdx));
          }
        }
 else         if (eiSrc.getFields() instanceof IntArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setIntValue(ctx,dstIdx + i,src.getIntValue(i + srcIdx));
          }
        }
 else         if (eiSrc.getFields() instanceof ByteArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setByteValue(ctx,dstIdx + i,src.getByteValue(i + srcIdx));
          }
        }
 else         if (eiSrc.getFields() instanceof ReferenceArrayFields) {
          for (int i=0; i < length; i++) {
            fields.setReferenceValue(ctx,dstIdx + i,src.getReferenceValue(i + srcIdx));
          }
        }
 else {
          throw new RuntimeException("String_Node_Str" + src.getClass());
        }
      }
 catch (      JPFException e) {
        throw new ArrayStoreException(e.getMessage());
      }
    }
 else {
      System.arraycopy(srcVals.getValue(),srcIdx,dstVals.getValue(),dstIdx,length);
    }
  }
 else {
    if (fields instanceof CharArrayFields) {
      for (int i=0; i < length; i++) {
        fields.setCharValue(ctx,dstIdx + i,eiSrc.getFields().getCharValue(i + srcIdx));
      }
    }
 else {
      throw new RuntimeException("String_Node_Str");
    }
  }
  if (eiSrc.hasFieldAttr()) {
    if (eiSrc == this && srcIdx < dstIdx) {
      for (int i=length - 1; i >= 0; i--) {
        Object a=eiSrc.getElementAttr(srcIdx + i);
        setElementAttr(dstIdx + i,a);
      }
    }
 else {
      for (int i=0; i < length; i++) {
        Object a=eiSrc.getElementAttr(srcIdx + i);
        setElementAttr(dstIdx + i,a);
      }
    }
  }
}