Program: 42661
Project: 42661
Buggy source:
@Override public void handleRead(Device arg0,HidInMsg arg1,int arg2,long arg3){
  if (!(arg1 instanceof FreespaceMsgInMotionEngineOutput)) {
    return;
  }
  FreespaceMsgInMotionEngineOutput m=(FreespaceMsgInMotionEngineOutput)arg1;
  int[] data=m.getMeData();
  int offset=0;
  int axisVal;
  float scale;
  if (offset < 0) {
    return;
  }
  if (m.getFf0()) {
    offset+=6;
  }
  if (m.getFf1()) {
    double xAccel=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],10);
    double yAccel=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],10);
    double zAccel=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],10);
    offset+=6;
    linearAccPub.publish(new IMULinearAccelerationMessage(xAccel,yAccel,zAccel));
  }
  if (m.getFf2()) {
    double xAccel=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],10);
    double yAccel=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],10);
    double zAccel=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],10);
    offset+=6;
    linearAccNoGravPub.publish(new IMULinearAccelerationMessage(xAccel,yAccel,zAccel));
  }
  if (m.getFf3()) {
    double xAngularVel=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],10);
    double yAngularVel=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],10);
    double zAngularVel=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],10);
    offset+=6;
    angVelPub.publish(new IMUAngularVelocityMessage(xAngularVel,yAngularVel,zAngularVel));
  }
  if (m.getFf4()) {
    double xMag=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],12);
    double yMag=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],12);
    double zMag=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],12);
    offset+=6;
    magPub.publish(new MagneticMeasurement(xMag,yMag,zMag));
  }
  if (m.getFf5()) {
    double temperature=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],7);
    offset+=2;
    tempPub.publish(new IMUTemperatureMessage(temperature));
  }
  if (m.getFf6()) {
    double w=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],14);
    double x=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],14);
    double y=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],14);
    double z=convertQNToDouble((byte)data[offset + 6],(byte)data[offset + 7],14);
    double r11=1 - 2 * y * y - 2 * z * z;
    double r12=2 * x * y - 2 * z * w;
    double r13=2 * x * z + 2 * y * w;
    double r21=2 * x * y + 2 * z * w;
    double r22=1 - 2 * x * x - 2 * z * z;
    double r23=2 * y * z - 2 * x * w;
    double r31=2 * x * z - 2 * y * w;
    double r32=2 * y * z + 2 * x * w;
    double r33=1 - 2 * x * x - 2 * y * y;
    double[][] rot={{r11,r12,r13},{r21,r22,r23},{r31,r32,r33}};
    double yaw=Math.atan(r21 / r11);
    double pitch=-r31 / Math.sqrt(r32 * r32 + r33 * r33);
    double roll=Math.atan(r32 / r33);
    angPosPub.publish(new IMUAngularPositionMessage(rot));
    offset+=8;
  }
}

Fixed version (ground truth):
@Override public void handleRead(Device arg0,HidInMsg arg1,int arg2,long arg3){
  if (!(arg1 instanceof FreespaceMsgInMotionEngineOutput)) {
    return;
  }
  FreespaceMsgInMotionEngineOutput m=(FreespaceMsgInMotionEngineOutput)arg1;
  int[] data=m.getMeData();
  int offset=0;
  int axisVal;
  float scale;
  if (offset < 0) {
    return;
  }
  if (m.getFf0()) {
    offset+=6;
  }
  if (m.getFf1()) {
    double xAccel=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],10);
    double yAccel=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],10);
    double zAccel=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],10);
    offset+=6;
    linearAccPub.publish(new IMULinearAccelerationMessage(xAccel,yAccel,zAccel));
  }
  if (m.getFf2()) {
    double xAccel=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],10);
    double yAccel=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],10);
    double zAccel=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],10);
    offset+=6;
    linearAccNoGravPub.publish(new IMULinearAccelerationMessage(xAccel,yAccel,zAccel));
  }
  if (m.getFf3()) {
    double xAngularVel=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],10);
    double yAngularVel=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],10);
    double zAngularVel=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],10);
    offset+=6;
    angVelPub.publish(new IMUAngularVelocityMessage(xAngularVel,yAngularVel,zAngularVel));
  }
  if (m.getFf4()) {
    double xMag=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],12);
    double yMag=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],12);
    double zMag=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],12);
    offset+=6;
    magPub.publish(new MagneticMeasurement(xMag,yMag,zMag));
  }
  if (m.getFf5()) {
    double temperature=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],7);
    offset+=2;
    tempPub.publish(new IMUTemperatureMessage(temperature));
  }
  if (m.getFf6()) {
    double w=convertQNToDouble((byte)data[offset + 0],(byte)data[offset + 1],14);
    double x=convertQNToDouble((byte)data[offset + 2],(byte)data[offset + 3],14);
    double y=convertQNToDouble((byte)data[offset + 4],(byte)data[offset + 5],14);
    double z=convertQNToDouble((byte)data[offset + 6],(byte)data[offset + 7],14);
    double r11=1 - 2 * y * y - 2 * z * z;
    double r12=2 * x * y - 2 * z * w;
    double r13=2 * x * z + 2 * y * w;
    double r21=2 * x * y + 2 * z * w;
    double r22=1 - 2 * x * x - 2 * z * z;
    double r23=2 * y * z - 2 * x * w;
    double r31=2 * x * z - 2 * y * w;
    double r32=2 * y * z + 2 * x * w;
    double r33=1 - 2 * x * x - 2 * y * y;
    double[][] rot={{r11,r12,r13},{r21,r22,r23},{r31,r32,r33}};
    angPosPub.publish(new IMUAngularPositionMessage(rot));
    offset+=8;
  }
}