From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id B10FA3856974 for ; Fri, 21 Oct 2022 13:21:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B10FA3856974 Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 29LDL58u026590 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 21 Oct 2022 09:21:09 -0400 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 29LDL58u026590 Received: from simark.localdomain (unknown [217.28.27.60]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 019811E0CB; Fri, 21 Oct 2022 09:21:04 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Subject: [PATCH 1/2] gdb: check for empty offsets vector in inherit_abstract_dies Date: Fri, 21 Oct 2022 09:21:03 -0400 Message-Id: <20221021132104.1772565-1-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.38.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Fri, 21 Oct 2022 13:21:05 +0000 X-Spam-Status: No, score=-3189.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, SPF_PASS, TXREP 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: , X-List-Received-Date: Fri, 21 Oct 2022 13:34:16 -0000 When building GDB with clang and --enable-ubsan, I get: UNRESOLVED: gdb.dwarf2/frame-inlined-in-outer-frame.exp: starti prompt The cause being: $ ./gdb --data-directory=data-directory -nx -q -readnow testsuite/outputs/gdb.dwarf2/frame-inlined-in-outer-frame/frame-inlined-in-outer-frame Reading symbols from testsuite/outputs/gdb.dwarf2/frame-inlined-in-outer-frame/frame-inlined-in-outer-frame... Expanding full symbols from testsuite/outputs/gdb.dwarf2/frame-inlined-in-outer-frame/frame-inlined-in-outer-frame... /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:11954:47: runtime error: applying non-zero offset 8 to null pointer I found this to happen with ld-linux on at least Arch Linux and Ubuntu 22.04: $ ./gdb --data-directory=data-directory -nx -q -readnow -iex "set debuginfod enabled on" /lib64/ld-linux-x86-64.so.2 Reading symbols from /lib64/ld-linux-x86-64.so.2... Reading symbols from /home/simark/.cache/debuginfod_client/22bd7a2c03d8cfc05ef7092bfae5932223189bc1/debuginfo... Expanding full symbols from /home/simark/.cache/debuginfod_client/22bd7a2c03d8cfc05ef7092bfae5932223189bc1/debuginfo... /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:11954:47: runtime error: applying non-zero offset 8 to null pointer The problem happens when doing this: sect_offset *offsetp = offsets.data () + 1 When `offsets` is an empty vector, `offsets.data ()` returns nullptr. Fix it by wrapping that in a `!offsets.empty ()` check. Change-Id: I6d29ba2fe80ba4308f68effd9c57d4ee8d67c29f --- gdb/dwarf2/read.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 89ba9122e910..bf52354c4260 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -11949,17 +11949,22 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) corresponding_abstract_child = corresponding_abstract_child->sibling; } - std::sort (offsets.begin (), offsets.end ()); - sect_offset *offsets_end = offsets.data () + offsets.size (); - for (sect_offset *offsetp = offsets.data () + 1; - offsetp < offsets_end; - offsetp++) - if (offsetp[-1] == *offsetp) - complaint (_("Multiple children of DIE %s refer " - "to DIE %s as their abstract origin"), - sect_offset_str (die->sect_off), sect_offset_str (*offsetp)); + if (!offsets.empty ()) + { + std::sort (offsets.begin (), offsets.end ()); + sect_offset *offsets_end = offsets.data () + offsets.size (); + for (sect_offset *offsetp = offsets.data () + 1; + offsetp < offsets_end; + offsetp++) + if (offsetp[-1] == *offsetp) + complaint (_("Multiple children of DIE %s refer " + "to DIE %s as their abstract origin"), + sect_offset_str (die->sect_off), + sect_offset_str (*offsetp)); + } sect_offset *offsetp = offsets.data (); + sect_offset *offsets_end = offsets.data () + offsets.size (); die_info *origin_child_die = origin_die->child; while (origin_child_die != nullptr && origin_child_die->tag != 0) { base-commit: 75436c534bfd7f548a13b5f926c3bd234b23b8d0 -- 2.38.0