This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH v3] gcc/ubsan.c: Use 'pretty_print' for 'pretty_name' to avoid memory overflow
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Chen Gang <gang dot chen dot 5i5j at gmail dot com>
- Cc: Marek Polacek <polacek at redhat dot com>, Jeff Law <law at redhat dot com>, "Joseph S. Myers" <joseph at codesourcery dot com>, rth at redhat dot com, gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 24 Nov 2014 08:41:34 +0100
- Subject: Re: [PATCH v3] gcc/ubsan.c: Use 'pretty_print' for 'pretty_name' to avoid memory overflow
- Authentication-results: sourceware.org; auth=none
- References: <547134B7 dot 5040603 at gmail dot com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Sun, Nov 23, 2014 at 09:13:27AM +0800, Chen Gang wrote:
> 2014-11-23 Chen Gang <gang.chen.5i5j@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