public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Alexandre Oliva <aoliva@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] detect infinite loops earlier in returning_call_p Date: Fri, 9 Jun 2023 06:17:23 +0000 (GMT) [thread overview] Message-ID: <20230609061723.1A543385700D@sourceware.org> (raw) https://gcc.gnu.org/g:6269d7a415f9fad7a49f03c8b4a2387d21a9ccc9 commit 6269d7a415f9fad7a49f03c8b4a2387d21a9ccc9 Author: Alexandre Oliva <oliva@adacore.com> Date: Thu Jun 8 05:55:04 2023 -0300 detect infinite loops earlier in returning_call_p An infinite loop could create a path as long as the block count in returning_call_p, and then fail the backwards check if a call is found before emptying the path. Return as soon as the path exceeds the block count, and search for duplicate blocks before allocating more memory for the path, so as to cut the looping short. for gcc/ChangeLog * gimple-harden-control-flow.cc (returning_call_p): Detect infinite loops sooner. Diff: --- gcc/gimple-harden-control-flow.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/gcc/gimple-harden-control-flow.cc b/gcc/gimple-harden-control-flow.cc index 3998fd0d293..044671cab79 100644 --- a/gcc/gimple-harden-control-flow.cc +++ b/gcc/gimple-harden-control-flow.cc @@ -19,6 +19,7 @@ along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ #include "config.h" +#define INCLUDE_ALGORITHM /* find */ #include "system.h" #include "coretypes.h" #include "backend.h" @@ -211,14 +212,19 @@ returning_call_p (gcall *call) return false; /* Quickly check that there's a path to exit compatible with a - returning call. Detect infinite loops through the counter. */ - basic_block bb = gimple_bb (call); + returning call. Detect infinite loops by limiting the path + length to the basic block count, and by looking for duplicate + blocks before allocating more memory for the path, for amortized + O(n). */ auto_vec<basic_block, 10> path; - for (int i = n_basic_blocks_for_fn (cfun); - bb != EXIT_BLOCK_PTR_FOR_FN (cfun) && i--; + for (basic_block bb = gimple_bb (call); + bb != EXIT_BLOCK_PTR_FOR_FN (cfun); bb = single_succ (bb)) if (!single_succ_p (bb) - || (single_succ_edge (bb)->flags & EDGE_EH) != 0) + || (single_succ_edge (bb)->flags & EDGE_EH) != 0 + || n_basic_blocks_for_fn (cfun) - path.length () <= NUM_FIXED_BLOCKS + || (path.length () == path.allocated () + && std::find (path.begin (), path.end (), bb) != path.end ())) return false; else path.safe_push (bb);
next reply other threads:[~2023-06-09 6:17 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-06-09 6:17 Alexandre Oliva [this message] -- strict thread matches above, loose matches on Subject: below -- 2023-06-09 8:07 Alexandre Oliva 2023-06-08 10:59 Alexandre Oliva 2023-06-08 10:43 Alexandre Oliva 2023-06-08 9:17 Alexandre Oliva
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=20230609061723.1A543385700D@sourceware.org \ --to=aoliva@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /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: linkBe 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).