From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24601 invoked by alias); 28 Jan 2004 12:30:14 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 24549 invoked from network); 28 Jan 2004 12:30:10 -0000 Received: from unknown (HELO nile.gnat.com) (205.232.38.5) by sources.redhat.com with SMTP; 28 Jan 2004 12:30:10 -0000 Received: by nile.gnat.com (Postfix, from userid 1345) id A0ED8F28D8; Wed, 28 Jan 2004 07:30:10 -0500 (EST) From: Paul Hilfinger To: cagney@gnu.org Cc: gdb-patches@sources.redhat.com In-reply-to: <40171322.7080704@gnu.org> (message from Andrew Cagney on Tue, 27 Jan 2004 20:40:50 -0500) Subject: Re: [RFA] breakpoint.c: Avoid double freeing in breakpoint_re_set_one References: <20040113100600.42C1FF2D70@nile.gnat.com> <40171150.5080708@gnu.org> <40171322.7080704@gnu.org> Message-Id: <20040128123010.A0ED8F28D8@nile.gnat.com> Date: Wed, 28 Jan 2004 12:30:00 -0000 X-SW-Source: 2004-01/txt/msg00720.txt.bz2 > > Anyway, I've committed the attached (slightly tweaked). > > Doh! Try ... I was going to say that was quite an editing job! > You wouldn't have a test case - at least something that causes this code > to go through the motions? That way on systems with pedantic memory > managers there'd bee some sort of error. As you suggest, this is a little hard to test. I am not too familiar with the testsuite innards yet. Here is a draft of a possible test. Comments? Paul ---------------------------- gdb.base/badfree.exp -------------------- # Copyright 2004 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 2 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Please email any bugs, comments, and/or additions to this file to: # bug-gdb@prep.ai.mit.edu # Author: Paul N. Hilfinger (Hilfinger@gnat.com) # Test that GDB cleans up properly after errors that result when a # breakpoint is reset. if $tracelevel then { strace $tracelevel } # IDT/SIM apparently doesn't have enough file descriptors to allow the # problem checked by this test to occur. if [istarget "mips-idt-*"] { return 0; } set testfile "badfree" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var1}] != "" } { gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." } set oldtimeout $timeout set timeout 10 verbose "Timeout is now 10 seconds" 2 proc expect_to_stop_here { ident } { global gdb_prompt global decimal # the "at foo.c:36" output we get with -g. # the "in func" output we get without -g. gdb_expect 30 { -re "Breakpoint \[0-9\]*, stop_here .*$gdb_prompt $" { return 1 } -re "$gdb_prompt $" { fail "running to stop_here $ident" return 0 } timeout { fail "running to stop_here $ident (timeout)" return 0 } } return 1 } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} gdb_test "break stop_here if (var1 == 42)\n" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "setting conditional breakpoint on function" gdb_run_cmd expect_to_stop_here "first time" gdb_continue_to_end "breakpoint first time through" # Now we recompile the executable, but without a variable named "var1", first # waiting to insure that even on fast machines, the file modification times # are distinct. This will force GDB to reload the file on the # next "run" command causing an error when GDB tries to tries to reset # the breakpoint. sleep 2 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var2}] != "" } { # Complication: Since GDB generally holds an open file descriptor on the # executable at this point, there are some systems in which the # re-compilation will fail. In such cases, we'll consider the test # (vacuously) passed providing that re-running it succeeds as before. gdb_run_cmd expect_to_stop_here "after re-compile fails" gdb_continue_to_end "after re-compile fails" } else { send_gdb "run\n" gdb_expect { -re ".* has changed; .*Error in re-setting .*No symbol .var1..*Program exited normally.*"\ { pass "running with invalidated bpt condition after executable changes" } timeout { fail "(timeout) running with invalidated bpt condition after executable changes" } } } ---------------------------- gdb.base/badfree.c -------------------- /* * Test that GDB cleans up properly after errors that result when a * breakpoint is reset. */ /* VARIABLE is a macro defined on the compiler command line. */ #include int VARIABLE = 42; void stop_here () { VARIABLE *= 2; } main () { stop_here (); exit (0); }