mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-12 12:16:04 +08:00
4a94e36819
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
121 lines
4.2 KiB
Plaintext
121 lines
4.2 KiB
Plaintext
# This testcase is part of GDB, the GNU debugger.
|
|
|
|
# Copyright 2004-2022 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 <http://www.gnu.org/licenses/>.
|
|
|
|
# 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 [target_info exists gdb,nosignals] {
|
|
verbose "Skipping signull.exp because of nosignals."
|
|
continue
|
|
}
|
|
|
|
|
|
standard_testfile .c
|
|
|
|
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
|
|
untested "failed to compile"
|
|
return -1
|
|
}
|
|
|
|
clean_restart ${binfile}
|
|
|
|
#
|
|
# Run to `main' where we begin our tests.
|
|
#
|
|
|
|
if ![runto_main] then {
|
|
return 0
|
|
}
|
|
|
|
# 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.
|
|
|
|
if { [is_address_zero_readable] } {
|
|
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_no_output "set test = code_entry_point" \
|
|
"set for function pointer probe"
|
|
set test "probe function pointer"
|
|
set function_pointer code_entry_point
|
|
set signame "SIGSEGV"
|
|
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 "Program received signal SIGBUS.*0.*$gdb_prompt $" {
|
|
set signame SIGBUS
|
|
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"
|
|
gdb_test "handle SIGBUS" "SIGBUS.*Yes.*Yes.*Yes.*Bus error"
|
|
|
|
# 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 } {
|
|
global signame
|
|
gdb_test continue "Breakpoint.* bowler.*" "${name}; start with the bowler"
|
|
# NB: Don't use $tag in the testname - changes across systems.
|
|
gdb_test_no_output "set test = $tag" "${name}; select the pointer type"
|
|
gdb_test continue "Program received signal ${signame}.*" \
|
|
"${name}; take the ${signame}"
|
|
gdb_test backtrace $bt_from_segv "${name}; backtrace from ${signame}"
|
|
gdb_test continue "Breakpoint.* keeper.*" "${name}; continue to the keeper"
|
|
gdb_test backtrace $bt_from_keeper "${name}; backtrace from keeper through ${signame}"
|
|
}
|
|
|
|
test_segv "data read" data_read \
|
|
{#0 .* bowler .*#1 .* main .*} \
|
|
{#0 .* keeper .*#1 .* handler .*#2 .* bowler .*#3 .* main .*}
|
|
test_segv "data write" data_write \
|
|
{#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 .*}
|