Program: 44161
Project: 44161
Buggy source:
/** 
 * Dumps the given object as JSON representation followed by a separator into the given StringBuilder.
 * @param out StringBuilder
 * @param o object
 * @param separator separator character to append after the object or<code>'\0'</code> to append no separator.
 */
private void dumpObject(StringBuilder out,Object o,char separator,List<String> ignoredProps){
  try {
    if (o == null) {
      out.append("String_Node_Str");
    }
 else {
      Class oClass=o.getClass();
      JSONifier jsonifier;
      if (oClass.isPrimitive()) {
        out.append(o);
      }
 else       if (Number.class.isAssignableFrom(oClass) || oClass.equals(Boolean.class) || oClass.equals(Character.class)) {
        out.append(o);
      }
 else       if (o instanceof String) {
        quote(out,(String)o);
      }
 else       if (o instanceof Collection) {
        out.append("String_Node_Str");
        for (Iterator i=((Collection)o).iterator(); i.hasNext(); ) {
          dumpObject(out,i.next(),i.hasNext() ? ',' : '\0',ignoredProps);
        }
        out.append("String_Node_Str");
      }
 else       if (o.getClass().isArray()) {
        out.append("String_Node_Str");
        int len=Array.getLength(o);
        for (int i=0; i < len; i++) {
          dumpObject(out,Array.get(o,i),((i < (len - 1)) ? ',' : '\0'),ignoredProps);
        }
        out.append("String_Node_Str");
      }
 else       if (o instanceof Map) {
        out.append("String_Node_Str");
        Map m=(Map)o;
        for (Iterator i=m.keySet().iterator(); i.hasNext(); ) {
          Object key=i.next();
          dumpObject(out,key.toString(),'\0',ignoredProps);
          out.append("String_Node_Str");
          dumpObject(out,m.get(key),i.hasNext() ? ',' : '\0',ignoredProps);
        }
        out.append("String_Node_Str");
      }
 else       if ((jsonifier=jsonifiers.get(oClass)) != null) {
        out.append(jsonifier.toJSON(o));
      }
 else       if (o instanceof JSONable) {
        out.append(((JSONable)o).toJSON());
      }
 else {
        BeanInfo info=Introspector.getBeanInfo(o.getClass());
        out.append("String_Node_Str");
        boolean first=true;
        PropertyDescriptor[] pds=info.getPropertyDescriptors();
        for (int cp=0; cp < pds.length; cp++) {
          PropertyDescriptor pd=pds[cp];
          Method method=pd.getReadMethod();
          Method writeMethod=pd.getWriteMethod();
          if (method != null) {
            Object value=method.invoke(o,(Object[])null);
            String name=pd.getName();
            boolean ignore=(ignoredProps != null && ignoredProps.contains(name));
            if (!name.equals("String_Node_Str") && !ignore) {
              JSONProperty jsonProperty=method.getAnnotation(JSONProperty.class);
              if (jsonProperty == null && writeMethod != null) {
                jsonProperty=writeMethod.getAnnotation(JSONProperty.class);
              }
              if (jsonProperty != null) {
                name=jsonProperty.value();
                ignore=jsonProperty.ignore() || (value == null && jsonProperty.ignoreIfNull());
              }
              if (!ignore) {
                if (!first) {
                  out.append(',');
                }
                quote(out,name);
                out.append(':');
                dumpObject(out,value,'\0',ignoredProps);
                first=false;
              }
            }
          }
        }
        if (o instanceof DynamicProperties) {
          DynamicProperties dynAttrs=(DynamicProperties)o;
          for (          String name : dynAttrs.propertyNames()) {
            out.append(',');
            quote(out,name);
            out.append(':');
            dumpObject(out,dynAttrs.getProperty(name),'\0',ignoredProps);
          }
        }
        out.append("String_Node_Str");
      }
    }
    if (separator != '\0') {
      out.append(separator);
    }
  }
 catch (  IntrospectionException ie) {
    throw new RuntimeException("String_Node_Str",ie);
  }
catch (  IllegalAccessException iae) {
    throw new RuntimeException("String_Node_Str",iae);
  }
catch (  InvocationTargetException ite) {
    throw new RuntimeException("String_Node_Str",ite);
  }
}

