On Sun, Nov 23, 2014 at 09:13:27AM +0800, Chen Gang wrote:
> 2014-11-23  Chen Gang  <gang.chen.5...@gmail.com>
> 
>       * ubsan.c (ubsan_type_descriptor): Use 'pretty_print' for
>       'pretty_name' to avoid memory overflow.

Ok, with a small nit below.

>  gcc/ubsan.c | 63 
> +++++++++++++++++++++++++++++++++----------------------------
>  1 file changed, 34 insertions(+), 29 deletions(-)
> 
> diff --git a/gcc/ubsan.c b/gcc/ubsan.c
> index b3d5343..3fceff7 100644
> --- a/gcc/ubsan.c
> +++ b/gcc/ubsan.c
> @@ -369,7 +369,7 @@ ubsan_type_descriptor (tree type, enum ubsan_print_style 
> pstyle)
>    tree dtype = ubsan_get_type_descriptor_type ();
>    tree type2 = type;
>    const char *tname = NULL;
> -  char *pretty_name;
> +  pretty_printer pretty_name;
>    unsigned char deref_depth = 0;
>    unsigned short tkind, tinfo;
>  
> @@ -408,54 +408,58 @@ ubsan_type_descriptor (tree type, enum 
> ubsan_print_style pstyle)
>      /* We weren't able to determine the type name.  */
>      tname = "<unknown>";
>  
> -  /* Decorate the type name with '', '*', "struct", or "union".  */
> -  pretty_name = (char *) alloca (strlen (tname) + 16 + deref_depth);
>    if (pstyle == UBSAN_PRINT_POINTER)
>      {
> -      int pos = sprintf (pretty_name, "'%s%s%s%s%s%s%s",
> -                      TYPE_VOLATILE (type2) ? "volatile " : "",
> -                      TYPE_READONLY (type2) ? "const " : "",
> -                      TYPE_RESTRICT (type2) ? "restrict " : "",
> -                      TYPE_ATOMIC (type2) ? "_Atomic " : "",
> -                      TREE_CODE (type2) == RECORD_TYPE
> -                      ? "struct "
> -                      : TREE_CODE (type2) == UNION_TYPE
> -                        ? "union " : "", tname,
> -                      deref_depth == 0 ? "" : " ");
> +      pp_printf (&pretty_name, "'%s%s%s%s%s%s%s",
> +              TYPE_VOLATILE (type2) ? "volatile " : "",
> +              TYPE_READONLY (type2) ? "const " : "",
> +              TYPE_RESTRICT (type2) ? "restrict " : "",
> +              TYPE_ATOMIC (type2) ? "_Atomic " : "",
> +              TREE_CODE (type2) == RECORD_TYPE
> +              ? "struct "
> +              : TREE_CODE (type2) == UNION_TYPE
> +                ? "union " : "", tname,
> +              deref_depth == 0 ? "" : " ");
>        while (deref_depth-- > 0)
> -        pretty_name[pos++] = '*';
> -      pretty_name[pos++] = '\'';
> -      pretty_name[pos] = '\0';
> +     pp_star (&pretty_name);
> +      pp_quote (&pretty_name);
>      }
>    else if (pstyle == UBSAN_PRINT_ARRAY)
>      {
>        /* Pretty print the array dimensions.  */
>        gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
>        tree t = type;
> -      int pos = sprintf (pretty_name, "'%s ", tname);
> +      pp_printf (&pretty_name, "'%s ", tname);
>        while (deref_depth-- > 0)
> -        pretty_name[pos++] = '*';
> +     pp_star (&pretty_name);
>        while (TREE_CODE (t) == ARRAY_TYPE)
>       {
> -       pretty_name[pos++] = '[';
> +       pp_left_bracket (&pretty_name);
>         tree dom = TYPE_DOMAIN (t);
>         if (dom && TREE_CODE (TYPE_MAX_VALUE (dom)) == INTEGER_CST)
> -         pos += sprintf (&pretty_name[pos], HOST_WIDE_INT_PRINT_DEC,
> +         {
> +           if (tree_fits_uhwi_p (TYPE_MAX_VALUE (dom))
> +               && tree_to_uhwi (TYPE_MAX_VALUE (dom)) + 1 != 0)
> +             pp_printf (&pretty_name, HOST_WIDE_INT_PRINT_DEC,
>                           tree_to_uhwi (TYPE_MAX_VALUE (dom)) + 1);
> +           else
> +             pp_wide_int(&pretty_name,
> +                         wi::add (wi::to_widest (TYPE_MAX_VALUE (dom)), 1),
> +                         TYPE_SIGN (TREE_TYPE (dom)));

Space still missing before ( (and reindenting the following 2 lines).

        Jakub

Reply via email to