Program: 123273
Project: 123273
Buggy source:
/** 
 * Translate current Packed into a String representation
 * @return String representation of packed decimal
 */
public String toString(){
  int Ii=0;
  int Sign_Location;
  int Logical_Length;
  int IOut=0;
  int IIn=0;
  boolean _End=false;
  boolean High=false;
  boolean Significant=false;
  byte Digit;
  int NbDigit;
  boolean EvenNbDigits;
  boolean InDecimalPart=false;
  String Sign=new String("String_Node_Str");
  Logical_Length=_IntSize + _DecSize;
  EvenNbDigits=((Logical_Length % 2) == 0);
  Logical_Length++;
  Logical_Length+=2;
  if (_DecSize != 0)   InDecimalPart=true;
  Sign_Location=IOut;
  IOut++;
  char OutStrDecimal[]=new char[MAX_DECIMAL_STRING_SIZE];
  if (_IntSize == 0) {
    OutStrDecimal[IOut++]='0';
    OutStrDecimal[IOut++]='.';
  }
  NbDigit=0;
  if (EvenNbDigits)   High=true;
  while (!_End) {
    High=!High;
    if (High) {
      Digit=BYTEFX.HINIBBLE(_Struct[IIn]);
    }
 else {
      Digit=BYTEFX.LOWNIBBLE(_Struct[IIn]);
      IIn++;
    }
    NbDigit++;
switch (Digit) {
case CBL_SIGN_POS1:
case CBL_SIGN_POS2:
case CBL_SIGN_POS3:
case CBL_SIGN_POS4:
      _End=true;
    break;
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
  if ((Digit != 0) || (Significant) || (NbDigit / 2 == getPackedSize(_IntSize,_DecSize) - _DecSize)) {
    Significant=true;
    OutStrDecimal[IOut++]=(char)(BYTEFX.MAKEBYTE(Digit,BYTEFX.HINIBBLE(ASCII_HIGH_CHAR_NIBBLE)));
    if ((NbDigit == _IntSize) && (_DecSize != 0)) {
      OutStrDecimal[IOut++]='.';
      InDecimalPart=false;
    }
  }
break;
default :
Sign=new String("String_Node_Str");
_End=true;
break;
}
}
if (!Significant) return (new String("String_Node_Str"));
if (InDecimalPart) return (Sign + (new String("String_Node_Str")) + (new String(OutStrDecimal)).trim());
 else {
if (Sign.length() != 0) {
OutStrDecimal[Sign_Location]=Sign.charAt(0);
return (new String(OutStrDecimal));
}
 else return (new String(OutStrDecimal)).trim();
}
}

Fixed version (ground truth):
/** 
 * Translate current Packed into a String representation
 * @return String representation of packed decimal
 */
public String toString(){
  int Ii=0;
  int Sign_Location;
  int Logical_Length;
  int IOut=0;
  int IIn=0;
  boolean _End=false;
  boolean High=false;
  boolean Significant=false;
  byte Digit;
  int NbDigit;
  boolean EvenNbDigits;
  boolean InDecimalPart=false;
  String Sign=new String("String_Node_Str");
  Logical_Length=_IntSize + _DecSize;
  EvenNbDigits=((Logical_Length % 2) == 0);
  Logical_Length++;
  Logical_Length+=2;
  if (_DecSize != 0)   InDecimalPart=true;
  Sign_Location=IOut;
  IOut++;
  char OutStrDecimal[]=new char[MAX_DECIMAL_STRING_SIZE];
  if (_IntSize == 0) {
    OutStrDecimal[IOut++]='0';
    OutStrDecimal[IOut++]='.';
  }
  NbDigit=0;
  if (EvenNbDigits)   High=true;
  while (!_End) {
    High=!High;
    if (High) {
      Digit=BYTEFX.HINIBBLE(_Struct[IIn]);
    }
 else {
      Digit=BYTEFX.LOWNIBBLE(_Struct[IIn]);
      IIn++;
    }
    NbDigit++;
switch (Digit) {
case CBL_SIGN_POS1:
case CBL_SIGN_POS2:
case CBL_SIGN_POS3:
case CBL_SIGN_POS4:
      _End=true;
    break;
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
  if ((Digit != 0) || (Significant) || (NbDigit - 1 == _IntSize)) {
    Significant=true;
    OutStrDecimal[IOut++]=(char)(BYTEFX.MAKEBYTE(Digit,BYTEFX.HINIBBLE(ASCII_HIGH_CHAR_NIBBLE)));
    if ((NbDigit == _IntSize) && (_DecSize != 0)) {
      OutStrDecimal[IOut++]='.';
      InDecimalPart=false;
    }
  }
break;
default :
Sign=new String("String_Node_Str");
_End=true;
break;
}
}
if (!Significant) return (new String("String_Node_Str"));
if (InDecimalPart) return (Sign + (new String("String_Node_Str")) + (new String(OutStrDecimal)).trim());
 else {
if (Sign.length() != 0) {
OutStrDecimal[Sign_Location]=Sign.charAt(0);
return (new String(OutStrDecimal));
}
 else return (new String(OutStrDecimal)).trim();
}
}