From: Jakub Jelinek <jakub@redhat.com>
To: Florian Weimer <fweimer@redhat.com>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>, shenhan@google.com
Subject: Re: Extend -fstack-protector-strong to cover calls with return slot
Date: Fri, 03 Jan 2014 18:57:00 -0000 [thread overview]
Message-ID: <20140103185715.GO892@tucnak.redhat.com> (raw)
In-Reply-To: <52C6B807.1070203@redhat.com>
On Fri, Jan 03, 2014 at 02:15:51PM +0100, Florian Weimer wrote:
> This patch fixes a loophole in the -fstack-protector-strong
> protection. If a function call uses the return slot optimization,
> the caller needs stack protector instrumentation because the return
> slot is addressable.
>
> Bootstrapped and regression-tested on x86_64-redhat-linux-gnu, with
> C/C++/Java enabled. Okay for trunk?
>
> --
> Florian Weimer / Red Hat Product Security Team
> 2014-01-03 Florian Weimer <fweimer@redhat.com>
>
> * cfgexpand.c (call_with_return_slot_opt_p): New function.
> (expand_used_vars): Emit stack protector instrumentation in strong
> mode if call_with_return_slot_opt_p.
>
> gcc/testsuite/
>
> 2014-01-03 Florian Weimer <fweimer@redhat.com>
>
> * gcc.dg/fstack-protector-strong.c: Add coverage for named return
> values.
> * g++.dg/fstack-protector-strong.C: Likewise.
>
> Index: gcc/cfgexpand.c
> ===================================================================
> --- gcc/cfgexpand.c (revision 206311)
> +++ gcc/cfgexpand.c (working copy)
> @@ -1599,6 +1599,22 @@
> return 0;
> }
>
> +/* Check if the basic block has a call which uses a return slot. */
> +
> +static bool
> +call_with_return_slot_opt_p (basic_block bb)
> +{
> + for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
> + !gsi_end_p (gsi); gsi_next (&gsi))
> + {
> + gimple stmt = gsi_stmt (gsi);
> + if (gimple_code (stmt) == GIMPLE_CALL
That would be is_gimple_call (stmt) instead.
Also, I'd think the function is misnamed, given that it checks if there
are any calls with return_slot_opt_p in a bb. I think it would be
better to move FOR_ALL_BB_FN (bb, cfun) loop also into the
function and call it any_call_...
Lastly, I wonder if gimple_call_return_slot_opt_p is really what you are
after, why does NRV matter here? Isn't what you are looking for instead
whether the called function returns value through invisible reference,
because then you'll always have some (aggregate) addressable object
in the caller's frame and supposedly you are after making sure that the
callee doesn't overflow the return object.
So, looking at tree-nrv.c, that check would be roughly:
if (is_gimple_call (stmt)
&& gimple_call_lhs (stmt)
&& aggregate_value_p (TREE_TYPE (gimple_call_lhs (stmt)),
gimple_call_fndecl (stmt)))
Jakub
next prev parent reply other threads:[~2014-01-03 18:57 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-03 13:15 Florian Weimer
2014-01-03 18:57 ` Jakub Jelinek [this message]
2014-01-03 21:43 ` Florian Weimer
2014-01-07 12:51 ` Florian Weimer
2014-01-07 13:07 ` Jakub Jelinek
2014-01-07 13:27 ` Florian Weimer
2014-01-07 13:37 ` Jakub Jelinek
2014-01-08 14:57 ` Florian Weimer
2014-01-17 10:26 ` Florian Weimer
2014-02-03 9:05 ` [PATCH Ping] " Florian Weimer
2014-05-05 11:58 ` [PATCH Ping v2] " Florian Weimer
2014-05-09 6:26 ` Jeff Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140103185715.GO892@tucnak.redhat.com \
--to=jakub@redhat.com \
--cc=fweimer@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=shenhan@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).