This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Test for double freeing in breakpoint_re_set_one


Per Andrew's request, I have added the following test to the testsuite
in gdb.base.  This particular problem, since it involves memory corruption,
won't reliably show itself (i.e., on earlier versions of GDB) unless one
is "lucky" enough to have it cause a segmentation fault or one is using
a checked version of malloc/free in GDB.  I will leave to others Andrew's
question concerning file descriptors on IDT/SIM.  

Paul Hilfinger

2004-01-29  Paul N. Hilfinger  <Hilfinger@gnat.com>

	* gdb.base/chng-syms.exp: New file.
	* gdb.base/chng-syms.c: New file.

Index: merge.82/gdb/testsuite/gdb.base/Makefile.in
--- merge.82/gdb/testsuite/gdb.base/Makefile.in Tue, 17 Jun 2003 02:27:41 -0700 hilfingr (GdbPub/H/20_Makefile.i 1.2 644)
+++ merge.85/gdb/testsuite/gdb.base/Makefile.in Thu, 29 Jan 2004 03:01:11 -0800 hilfingr (GdbPub/H/20_Makefile.i 1.4 644)
@@ -3,7 +3,7 @@ srcdir = @srcdir@
 
 EXECUTABLES = all-types annota1 bitfields break \
 	call-ar-st call-rt-st call-strs callfuncs callfwmall \
-	commands compiler condbreak constvars coremaker \
+	chng-syms commands compiler condbreak constvars coremaker \
 	dbx-test display ending-run execd-prog exprs \
 	foll-exec foll-fork foll-vfork funcargs int-type interrupt jump \
 	langs list long_long mips_pro miscexprs nodebug opaque overlays \
Index: merge.82/gdb/testsuite/gdb.base/chng-syms.exp
--- merge.82/gdb/testsuite/gdb.base/chng-syms.exp Thu, 29 Jan 2004 03:12:31 -0800 hilfingr ()
+++ merge.85/gdb/testsuite/gdb.base/chng-syms.exp Thu, 29 Jan 2004 02:47:41 -0800 hilfingr (GdbPub/k/c/23_badfree.ex 1.2 644)
@@ -0,0 +1,120 @@
+# 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
+}
+
+set prms_id 0
+set bug_id 0
+
+# 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 "chng-syms"
+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 {
+	-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 {
+
+    gdb_run_cmd
+    gdb_expect {
+	-re "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" 
+	}
+    }
+
+}
+
+set timeout $oldtimeout
+verbose "Timeout is now $timeout seconds" 2
+return 0
Index: merge.82/gdb/testsuite/gdb.base/chng-syms.c
--- merge.82/gdb/testsuite/gdb.base/chng-syms.c Thu, 29 Jan 2004 03:12:31 -0800 hilfingr ()
+++ merge.85/gdb/testsuite/gdb.base/chng-syms.c Thu, 29 Jan 2004 02:24:00 -0800 hilfingr (GdbPub/k/c/24_badfree.c 1.1 644)
@@ -0,0 +1,22 @@
+/*
+ *   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 <stdlib.h>
+
+int VARIABLE = 42;
+
+void stop_here ()
+{
+  VARIABLE *= 2;
+}
+
+int main ()
+{
+  stop_here ();
+  exit (0);
+}
+


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]