Fixed version (ground truth):
/** 
 * Dumps the given object as JSON representation followed by a separator into the given StringBuilder.
 * @param out StringBuilder
 * @param o object
 * @param separator separator character to append after the object or<code>'\0'</code> to append no separator.
 */
private void dumpObject(StringBuilder out,Object o,char separator,List<String> ignoredProps){
  if (o == null) {
    out.append("String_Node_Str");
  }
 else {
    Class oClass=o.getClass();
    JSONifier jsonifier;
    if (oClass.isPrimitive()) {
      out.append(o);
    }
 else     if (Number.class.isAssignableFrom(oClass) || oClass.equals(Boolean.class) || oClass.equals(Character.class)) {
      out.append(o);
    }
 else     if (o instanceof String) {
      quote(out,(String)o);
    }
 else     if (o instanceof Collection) {
      out.append("String_Node_Str");
      for (Iterator i=((Collection)o).iterator(); i.hasNext(); ) {
        dumpObject(out,i.next(),i.hasNext() ? ',' : '\0',ignoredProps);
      }
      out.append("String_Node_Str");
    }
 else     if (o.getClass().isArray()) {
      out.append("String_Node_Str");
      int len=Array.getLength(o);
      for (int i=0; i < len; i++) {
        dumpObject(out,Array.get(o,i),((i < (len - 1)) ? ',' : '\0'),ignoredProps);
      }
      out.append("String_Node_Str");
    }
 else     if (o instanceof Map) {
      out.append("String_Node_Str");
      Map m=(Map)o;
      for (Iterator i=m.keySet().iterator(); i.hasNext(); ) {
        Object key=i.next();
        dumpObject(out,key.toString(),'\0',ignoredProps);
        out.append("String_Node_Str");
        dumpObject(out,m.get(key),i.hasNext() ? ',' : '\0',ignoredProps);
      }
      out.append("String_Node_Str");
    }
 else     if ((jsonifier=jsonifiers.get(oClass)) != null) {
      out.append(jsonifier.toJSON(o));
    }
 else     if (o instanceof JSONable) {
      out.append(((JSONable)o).toJSON());
    }
 else     if (o instanceof Class) {
      quote(out,((Class)o).getName());
    }
 else {
      BeanInfo info;
      try {
        info=Introspector.getBeanInfo(o.getClass());
      }
 catch (      IntrospectionException e) {
        throw ExceptionWrapper.wrap(e);
      }
      out.append("String_Node_Str");
      boolean first=true;
      PropertyDescriptor[] pds=info.getPropertyDescriptors();
      for (int cp=0; cp < pds.length; cp++) {
        try {
          PropertyDescriptor pd=pds[cp];
          Method method=pd.getReadMethod();
          Method writeMethod=pd.getWriteMethod();
          if (method != null) {
            Object value=method.invoke(o,(Object[])null);
            String name=pd.getName();
            boolean ignore=(ignoredProps != null && ignoredProps.contains(name));
            if (!name.equals("String_Node_Str") && !ignore) {
              JSONProperty jsonProperty=method.getAnnotation(JSONProperty.class);
              if (jsonProperty == null && writeMethod != null) {
                jsonProperty=writeMethod.getAnnotation(JSONProperty.class);
              }
              if (jsonProperty != null) {
                name=jsonProperty.value();
                ignore=jsonProperty.ignore() || (value == null && jsonProperty.ignoreIfNull());
              }
              if (!ignore) {
                if (!first) {
                  out.append(',');
                }
                quote(out,name);
                out.append(':');
                dumpObject(out,value,'\0',ignoredProps);
                first=false;
              }
            }
          }
        }
 catch (        IllegalAccessException e) {
          throw ExceptionWrapper.wrap(e);
        }
catch (        InvocationTargetException e) {
          throw ExceptionWrapper.wrap(e);
        }
      }
      if (o instanceof DynamicProperties) {
        DynamicProperties dynAttrs=(DynamicProperties)o;
        for (        String name : dynAttrs.propertyNames()) {
          out.append(',');
          quote(out,name);
          out.append(':');
          dumpObject(out,dynAttrs.getProperty(name),'\0',ignoredProps);
        }
      }
      out.append("String_Node_Str");
    }
  }
  if (separator != '\0') {
    out.append(separator);
  }
}