From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id 95F5C3857B9B; Thu, 8 Jun 2023 10:43:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 95F5C3857B9B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1686221008; bh=O7z0p9a9OQ/GXRMNHxccEkaxbkdwYbdko99mOZR0In4=; h=From:To:Subject:Date:From; b=SnYmD5n9eoDv5GWTKBZfUXwCGSs7RQW2G30G/lDMyoBIb2gmXh1KCVCVXhCNPBYPa /h5nR1BnFfeOU9SCMo68MtGy1e/97oA0Qsw7iy5AtF9ZacAcb0Y0M+izjYdjoLoAGY hua/CUuzAy00aUiKwf2amM957qq6XHU9L4ksMkRk= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] detect infinite loops earlier in returning_call_p X-Act-Checkin: gcc X-Git-Author: Alexandre Oliva X-Git-Refname: refs/users/aoliva/heads/testme X-Git-Oldrev: 8385339fa873b83aa05d051fa70c024f067fa02a X-Git-Newrev: 7d38268b50c21a5c393057d7fc7e9bea8b1b8374 Message-Id: <20230608104328.95F5C3857B9B@sourceware.org> Date: Thu, 8 Jun 2023 10:43:28 +0000 (GMT) List-Id: https://gcc.gnu.org/g:7d38268b50c21a5c393057d7fc7e9bea8b1b8374 commit 7d38268b50c21a5c393057d7fc7e9bea8b1b8374 Author: Alexandre Oliva 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 . */ #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 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);