1 /* { dg-do compile } */
2 /* { dg-options "-fdiagnostics-path-format=inline-events -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */
3 /* { dg-enable-nn-line-numbers "" } */
4
5 #include <stdio.h>
6 #include <signal.h>
7 #include <stdlib.h>
8
9 extern void body_of_program(void);
10
custom_logger(const char * msg)11 void custom_logger(const char *msg)
12 {
13 fprintf(stderr, "LOG: %s", msg); /* { dg-warning "call to 'fprintf' from within signal handler" } */
14 }
15
int_handler(int signum)16 static void int_handler(int signum)
17 {
18 custom_logger("got signal");
19 }
20
register_handler()21 static void register_handler ()
22 {
23 signal(SIGINT, int_handler);
24 }
25
test(void)26 void test (void)
27 {
28 register_handler ();
29 body_of_program();
30 }
31
32 /* { dg-begin-multiline-output "" }
33 NN | fprintf(stderr, "LOG: %s", msg);
34 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
35 'test': events 1-2
36 |
37 | NN | {
38 | | ^
39 | | |
40 | | (1) entering 'test'
41 | NN | register_handler ();
42 | | ~~~~~~~~~~~~~~~~~~~
43 | | |
44 | | (2) calling 'register_handler'
45 |
46 +--> 'register_handler': events 3-4
47 |
48 | NN | {
49 | | ^
50 | | |
51 | | (3) entering 'register_handler'
52 | NN | signal(SIGINT, int_handler);
53 | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~
54 | | |
55 | | (4) registering 'int_handler' as signal handler
56 |
57 event 5
58 |
59 |cc1:
60 | (5): later on, when the signal is delivered to the process
61 |
62 +--> 'int_handler': events 6-7
63 |
64 | NN | {
65 | | ^
66 | | |
67 | | (6) entering 'int_handler'
68 | NN | custom_logger("got signal");
69 | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~
70 | | |
71 | | (7) calling 'custom_logger'
72 |
73 +--> 'custom_logger': events 8-9
74 |
75 | NN | {
76 | | ^
77 | | |
78 | | (8) entering 'custom_logger'
79 | NN | fprintf(stderr, "LOG: %s", msg);
80 | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81 | | |
82 | | (9) calling 'fprintf'
83 |
84 { dg-end-multiline-output "" } */
85