Implement show | set may-call-functions [on|off]

Inferior function calls are powerful but might lead to undesired
results such as crashes when calling nested functions (frequently
used in particular in Ada).

This implements a GDB setting to disable calling inferior functions.

Note: the idea is that if/when the 'slash command' patch is pushed,
that this setting can be changed e.g. by using the shortcut /c.

This is version 2 of the patch.  It handles all the received comments,
mostly replace 'can-call' by 'may-call', and avoid using
'inferior function call' in factor of 'calling function in the program'.

2019-04-26  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

gdb/ChangeLog
	* NEWS: Mention the new set|show may-call-functions.
	* infcall.c (may_call_functions_p): New variable.
	(show_may_call_functions_p): New function.
	(call_function_by_hand_dummy): Throws an error if not
	may-call-functions.
	(_initialize_infcall): Call add_setshow_boolean_cmd for
	may-call-functions.

gdb/testsuite/ChangeLog
	* gdb.base/callexit.exp: Test may-call-functions off.

gdb/doc/ChangeLog
	* gdb.texinfo (Calling): Document the new
	set|show may-call-functions.
This commit is contained in:
Philippe Waroquiers 2019-04-23 23:43:24 +02:00
parent a45328b93b
commit 136afab8c7
7 changed files with 86 additions and 0 deletions

View File

@ -1,3 +1,13 @@
2019-04-27 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* NEWS: Mention the new set|show may-call-functions.
* infcall.c (may_call_functions_p): New variable.
(show_may_call_functions_p): New function.
(call_function_by_hand_dummy): Throws an error if not
may-call-functions.
(_initialize_infcall): Call add_setshow_boolean_cmd for
may-call-functions.
2019-04-25 Keith Seitz <keiths@redhat.com>
PR c++/24367

View File

@ -27,6 +27,18 @@
'array_indexes', 'symbols', 'unions', 'deref_refs', 'actual_objects',
'static_members', 'max_elements', 'repeat_threshold', and 'format'.
* New commands
set may-call-functions [on|off]
show may-call-functions
This controls whether GDB will attempt to call functions in
the program, such as with expressions in the print command. It
defaults to on. Calling functions in the program being debugged
can have undesired side effects. It is now possible to forbid
such function calls. If function calls are forbidden, GDB will throw
an error when a command (such as print expression) calls a function
in the program.
*** Changes in GDB 8.3
* GDB and GDBserver now support access to additional registers on

View File

@ -1,3 +1,8 @@
2019-04-27 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.texinfo (Calling): Document the new
set|show may-call-functions.
2019-04-22 Pedro Alves <palves@redhat.com>
* gdb.texinfo (Reverse Execution): Mention and xref process record

View File

@ -18693,6 +18693,28 @@ the default C@t{++} exception handler and the inferior terminated.
Show the current setting of stack unwinding in the functions called by
@value{GDBN}.
@item set may-call-functions
@kindex set may-call-functions
@cindex disabling calling functions in the program
@cindex calling functions in the program, disabling
Set permission to call functions in the program.
This controls whether @value{GDBN} will attempt to call functions in
the program, such as with expressions in the @code{print} command. It
defaults to @code{on}.
To call a function in the program, @value{GDBN} has to temporarily
modify the state of the inferior. This has potentially undesired side
effects. Also, having @value{GDBN} call nested functions is likely to
be erroneous and may even crash the program being debugged. You can
avoid such hazards by forbidding @value{GDBN} from calling functions
in the program being debugged. If calling functions in the program
is forbidden, GDB will throw an error when a command (such as printing
an expression) starts a function call in the program.
@item show may-call-functions
@kindex show may-call-functions
Show permission to call functions in the program.
@end table
@subsection Calling functions with no debug info

View File

@ -55,6 +55,17 @@
asynchronous inferior function call implementation, and that in
turn means restructuring the code so that it is event driven. */
static int may_call_functions_p = 1;
static void
show_may_call_functions_p (struct ui_file *file, int from_tty,
struct cmd_list_element *c,
const char *value)
{
fprintf_filtered (file,
_("Permission to call functions in the program is %s.\n"),
value);
}
/* How you should pass arguments to a function depends on whether it
was defined in K&R style or prototype style. If you define a
function using the K&R syntax that takes a `float' argument, then
@ -708,6 +719,10 @@ call_function_by_hand_dummy (struct value *function,
struct gdb_exception e;
char name_buf[RAW_FUNCTION_ADDRESS_SIZE];
if (!may_call_functions_p)
error (_("Cannot call functions in the program: "
"may-call-functions is off."));
if (!target_has_execution)
noprocess ();
@ -1359,6 +1374,17 @@ When the function is done executing, GDB will silently stop."),
void
_initialize_infcall (void)
{
add_setshow_boolean_cmd ("may-call-functions", no_class,
&may_call_functions_p, _("\
Set permission to call functions in the program."), _("\
Show permission to call functions in the program."), _("\
When this permission is on, GDB may call functions in the program.\n\
Otherwise, any sort of attempt to call a function in the program\n\
will result in an error."),
NULL,
show_may_call_functions_p,
&setlist, &showlist);
add_setshow_boolean_cmd ("coerce-float-to-double", class_obscure,
&coerce_float_to_double_p, _("\
Set coercion of floats to doubles when calling functions."), _("\

View File

@ -1,3 +1,7 @@
2019-04-27 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.base/callexit.exp: Test may-call-functions off.
2019-04-25 Keith Seitz <keiths@redhat.com>
PR c++/24367

View File

@ -37,6 +37,13 @@ if { ![runto_main] } {
return 0
}
# Verify set may-call-functions behaviour.
gdb_test_no_output "set may-call-functions off"
gdb_test "call callexit()" \
"Cannot call functions in the program: may-call-functions is off." \
"inferior function call refused in off state"
gdb_test_no_output "set may-call-functions on"
# Call function (causing the program to exit), and see if gdb handles
# it properly.
gdb_test "call callexit()" \