From patchwork Fri Apr 26 15:56:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 89054 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 34AAE3858435 for ; Fri, 26 Apr 2024 15:57:01 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-io1-xd31.google.com (mail-io1-xd31.google.com [IPv6:2607:f8b0:4864:20::d31]) by sourceware.org (Postfix) with ESMTPS id 856F23858C39 for ; Fri, 26 Apr 2024 15:56:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 856F23858C39 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 856F23858C39 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::d31 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714146998; cv=none; b=MI0owP3w62ihKUkGh6C0cGONfxRpE7j7jYgSsV2mqy8RR9JzryGjBaRI4jZWGWnRk7yLskvtdiPGyXqLxyUvtOR29pbfeVsyTvow/Q6Shu+5CJfaqs2WrkEa7o8Jyt9AWrVNnz7vwg8YEqLjoG0WTSL9zrd27gLcZWaFbSW5jxE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714146998; c=relaxed/simple; bh=SGybyhst7X1RYKVXNr3xafcUZlZg38H6IHbfQmIUW54=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=l76w5QpTrlTLyCpB60cSqTB2nXvh3afAid1/6z6Xt4OUZ6nwF0i5y7pdpTPnr2YieiwYM3+JHCJvubGKSK6fJ8JK45xOQH/pBiSOcsw1puMdR3ybw50zbtb5Dyqoe1hHf1xHTRG/3H28/zy5yTVTz82Xho2bCNqbyzQ9dWKOy5M= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-io1-xd31.google.com with SMTP id ca18e2360f4ac-7d9e70f388fso95775939f.2 for ; Fri, 26 Apr 2024 08:56:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1714146994; x=1714751794; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=prihYNQz7g7enSbtlW/i56HJZpT/gIcQXUv2PWEn1UE=; b=SDvDuOkMS1AFrs+pdn0DkN8zj53PMKj4nsHaXTeXk6/1onCmL5nDIqLaVV+Vgjuuuy Itn7tOjDZGu01BHSJc1ZVfeN+xCmGALgMVbPSSt3LYsVaruf9EQjMkWPBEz/h8kr+lNR WEi0134016ijfLnOKcsVpU8rbjQ7YDtilQYuCUPaWRSOyIuAKPvYivpOgm2/EbdNsiIJ dSv65l6kqcTvJ6cSDK1iqO8XKpB8MoZjMrhe7Eul936r6STgtRJQrdN30CpjSTxK+MyY 1xNOHL/KBmlW397kfW5wysk4wcuMSBFKl34lfzGqPk98SNMXBaAwZ1WlIZJvSdL1iwuZ sfjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714146994; x=1714751794; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=prihYNQz7g7enSbtlW/i56HJZpT/gIcQXUv2PWEn1UE=; b=dk9q9OhbkgoBx73aumaQv+zu7XjLMVoJA/qbQvpiG8Cmbey1lBsZ8BcZWLj0FrJ8n3 Cz1wBbY512WcaKO4aiKNc9lMCWHxfsMRmLNVmgI3JXQXNNha3WF8ZfEP4p3yDseeWY3d 8ylO1cQGm/+V46gG8WCYAhjj268D5BCgGwg/XVtNMs9Qy+Uo2GmHl8fO7FjSu65oaXOU 8+l/8fTRdtfWWXDL30itJIpRUPDeU5Nur9TLiodiVBQ7E/hdKXbEWRQ1gRLQ7O1QZwU8 +15y9yOzUdrY9ANFjEw64KKp6OiJgBYlSywQ6cd9SnYg9VzYicdbQ0wx4+XWoZDDwGlq +IWw== X-Gm-Message-State: AOJu0YxNtPMu2BIQOqc8n2JyDo1Pz8ykeKuNMkZGpZYPL+pyVFEbFflc qVJ6iwUq77x5jI7NU4dCIJCW849vngjQbJlzVpQJUhl14tRZI+yKg45wfqTq9hWN86NCbSgNQOk = X-Google-Smtp-Source: AGHT+IFkhqvDR3ilUATEQYoFc5e0WDw9EnAK2ftDYPikdsEFpfZcBTBWHkAUqF0f6nxCWcdGdYff1w== X-Received: by 2002:a05:6602:45:b0:7d5:df5e:506 with SMTP id z5-20020a056602004500b007d5df5e0506mr3467175ioz.9.1714146994626; Fri, 26 Apr 2024 08:56:34 -0700 (PDT) Received: from localhost.localdomain (97-122-86-252.hlrn.qwest.net. [97.122.86.252]) by smtp.gmail.com with ESMTPSA id b18-20020a02c992000000b00482b484af1asm5613118jap.67.2024.04.26.08.56.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Apr 2024 08:56:34 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v2] Fix leak with internal functions Date: Fri, 26 Apr 2024 09:56:25 -0600 Message-ID: <20240426155625.104269-1-tromey@adacore.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, 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.30 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 Valgrind reported a memory leak on exit with internal functions. To fix this, I added a new case to clear_internalvar, and then arranged to call clear_internalvar when an internalvar is deleted. Also, because an internalvar can reference a value, it seemed prudent to clear 'internalvars' from the final cleanup in value.c. Regression tested on x86-64 Fedora 38. I also did a bit of testing by hand with valgrind and ASAN. This version includes the DISABLE_COPY_AND_ASSIGN requested in review. The move constructor and assignment operator are needed by the std::map. --- gdb/testsuite/gdb.base/gdbvars.exp | 8 ++++++++ gdb/value.c | 31 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/gdb/testsuite/gdb.base/gdbvars.exp b/gdb/testsuite/gdb.base/gdbvars.exp index 7ec7df36b9e..32fd4c4da4e 100644 --- a/gdb/testsuite/gdb.base/gdbvars.exp +++ b/gdb/testsuite/gdb.base/gdbvars.exp @@ -102,6 +102,14 @@ proc test_convenience_functions {} { gdb_test "print \$_isvoid (foo_int ())" " = 0" \ "Check whether non-void function is void" + + gdb_test "print \$isvoid_copy = \$_isvoid" \ + " = " + gdb_test "print \$isvoid_copy = 0" " = 0" + + # Can't reset the canonical name. + gdb_test "print \$_isvoid = 0" \ + "Cannot overwrite convenience function _isvoid" } proc test_value_history {} { diff --git a/gdb/value.c b/gdb/value.c index e71f38b0ce4..47e7a616e48 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1883,6 +1883,28 @@ struct internalvar : name (std::move (name)) {} + ~internalvar () + { + clear_internalvar (this); + } + + internalvar (internalvar &&other) + : kind (other.kind), + u (other.u) + { + other.kind = INTERNALVAR_VOID; + } + + internalvar &operator= (internalvar &&other) + { + kind = other.kind; + u = other.u; + other.kind = INTERNALVAR_VOID; + return *this; + } + + DISABLE_COPY_AND_ASSIGN (internalvar); + std::string name; /* We support various different kinds of content of an internal variable. @@ -2320,6 +2342,14 @@ clear_internalvar (struct internalvar *var) xfree (var->u.string); break; + case INTERNALVAR_FUNCTION: + if (var->u.fn.canonical) + { + xfree (var->u.fn.function->name); + xfree (var->u.fn.function); + } + break; + default: break; } @@ -4514,5 +4544,6 @@ and exceeds this limit will cause an error."), add_final_cleanup ([] () { all_values.clear (); + internalvars.clear (); }); }