From patchwork Thu Oct 19 09:29:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Frants X-Patchwork-Id: 23680 Received: (qmail 68340 invoked by alias); 19 Oct 2017 09:31:08 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 35128 invoked by uid 89); 19 Oct 2017 09:29:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-wm0-f65.google.com Received: from mail-wm0-f65.google.com (HELO mail-wm0-f65.google.com) (74.125.82.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 19 Oct 2017 09:29:50 +0000 Received: by mail-wm0-f65.google.com with SMTP id b189so14586705wmd.4 for ; Thu, 19 Oct 2017 02:29:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=RIn56NcSD3qx3a5M+hObkiTMN9zt+B/EzgZn0fMQJpg=; b=WCPT4hoenYhsFzd4m0SVLZQFiA0Kshc8lGxaBpJg5XB6+1kowmk/3V0qBNLppb8kEX ou1hEydbNo4pD2V28YoFRKVxBBMVEX2woErNlpMrpCwV8OvDGMJHS9Ms+Zr1LG83sSBz Y/MHzGZxdVSeJkjFYTBbgx+JfvTkQmG8k0mPZnLHsnpXgRkX3Cs4Zai526ct+unKpWh2 JBb/lS2i+pt7D1HnT7cuwVmVoPUdqzGq9p1PIip1pyzw97BDHu3OMx1ru+2YOvicVuA0 0hqj8/cPQWFW/J/oNIfJ1un637oI2/xRnDV2HpMBztm3aVRB33UYsiSqKLY3bXqGXJw5 4C5w== X-Gm-Message-State: AMCzsaUJbAj/aE9+AZ0lpeEv9uZm2MeccMLBeFdVagX4P/h257c4QM37 DQIxGmt7+WXCUetgHtspVnLhAQYa2DQ= X-Google-Smtp-Source: ABhQp+SVovgEYA8R9/2Un2CS+rTenZmmSEEqDvYqPE+PeHfnvxxwiBRoUQf5AzCvY1yB6CvX2Ol0Zg== X-Received: by 10.80.243.12 with SMTP id p12mr1665707edm.38.1508405387720; Thu, 19 Oct 2017 02:29:47 -0700 (PDT) Received: from centos7dev.localdomain ([213.207.96.130]) by smtp.gmail.com with ESMTPSA id b36sm10402870edd.67.2017.10.19.02.29.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 19 Oct 2017 02:29:47 -0700 (PDT) From: Patrick Frants To: gdb-patches@sourceware.org Cc: Patrick Frants Subject: [PATCH] Fix faulty use of obstack_free() to *shrink* dont_print_statmem_obstack. Instead use obstack_blank_fast() with a "negative" size. A real stack data structured would be appropriate here. Added unit test gdb/testsuite/gdb.cp/printstaticrecursion.exp. Date: Thu, 19 Oct 2017 11:29:41 +0200 Message-Id: <1508405381-16638-1-git-send-email-osscontribute@gmail.com> Recursion detection for static members was not working because when popping addresses of the stack, the stack was unintentionally cleared, leaving the stack empty. This was caused by a call to obstack_next_free(), which frees the current object. The fix uses obstack_blank_fast with a negative size to shrink the current object with the desired amount. A unit test (gdb.cp/printstaticrecursion.exp) was added. No new regression has been observed in testsuite/gdb.cp/*.exp. --- gdb/cp-valprint.c | 11 +++----- gdb/testsuite/gdb.cp/printstaticrecursion.cc | 21 +++++++++++++++ gdb/testsuite/gdb.cp/printstaticrecursion.exp | 39 +++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 gdb/testsuite/gdb.cp/printstaticrecursion.cc create mode 100644 gdb/testsuite/gdb.cp/printstaticrecursion.exp diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index fb9bfd9..8f9658d 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -370,14 +370,9 @@ cp_print_value_fields (struct type *type, struct type *real_type, if (obstack_final_size > statmem_obstack_initial_size) { - /* In effect, a pop of the printed-statics stack. */ - - void *free_to_ptr = - (char *) obstack_next_free (&dont_print_statmem_obstack) - - (obstack_final_size - statmem_obstack_initial_size); - - obstack_free (&dont_print_statmem_obstack, - free_to_ptr); + /* In effect, a pop of the printed-statics stack. */ + size_t shrink_bytes = statmem_obstack_initial_size - obstack_final_size; + obstack_blank_fast(&dont_print_statmem_obstack, shrink_bytes); } if (last_set_recurse != recurse) diff --git a/gdb/testsuite/gdb.cp/printstaticrecursion.cc b/gdb/testsuite/gdb.cp/printstaticrecursion.cc new file mode 100644 index 0000000..616c00d --- /dev/null +++ b/gdb/testsuite/gdb.cp/printstaticrecursion.cc @@ -0,0 +1,21 @@ +#include + +struct Inner +{ + static Inner instance; +}; + + +struct Outer +{ + Inner inner; + static Outer instance; +}; + +Inner Inner::instance; +Outer Outer::instance; + +int main() +{ + return 0; /* break-here */ +} \ No newline at end of file diff --git a/gdb/testsuite/gdb.cp/printstaticrecursion.exp b/gdb/testsuite/gdb.cp/printstaticrecursion.exp new file mode 100644 index 0000000..1407c12 --- /dev/null +++ b/gdb/testsuite/gdb.cp/printstaticrecursion.exp @@ -0,0 +1,39 @@ +# Copyright 2008-2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +if { [skip_cplus_tests] } { continue } + +standard_testfile printstaticrecursion.cc + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info "c++"] { + untested "couldn't find a valid c++ compiler" + return -1 +} + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} { + return -1 +} + +if ![runto_main] then { + perror "couldn't run to main" + continue +} + +gdb_test "print Outer::instance" "{inner = {static instance = {static instance = }}, static instance = {inner = {static instance = {static instance = }}, static instance = }}" "Print recursive static member" +gdb_exit +return 0