comparison gcc/testsuite/gcc.dg/analyzer/analyzer-verbosity-0.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
comparison
equal deleted inserted replaced
131:84e7813d76e9 145:1830386684a0
1 /* { dg-additional-options "-fdiagnostics-show-line-numbers -fdiagnostics-path-format=inline-events -fdiagnostics-show-caret -fanalyzer-verbosity=0" } */
2 /* { dg-enable-nn-line-numbers "" } */
3
4 #include <stdlib.h>
5
6 void calls_free_1 (void *ptr)
7 {
8 free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */
9 }
10
11 void test_1 (void *ptr, int a, int b)
12 {
13 if (a)
14 calls_free_1 (ptr);
15
16 if (b)
17 {
18 }
19 else
20 calls_free_1 (ptr);
21 }
22
23 /* { dg-begin-multiline-output "" }
24 NN | free (ptr);
25 | ^~~~~~~~~~
26 'test_1': event 1
27 |
28 | NN | calls_free_1 (ptr);
29 | | ^~~~~~~~~~~~~~~~~~
30 | | |
31 | | (1) calling 'calls_free_1' from 'test_1'
32 |
33 +--> 'calls_free_1': event 2
34 |
35 | NN | free (ptr);
36 | | ^~~~~~~~~~
37 | | |
38 | | (2) first 'free' here
39 |
40 <------+
41 |
42 'test_1': events 3-4
43 |
44 | NN | calls_free_1 (ptr);
45 | | ^~~~~~~~~~~~~~~~~~
46 | | |
47 | | (3) returning to 'test_1' from 'calls_free_1'
48 |......
49 | NN | calls_free_1 (ptr);
50 | | ~~~~~~~~~~~~~~~~~~
51 | | |
52 | | (4) passing freed pointer 'ptr' in call to 'calls_free_1' from 'test_1'
53 |
54 +--> 'calls_free_1': event 5
55 |
56 | NN | free (ptr);
57 | | ^~~~~~~~~~
58 | | |
59 | | (5) second 'free' here; first 'free' was at (2)
60 |
61 { dg-end-multiline-output "" } */
62
63 void calls_free_2 (void *ptr)
64 {
65 free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */
66 }
67
68 void test_2 (void *ptr, int a, int b)
69 {
70 switch (a)
71 {
72 default:
73 break;
74 case 1:
75 break;
76 case 3:
77 calls_free_2 (ptr);
78 break;
79 }
80
81 switch (b)
82 {
83 default:
84 calls_free_2 (ptr);
85 break;
86 case 1:
87 break;
88 case 42:
89 break;
90 }
91 }
92
93 /* { dg-begin-multiline-output "" }
94 NN | free (ptr);
95 | ^~~~~~~~~~
96 'test_2': event 1
97 |
98 | NN | calls_free_2 (ptr);
99 | | ^~~~~~~~~~~~~~~~~~
100 | | |
101 | | (1) calling 'calls_free_2' from 'test_2'
102 |
103 +--> 'calls_free_2': event 2
104 |
105 | NN | free (ptr);
106 | | ^~~~~~~~~~
107 | | |
108 | | (2) first 'free' here
109 |
110 <------+
111 |
112 'test_2': events 3-4
113 |
114 | NN | calls_free_2 (ptr);
115 | | ^~~~~~~~~~~~~~~~~~
116 | | |
117 | | (3) returning to 'test_2' from 'calls_free_2'
118 |......
119 | NN | calls_free_2 (ptr);
120 | | ~~~~~~~~~~~~~~~~~~
121 | | |
122 | | (4) passing freed pointer 'ptr' in call to 'calls_free_2' from 'test_2'
123 |
124 +--> 'calls_free_2': event 5
125 |
126 | NN | free (ptr);
127 | | ^~~~~~~~~~
128 | | |
129 | | (5) second 'free' here; first 'free' was at (2)
130 |
131 { dg-end-multiline-output "" } */
132
133 // TODO: range cases
134
135 /* The call/return to this function shouldn't appear in the path. */
136
137 void called_by_test_3 (void)
138 {
139 }
140
141 void test_3 (void *ptr)
142 {
143 free (ptr);
144 called_by_test_3 ();
145 free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */
146 }
147
148 /* { dg-begin-multiline-output "" }
149 NN | free (ptr);
150 | ^~~~~~~~~~
151 'test_3': events 1-2
152 |
153 | NN | free (ptr);
154 | | ^~~~~~~~~~
155 | | |
156 | | (1) first 'free' here
157 | NN | called_by_test_3 ();
158 | NN | free (ptr);
159 | | ~~~~~~~~~~
160 | | |
161 | | (2) second 'free' here; first 'free' was at (1)
162 |
163 { dg-end-multiline-output "" } */