This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix -fcompare-debug issue in cp_maybe_instrument_return (PR sanitizer/86406)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Alexandre Oliva <aoliva at redhat dot com>, gcc-patches at gcc dot gnu dot org
- Date: Tue, 10 Jul 2018 10:01:10 +0200 (CEST)
- Subject: Re: [PATCH] Fix -fcompare-debug issue in cp_maybe_instrument_return (PR sanitizer/86406)
- References: <20180710073404.GD7166@tucnak>
On Tue, 10 Jul 2018, Jakub Jelinek wrote:
> Hi!
>
> cp_maybe_instrument_return is looking for a return stmt at the end of
> function to decide whether to omit -fsanitize=return instrumentation or
> __builtin_unreachable addition. If a STATEMENT_LIST has a return followed
> by DEBUG_BEGIN_STMT (or multiple of them), it doesn't find the return
> though.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?
OK. This also affects the branch?
Thanks,
Richard.
> 2018-07-10 Jakub Jelinek <jakub@redhat.com>
>
> PR sanitizer/86406
> * cp-gimplify.c (cp_maybe_instrument_return): Skip trailing
> DEBUG_BEGIN_STMTs.
>
> * g++.dg/ubsan/pr86406.C: New test.
>
> --- gcc/cp/cp-gimplify.c.jj 2018-07-05 11:41:51.687718588 +0200
> +++ gcc/cp/cp-gimplify.c 2018-07-09 09:57:16.368775004 +0200
> @@ -1621,6 +1621,13 @@ cp_maybe_instrument_return (tree fndecl)
> case STATEMENT_LIST:
> {
> tree_stmt_iterator i = tsi_last (t);
> + while (!tsi_end_p (i))
> + {
> + tree p = tsi_stmt (i);
> + if (TREE_CODE (p) != DEBUG_BEGIN_STMT)
> + break;
> + tsi_prev (&i);
> + }
> if (!tsi_end_p (i))
> {
> t = tsi_stmt (i);
> --- gcc/testsuite/g++.dg/ubsan/pr86406.C.jj 2018-07-09 09:58:57.362878125 +0200
> +++ gcc/testsuite/g++.dg/ubsan/pr86406.C 2018-07-09 09:58:37.716858063 +0200
> @@ -0,0 +1,33 @@
> +// PR sanitizer/86406
> +// { dg-do compile }
> +// { dg-options "-fcompare-debug -fsanitize=undefined -g -O1" }
> +
> +typedef enum { } cmd_status;
> +class ECell;
> +class ECell_const_ptr { };
> +class ECell_ptr
> +{
> + ECell *mp_element;
> + ECell *getPointer () const { return mp_element; }
> +public:
> + operator ECell_const_ptr () const { return ECell_const_ptr(); }
> +};
> +
> +extern ECell_ptr NULL_CELL;
> +class VwUI_2DCellLayerView;
> +class view_cell_layoutImpl
> +{
> + cmd_status handleChangeFlags (VwUI_2DCellLayerView *
> + p_ui_celllayerview,
> + ECell_const_ptr p_peekCell);
> + cmd_status openCellLayoutView ();
> +};
> +
> +cmd_status
> +view_cell_layoutImpl::openCellLayoutView ()
> +{
> + ECell_const_ptr pcell = NULL_CELL;
> + VwUI_2DCellLayerView *p_user_interface;
> + return handleChangeFlags (p_user_interface, pcell);
> + ;
> +}
>
> Jakub
>
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)