diff options
author | Mark Wielaard <mark@klomp.org> | 2020-05-17 23:50:41 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2020-05-22 21:02:34 +0200 |
commit | 2221fb6f668a7edc8b8aad69772907aeabbbb0be (patch) | |
tree | c04cf71d53e1f9980c4b2cce159a2c752fd607ab /gcc/testsuite/gcc.dg | |
parent | dc50686d78d4679b727548c3edc1cb6b0d3b658e (diff) | |
download | gcc-2221fb6f668a7edc8b8aad69772907aeabbbb0be.zip gcc-2221fb6f668a7edc8b8aad69772907aeabbbb0be.tar.gz gcc-2221fb6f668a7edc8b8aad69772907aeabbbb0be.tar.bz2 |
analyzer: Add exit, and _exit replacement, to sm-signal.
Warn about using exit in signal handler and suggest _exit as alternative.
gcc/analyzer/ChangeLog:
* sm-signal.cc(signal_unsafe_call::emit): Possibly add
gcc_rich_location note for replacement.
(signal_unsafe_call::get_replacement_fn): New private function.
(get_async_signal_unsafe_fns): Add "exit".
gcc/testsuite/ChangeLog:
* gcc.dg/analyzer/signal-exit.c: New testcase.
Diffstat (limited to 'gcc/testsuite/gcc.dg')
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/signal-exit.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/analyzer/signal-exit.c b/gcc/testsuite/gcc.dg/analyzer/signal-exit.c new file mode 100644 index 0000000..a567124 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/signal-exit.c @@ -0,0 +1,23 @@ +/* Example of a bad call within a signal handler with replacement + alternative. 'handler' calls 'exit', and 'exit' is not allowed + from a signal handler. But '_exit' is allowed. */ + +#include <signal.h> +#include <stdlib.h> + +extern void body_of_program(void); + +static void handler(int signum) +{ + exit(1); /* { dg-warning "call to 'exit' from within signal handler" "warning" } */ + /* { dg-message "note: '_exit' is a possible signal-safe alternative for 'exit'" "replacement note" { target *-*-* } .-1 } */ +} + +int main(int argc, const char *argv) +{ + signal(SIGINT, handler); /* { dg-message "registering 'handler' as signal handler" } */ + + body_of_program(); + + return 0; +} |