diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/gdb1476.c | 12 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/gdb1476.exp | 72 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/signull.c | 68 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/signull.exp | 117 |
5 files changed, 190 insertions, 84 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ae02e302c8b..683fa4e48b6 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-05-13 Andrew Cagney <cagney@redhat.com> + + * gdb.base/signull.exp, gdb.base/signull.c: New files. + * gdb.base/gdb1476.c, gdb.base/gdb1476.exp: Delete files. + 2004-05-11 Andrew Cagney <cagney@redhat.com> * gdb.base/sigstep.exp (advancei): Update KFAILs. gdb/1613 is diff --git a/gdb/testsuite/gdb.base/gdb1476.c b/gdb/testsuite/gdb.base/gdb1476.c deleted file mode 100644 index c3f43760bf3..00000000000 --- a/gdb/testsuite/gdb.base/gdb1476.c +++ /dev/null @@ -1,12 +0,0 @@ -void x() -{ - void (*fp)() = 0; - fp(); -} - -int -main() -{ - x(); - return 0; -} diff --git a/gdb/testsuite/gdb.base/gdb1476.exp b/gdb/testsuite/gdb.base/gdb1476.exp deleted file mode 100644 index b88b2de0652..00000000000 --- a/gdb/testsuite/gdb.base/gdb1476.exp +++ /dev/null @@ -1,72 +0,0 @@ -# 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@gnu.org - -# This file is part of the gdb testsuite. - -if $tracelevel { - strace $tracelevel -} - -# Testcase for backtrace/gdb1476. - -set prms_id 0 -set bug_id 0 - -set testfile "gdb1476" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -# -# Run to `main' where we begin our tests. -# - -if ![runto_main] then { - gdb_suppress_tests -} - -# If we can examine what's at memory address 0, it is possible that we -# could also execute it. This could probably make us run away, -# executing random code, which could have all sorts of ill effects, -# especially on targets without an MMU. Don't run the tests in that -# case. - -send_gdb "x 0\n" -gdb_expect { - -re "0x0:.*Cannot access memory at address 0x0.*$gdb_prompt $" { } - -re "0x0:.*Error accessing memory address 0x0.*$gdb_prompt $" { } - -re ".*$gdb_prompt $" { - untested "Memory at address 0 is possibly executable" - return - } -} - -gdb_test "continue" "Program received signal SIGSEGV.*" \ - "continue to null pointer call" - -gdb_test "backtrace 10" \ - "#0\[ \t\]*0x0* in .*\r\n#1\[ \t\]*$hex in x.*\r\n#2\[ \t\]*$hex in main.*" \ - "backtrace from null pointer call" diff --git a/gdb/testsuite/gdb.base/signull.c b/gdb/testsuite/gdb.base/signull.c new file mode 100644 index 00000000000..266a7dcb6c8 --- /dev/null +++ b/gdb/testsuite/gdb.base/signull.c @@ -0,0 +1,68 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 1996, 1999, 2003 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. */ + +#include <signal.h> +#include <setjmp.h> + +enum tests { + code_entry_point, code_descriptor, data_pointer +}; + +static volatile enum tests test; + +/* Some basic types and zero buffers. */ + +typedef long data_t; +typedef long code_t (void); +static volatile data_t *data[10]; +static volatile code_t *code[10]; + +jmp_buf env; + +extern void +keeper (int sig) +{ + longjmp (env, 0); +} + +extern long +bowler (void) +{ + switch (test) + { + case data_pointer: + return *data[0]; + case code_entry_point: + return code[0] (); + case code_descriptor: + return ((code_t *) &code) (); + } +} + +int +main () +{ + static volatile int i; + signal (SIGSEGV, keeper); + for (i = 0; i < 10; i++) + { + setjmp (env); + bowler (); + } +} diff --git a/gdb/testsuite/gdb.base/signull.exp b/gdb/testsuite/gdb.base/signull.exp new file mode 100644 index 00000000000..78cbdafa055 --- /dev/null +++ b/gdb/testsuite/gdb.base/signull.exp @@ -0,0 +1,117 @@ +# This testcase is part of GDB, the GNU debugger. + +# 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. + +# Check that GDB can trigger and backtrace SIGSEGV signal stacks +# caused by both accessing (data) and executing (code) at address +# zero. + +# On function descriptor architectures, a zero descriptor, instead of +# a NULL pointer, is used. That way the NULL code test always +# contains a zero code reference. + +# For recovery, sigjmp/longjmp are used. + +# This also tests backtrace/gdb1476. + +if $tracelevel { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "signull" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# +# Run to `main' where we begin our tests. +# + +if ![runto_main] then { + gdb_suppress_tests +} + +# If we can examine what's at memory address 0, it is possible that we +# could also execute it. This could probably make us run away, +# executing random code, which could have all sorts of ill effects, +# especially on targets without an MMU. Don't run the tests in that +# case. + +send_gdb "x 0\n" +gdb_expect { + -re "0x0:.*Cannot access memory at address 0x0.*$gdb_prompt $" { } + -re "0x0:.*Error accessing memory address 0x0.*$gdb_prompt $" { } + -re ".*$gdb_prompt $" { + untested "Memory at address 0 is possibly executable" + return + } +} + +# If an attempt to call a NULL pointer leaves the inferior in main, +# then function pointers are descriptors, probe this and remember the +# result. + +gdb_test "set test = code_entry_point" "" "set for function pointer probe" +set test "probe function pointer" +set function_pointer code_entry_point +gdb_test_multiple "continue" "$test" { + -re "Program received signal SIGSEGV.* bowler .$gdb_prompt $" { + set function_pointer code_descriptor + pass "$test (function descriptor)" + } + -re "Program received signal SIGSEGV.*0.*$gdb_prompt $" { + pass "$test (function entry-point)" + } +} + +# Re-start from scratch, breakpoint the bowler so that control is +# regained after each test, and run up to that. +rerun_to_main +gdb_test "break bowler" +gdb_test "break keeper" +# By default Stop:Yes Print:Yes Pass:Yes +gdb_test "handle SIGSEGV" "SIGSEGV.*Yes.*Yes.*Yes.*Segmentation fault" + +# For the given signal type, check that: the SIGSEGV occures; a +# backtrace from the SEGV works; the sigsegv is delivered; a backtrace +# through the SEGV works. + +proc test_segv { name tag bt_from_segv bt_from_keeper } { + gdb_test continue "Breakpoint.* bowler.*" "${name} starts with the bowler" + gdb_test "set test = $tag" + gdb_test continue "Program received signal SIGSEGV.*" "${name} got SEGV" + gdb_test backtrace $bt_from_segv "backtrace segv for ${name}" + gdb_test continue "Breakpoint.* keeper.*" "${name} through to keeper" + gdb_test backtrace $bt_from_keeper "backtrace keeper for ${name}" +} + +test_segv data data_pointer \ + {#0 .* bowler .*#1 .* main .*} \ + {#0 .* keeper .*#1 .* handler .*#2 .* bowler .*#3 .* main .*} +test_segv code $function_pointer \ + {#0 .* 0x0+ .*#1 .* bowler .*#2 .* main .*} \ + {#0 .* keeper .*#1 .* handler .*#2 .* 0x0+ .*#3 .* bowler .*#4 .* main .*} |