From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27898 invoked by alias); 31 Jul 2018 21:13:09 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 27887 invoked by uid 89); 31 Jul 2018 21:13:08 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-27.6 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=H*F:D*be, Hx-languages-length:2889, HContent-Transfer-Encoding:8bit X-HELO: mailsec105.isp.belgacom.be Received: from mailsec105.isp.belgacom.be (HELO mailsec105.isp.belgacom.be) (195.238.20.101) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 31 Jul 2018 21:13:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=skynet.be; i=@skynet.be; q=dns/txt; s=securemail; t=1533071585; x=1564607585; h=message-id:subject:from:to:cc:date:in-reply-to: references:mime-version:content-transfer-encoding; bh=mVnE/LqUw2Qysxltw+mJ2EwvDIvd8jXXdKC5Hhtmogw=; b=pP01b1PM3mI/Kwb/8sRkTQ5fE4XEPShcTGH5uOCfzIIiiefQtMmujP+d bdyQ/mHTYoLtkkWP3ymJKgbkki/I7w==; Received: from 145.43-64-87.adsl-dyn.isp.belgacom.be (HELO md) ([87.64.43.145]) by relay.skynet.be with ESMTP/TLS/AES256-GCM-SHA384; 31 Jul 2018 23:13:03 +0200 Message-ID: <1533071582.1467.21.camel@skynet.be> Subject: Re: [RFA_v4 1/8] Add helper functions parse_flags and parse_flags_qcs From: Philippe Waroquiers To: Tom Tromey , Joel Brobecker Cc: gdb-patches@sourceware.org Date: Tue, 31 Jul 2018 21:13:00 -0000 In-Reply-To: <87va8v4dmy.fsf@tromey.com> References: <20180710213926.32240-1-philippe.waroquiers@skynet.be> <20180710213926.32240-2-philippe.waroquiers@skynet.be> <20180730201556.GA19069@adacore.com> <87pnz4o2iu.fsf@tromey.com> <20180731135242.GA3186@adacore.com> <87va8v4dmy.fsf@tromey.com> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2018-07/txt/msg00830.txt.bz2 On Tue, 2018-07-31 at 09:40 -0600, Tom Tromey wrote: > > > > > > "Joel" == Joel Brobecker writes: > > > I also found this bug this weekend, while trying out -fsanitize=address. > > > > > > I have a patch for this one. I haven't written the ChangeLog yet but I > > > will try to do it as soon as possible. > > > > > > Actually I have patches to make gdb nearly -fsanitize=address clean; or > > > at least, the ordinary test suite on my machine is down to 1 failure > > > (there are some additional gdbserver failures in bugzilla that I haven't > > > looked at yet). My series also addresses much of -fsanitize=undefined > > > as well. > > Joel> Very nice! > > You may have to wait a bit longer because the buildbot is telling me > this patch is no good. I'll try to debug it tonight. As far as I can see, this problem is a regression that appeared in gdb 8.1, but which was made (more) visible by the 'parse_flags' patch in (future) 8.3. At least valgrind + gdb 8.0 does not give a problem with the small reproducer  command 1 2 end while it gives an error with gdb 8.1. We also have a (small) functional regression: with gdb 8.0, it was possible to remove all commands of a set of breapoints by doing the above 'command 1 2/end'. >From 8.1 onwards, when giving such empty command list, gdb asks the list of command for each breakpoint, instead of asking it once. The below patch seems to solve the memory corruption (at least for the simple case), but does not solve the functional regression that appeared in 8.1. I am wondering if the correct solution would not be to avoid having input lines memory being managed 'manually' like it is now, as having the 'input const char* arg' disappearing 'under the carpet' is quite tricky, and we might have other places where a previous line of input must be kept alive, while new lines of input have to be read. Philippe diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 6b6e1f6c25..dabd81e138 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1222,6 +1222,9 @@ commands_command_1 (const char *arg, int from_tty,      std::string new_arg;   +  /* arg might be an input line that might be released when reading +     new input lines for the list of commands.  So, build a new arg +     to keep the input alive during the map_breakpoint_numbers call.  */    if (arg == NULL || !*arg)      {        if (breakpoint_count - prev_breakpoint_count > 1) @@ -1231,6 +1234,11 @@ commands_command_1 (const char *arg, int from_tty,         new_arg = string_printf ("%d", breakpoint_count);        arg = new_arg.c_str ();      } +  else +    { +      new_arg = arg; +      arg = new_arg.c_str (); +    }      map_breakpoint_numbers      (arg, [&] (breakpoint *b)