From patchwork Sat Apr 29 21:13:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 68560 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F1F113857713 for ; Sat, 29 Apr 2023 21:14:08 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id 581B03858C60 for ; Sat, 29 Apr 2023 21:13:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 581B03858C60 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org Received: from csb.redhat.com (deer0x03.wildebeest.org [172.31.17.133]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id A1731302BB02; Sat, 29 Apr 2023 23:13:52 +0200 (CEST) Received: by csb.redhat.com (Postfix, from userid 10916) id 7DD4110E997; Sat, 29 Apr 2023 23:13:52 +0200 (CEST) From: Mark Wielaard To: gdb-patches@sourceware.org Cc: Mark Wielaard Subject: [PATCH] xcoffread.c: Fix -Werror=dangling-pointer= issue with main_subfile. Date: Sat, 29 Apr 2023 23:13:42 +0200 Message-Id: <20230429211342.1369527-1-mark@klomp.org> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Spam-Status: No, score=-3036.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" GCC 13 points out that main_subfile has local function scope, but a pointer to it is assigned to the global inclTable array subfile element field: In function ‘void process_linenos(CORE_ADDR, CORE_ADDR)’, inlined from ‘void aix_process_linenos(objfile*)’ at xcoffread.c:727:19, inlined from ‘void aix_process_linenos(objfile*)’ at xcoffread.c:720:1: xcoffread.c:629:37: error: storing the address of local variable ‘main_subfile’ in ‘*inclTable.19_45 + _28._inclTable::subfile’ [-Werror=dangling-pointer=] 629 | inclTable[ii].subfile = &main_subfile; | ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~ xcoffread.c: In function ‘void aix_process_linenos(objfile*)’: xcoffread.c:579:18: note: ‘main_subfile’ declared here 579 | struct subfile main_subfile; | ^~~~~~~~~~~~ xcoffread.c:496:19: note: ‘inclTable’ declared here 496 | static InclTable *inclTable; /* global include table */ | ^~~~~~~~~ Fix this by making main_subfile file static that is allocated and deallocated together with inclTable and allocate_include_entry and xcoff_symfile_finish. Adjust the use of main_subfile in process_linenos to take a pointer to the struct subfile. --- gdb/xcoffread.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index d71127b40f6..db6f2df6c0a 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -498,6 +498,9 @@ static int inclIndx; /* last entry to table */ static int inclLength; /* table length */ static int inclDepth; /* nested include depth */ +/* subfile structure for the main compilation unit. */ +static struct subfile *main_subfile; + static void allocate_include_entry (void); static void @@ -548,6 +551,7 @@ allocate_include_entry (void) inclTable = XCNEWVEC (InclTable, INITIAL_INCLUDE_TABLE_LENGTH); inclLength = INITIAL_INCLUDE_TABLE_LENGTH; inclIndx = 0; + main_subfile = new (struct subfile); } else if (inclIndx >= inclLength) { @@ -575,9 +579,6 @@ process_linenos (CORE_ADDR start, CORE_ADDR end) file_ptr max_offset = XCOFF_DATA (this_symtab_objfile)->max_lineno_offset; - /* subfile structure for the main compilation unit. */ - struct subfile main_subfile; - /* In the main source file, any time we see a function entry, we reset this variable to function's absolute starting line number. All the following line numbers in the function are relative to @@ -596,7 +597,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end) /* All source lines were in the main source file. None in include files. */ - enter_line_range (&main_subfile, offset, 0, start, end, + enter_line_range (main_subfile, offset, 0, start, end, &main_source_baseline); else @@ -613,7 +614,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end) if (offset < inclTable[ii].begin) { enter_line_range - (&main_subfile, offset, inclTable[ii].begin - linesz, + (main_subfile, offset, inclTable[ii].begin - linesz, start, 0, &main_source_baseline); } @@ -624,9 +625,9 @@ process_linenos (CORE_ADDR start, CORE_ADDR end) main_source_baseline = inclTable[ii].funStartLine; enter_line_range - (&main_subfile, inclTable[ii].begin, inclTable[ii].end, + (main_subfile, inclTable[ii].begin, inclTable[ii].end, start, 0, &main_source_baseline); - inclTable[ii].subfile = &main_subfile; + inclTable[ii].subfile = main_subfile; } else { @@ -648,24 +649,24 @@ process_linenos (CORE_ADDR start, CORE_ADDR end) enter remaining lines of the main file, if any left. */ if (offset < max_offset + 1 - linesz) { - enter_line_range (&main_subfile, offset, 0, start, end, + enter_line_range (main_subfile, offset, 0, start, end, &main_source_baseline); } } /* Process main file's line numbers. */ - if (!main_subfile.line_vector_entries.empty ()) + if (!main_subfile->line_vector_entries.empty ()) { /* Line numbers are not necessarily ordered. xlc compilation will put static function to the end. */ - arrange_linetable (main_subfile.line_vector_entries); + arrange_linetable (main_subfile->line_vector_entries); } /* Now, process included files' line numbers. */ for (int ii = 0; ii < inclIndx; ++ii) { - if (inclTable[ii].subfile != ((struct subfile *) &main_subfile) + if (inclTable[ii].subfile != ((struct subfile *) main_subfile) && !inclTable[ii].subfile->line_vector_entries.empty ()) { /* Line numbers are not necessarily ordered. xlc compilation will @@ -1803,6 +1804,7 @@ xcoff_symfile_finish (struct objfile *objfile) { xfree (inclTable); inclTable = NULL; + delete main_subfile; } inclIndx = inclLength = inclDepth = 0; }