1
1
// This file is a part of Julia. License is MIT: https://julialang.org/license
2
2
3
- // RUN: % clang --analyze -Xanalyzer -analyzer-output=text -Xclang -load -Xclang %gc_plugin -I%julia_home/src -I%julia_home/src/support -I%julia_home/usr/include -Xclang -analyzer-checker=core,julia.GCChecker --analyzer-no-default-checks -Xclang -verify -Xclang -verify-ignore-unexpected=note -x c %s
3
+ // RUN: clang --analyze -Xanalyzer -analyzer-output=text -Xclang -load -Xclang libGCCheckerPlugin%shlibext -I%julia_home/src -I%julia_home/src/support -I%julia_home/usr/include ${CLANGSA_FLAGS} ${CPPFLAGS} ${CFLAGS} -Xclang -analyzer-checker=core,julia.GCChecker --analyzer-no-default-checks -Xclang -verify -x c %s
4
4
5
5
#include "julia.h"
6
6
#include "julia_internal.h"
7
7
8
+ extern void look_at_value (jl_value_t * v );
9
+ extern void process_unrooted (jl_value_t * maybe_unrooted JL_MAYBE_UNROOTED );
10
+ extern void jl_gc_safepoint ();
11
+
8
12
void unrooted_argument () {
9
- jl_ ((jl_value_t * )jl_svec1 (NULL )); // expected-warning{{Passing non-rooted value as argument to function}}
10
- // expected-note@-1{{Passing non-rooted value as argument to function}}
13
+ look_at_value ((jl_value_t * )jl_svec1 (NULL )); // expected-warning{{Passing non-rooted value as argument to function}}
14
+ // expected-note@-1{{Passing non-rooted value as argument to function}}
15
+ // expected-note@-2{{Started tracking value here}}
11
16
};
12
17
13
18
void simple_svec () {
@@ -16,13 +21,10 @@ void simple_svec() {
16
21
assert (jl_svecref (val , 0 ) == NULL );
17
22
}
18
23
19
- extern void jl_gc_safepoint ();
20
24
jl_value_t * simple_missing_root () {
21
25
jl_svec_t * val = jl_svec1 (NULL );
22
- // This is a GC safepoint, so the above value could have been freed
23
- jl_gc_safepoint (); // expected-note {{Value may have been GCed here}}
24
- return jl_svecref (val , 0 ); // expected-warning{{Argument value may have been GCed}}
25
- // expected-note@-1{{Argument value may have been GCed}}
26
+ jl_gc_safepoint ();
27
+ return jl_svecref (val , 0 ); // XXX-expected-warning{{Passing non-rooted value as argument to function}}
26
28
};
27
29
28
30
jl_value_t * root_value () {
@@ -34,6 +36,64 @@ jl_value_t *root_value() {
34
36
return ret ;
35
37
};
36
38
39
+ void root_value_data () {
40
+ jl_svec_t * val = jl_svec1 (NULL ); // expected-note{{Started tracking value here}}
41
+ jl_value_t * * data = jl_svec_data (val );
42
+ JL_GC_PUSH1 (& val ); // expected-note{{GC frame changed here}}
43
+ // expected-note@-1{{Value was rooted here}}
44
+ jl_gc_safepoint ();
45
+ look_at_value (* data );
46
+ JL_GC_POP (); // expected-note{{GC frame changed here}}
47
+ // expected-note@-1{{Root was released here}}
48
+ jl_gc_safepoint (); // expected-note{{Value may have been GCed here}}
49
+ * data ; // expected-warning{{Creating derivative of value that may have been GCed}}
50
+ // expected-note@-1{{Creating derivative of value that may have been GCed}}
51
+ };
52
+
53
+ void root_value_data2 () {
54
+ jl_svec_t * val = jl_svec1 (NULL ); // expected-note{{Started tracking value here}}
55
+ jl_value_t * * data = jl_svec_data (val );
56
+ JL_GC_PUSH1 (& val ); // expected-note{{GC frame changed here}}
57
+ // expected-note@-1{{Value was rooted here}}
58
+ jl_gc_safepoint ();
59
+ look_at_value (data [0 ]);
60
+ JL_GC_POP (); // expected-note{{GC frame changed here}}
61
+ // expected-note@-1{{Root was released here}}
62
+ jl_gc_safepoint (); // expected-note{{Value may have been GCed here}}
63
+ data [0 ]; // expected-warning{{Creating derivative of value that may have been GCed}}
64
+ // expected-note@-1{{Creating derivative of value that may have been GCed}}
65
+ };
66
+
67
+
68
+ void root_value_data3 () {
69
+ jl_svec_t * val = jl_svec1 (NULL ); // expected-note{{Started tracking value here}}
70
+ jl_value_t * * data = jl_svec_data (val );
71
+ JL_GC_PUSH1 (& val ); // expected-note{{GC frame changed here}}
72
+ // expected-note@-1{{Value was rooted here}}
73
+ jl_gc_safepoint ();
74
+ look_at_value (* * & data );
75
+ JL_GC_POP (); // expected-note{{GC frame changed here}}
76
+ // expected-note@-1{{Root was released here}}
77
+ jl_gc_safepoint (); // expected-note{{Value may have been GCed here}}
78
+ * * & data ; // expected-warning{{Creating derivative of value that may have been GCed}}
79
+ // expected-note@-1{{Creating derivative of value that may have been GCed}}
80
+ };
81
+
82
+ void root_value_data4 () {
83
+ jl_svec_t * val = jl_svec1 (NULL ); // expected-note{{Started tracking value here}}
84
+ jl_value_t * * data = jl_svec_data (val );
85
+ JL_GC_PUSH1 (& val ); // expected-note{{GC frame changed here}}
86
+ // expected-note@-1{{Value was rooted here}}
87
+ jl_gc_safepoint ();
88
+ look_at_value (* & data [0 ]);
89
+ JL_GC_POP (); // expected-note{{GC frame changed here}}
90
+ // expected-note@-1{{Root was released here}}
91
+ jl_gc_safepoint (); // expected-note{{Value may have been GCed here}}
92
+ * & data [0 ]; // expected-warning{{Creating derivative of value that may have been GCed}}
93
+ // expected-note@-1{{Creating derivative of value that may have been GCed}}
94
+ };
95
+
96
+
37
97
jl_value_t * existing_root () {
38
98
jl_svec_t * val = NULL ;
39
99
JL_GC_PUSH1 (& val );
@@ -46,7 +106,7 @@ jl_value_t *existing_root() {
46
106
47
107
jl_value_t * late_root () {
48
108
jl_svec_t * val = NULL ;
49
- val = jl_svec1 (NULL );
109
+ val = jl_svec1 (NULL ); // expected-note {{Started tracking value here}}
50
110
jl_gc_safepoint (); // expected-note {{Value may have been GCed here}}
51
111
JL_GC_PUSH1 (& val ); // expected-warning{{Trying to root value which may have been GCed}}
52
112
// expected-note@-1{{Trying to root value which may have been GCed}}
@@ -58,8 +118,8 @@ jl_value_t *late_root() {
58
118
jl_value_t * late_root2 () {
59
119
jl_svec_t * val = NULL ;
60
120
jl_svec_t * val2 = NULL ;
61
- JL_GC_PUSH1 (& val );
62
- val2 = jl_svec1 (NULL );
121
+ JL_GC_PUSH1 (& val ); // expected-note {{GC frame changed here}}
122
+ val2 = jl_svec1 (NULL ); // expected-note {{Started tracking value here}}
63
123
jl_gc_safepoint (); // expected-note {{Value may have been GCed here}}
64
124
val = val2 ; // expected-warning{{Trying to root value which may have been GCed}}
65
125
// expected-note@-1{{Trying to root value which may have been GCed}}
@@ -71,19 +131,18 @@ jl_value_t *late_root2() {
71
131
jl_value_t * already_freed () {
72
132
jl_svec_t * val = NULL ;
73
133
JL_GC_PUSH1 (& val );
74
- val = jl_svec1 (NULL ); // expected-note {{Value was rooted here}}
75
- JL_GC_POP (); // exptected-noted {{Root was released here}}
76
- jl_gc_safepoint (); // expected-note {{Value may have been GCed here}}
77
- jl_value_t * ret = jl_svecref (val , 0 ); // expected-warning{{Argument value may have been GCed}}
78
- // expected-note@-1{{Argument value may have been GCed}}
134
+ val = jl_svec1 (NULL );
135
+ JL_GC_POP ();
136
+ jl_gc_safepoint ();
137
+ jl_value_t * ret = jl_svecref (val , 0 );
79
138
return ret ;
80
139
};
81
140
82
141
int field_access () {
83
- jl_svec_t * val = jl_svec1 (NULL );
142
+ jl_svec_t * val = jl_svec1 (NULL ); // expected-note {{Started tracking value here}}
84
143
jl_gc_safepoint (); // expected-note{{Value may have been GCed here}}
85
- return val -> length == 1 ; // expected-warning{{Creating derivative of value that may have been GCed}}
86
- // expected-note@-1{{Creating derivative of value that may have been GCed}}
144
+ return val -> length == 1 ; // expected-warning{{Trying to access value which may have been GCed}}
145
+ // expected-note@-1{{Trying to access value which may have been GCed}}
87
146
}
88
147
89
148
int pushargs_roots () {
@@ -98,27 +157,26 @@ int pushargs_roots() {
98
157
99
158
int pushargs_roots_freed () {
100
159
jl_value_t * * margs ;
101
- jl_svec_t * val = jl_svec1 (NULL );;
102
- JL_GC_PUSHARGS (margs , 1 );
160
+ jl_svec_t * val = jl_svec1 (NULL ); // expected-note{{Started tracking value here}}
161
+ JL_GC_PUSHARGS (margs , 1 ); // expected-note{{GC frame changed here}}
103
162
margs [0 ] = (jl_value_t * )val ; // expected-note{{Value was rooted here}}
104
- JL_GC_POP (); // expected-note{{Root was released here}}
163
+ JL_GC_POP (); // expected-note{{GC frame changed here}}
164
+ // expected-note@-1{{Root was released here}}
105
165
jl_gc_safepoint (); // expected-note{{Value may have been GCed here}}
106
- return val -> length == 1 ; // expected-warning{{Creating derivative of value that may have been GCed}}
107
- // expected-note@-1{{Creating derivative of value that may have been GCed}}
166
+ return val -> length == 1 ; // expected-warning{{Trying to access value which may have been GCed}}
167
+ // expected-note@-1{{Trying to access value which may have been GCed}}
108
168
}
109
169
110
- extern void process_unrooted (jl_value_t * maybe_unrooted JL_MAYBE_UNROOTED );
111
170
int unrooted () {
112
- jl_svec_t * val = jl_svec1 (NULL );
171
+ jl_svec_t * val = jl_svec1 (NULL ); // expected-note{{Started tracking value here}}
113
172
// This is ok
114
173
process_unrooted ((jl_value_t * )val ); // expected-note{{Value may have been GCed here}}
115
174
// This is not
116
- return val -> length == 1 ; // expected-warning{{Creating derivative of value that may have been GCed}}
117
- // expected-note@-1{{Creating derivative of value that may have been GCed}}
175
+ return val -> length == 1 ; // expected-warning{{Trying to access value which may have been GCed}}
176
+ // expected-note@-1{{Trying to access value which may have been GCed}}
118
177
}
119
178
120
179
extern jl_value_t * global_value JL_GLOBALLY_ROOTED ;
121
- extern void look_at_value (jl_value_t * v );
122
180
void globally_rooted () {
123
181
jl_value_t * val = global_value ;
124
182
jl_gc_safepoint ();
@@ -284,20 +342,22 @@ void assoc_exact_broken(jl_value_t **args, size_t n, int8_t offs, size_t world)
284
342
}
285
343
*/
286
344
287
- void assoc_exact_ok (jl_value_t * * args , size_t n , int8_t offs , size_t world ) {
345
+ void assoc_exact_ok (jl_value_t * args1 , jl_value_t * * args , size_t n , int8_t offs , size_t world ) {
288
346
jl_typemap_level_t * cache = jl_new_typemap_level ();
289
347
JL_GC_PUSH1 (& cache );
290
- jl_typemap_assoc_exact (cache -> any , args , n , offs , world );
348
+ jl_typemap_assoc_exact (cache -> any , args1 , args , n , offs , world );
291
349
JL_GC_POP ();
292
350
}
293
351
294
352
// jl_box_* special cases
295
353
void box_special_cases1 (int i ) {
296
- jl_ (jl_box_long (i )); //expected-warning{{Passing non-rooted value as argument to function that may GC}}
354
+ look_at_value (jl_box_long (i )); // expected-warning{{Passing non-rooted value as argument to function}}
355
+ // expected-note@-1{{Passing non-rooted value as argument to function}}
356
+ // expected-note@-2{{Started tracking value here}}
297
357
}
298
358
299
359
void box_special_cases2 () {
300
- jl_ (jl_box_long (0 ));
360
+ look_at_value (jl_box_long (0 ));
301
361
}
302
362
303
363
jl_value_t * alloc_something ();
@@ -330,7 +390,6 @@ typedef struct _varbinding {
330
390
jl_value_t * ub ;
331
391
} jl_varbinding_t ;
332
392
333
- extern void look_at_value (jl_value_t * v );
334
393
extern void escape_vb (jl_varbinding_t * * vb );
335
394
void stack_rooted (jl_value_t * lb JL_MAYBE_UNROOTED , jl_value_t * ub JL_MAYBE_UNROOTED ) {
336
395
jl_varbinding_t vb = { NULL , lb , ub };
@@ -340,11 +399,10 @@ void stack_rooted(jl_value_t *lb JL_MAYBE_UNROOTED, jl_value_t *ub JL_MAYBE_UNRO
340
399
JL_GC_POP ();
341
400
}
342
401
343
- extern void look_at_value (jl_value_t * v );
344
402
void JL_NORETURN throw_internal (jl_value_t * e JL_MAYBE_UNROOTED )
345
403
{
346
404
jl_ptls_t ptls = jl_get_ptls_states ();
347
- ptls -> exception_in_transit = e ;
405
+ ptls -> sig_exception = e ;
348
406
jl_gc_unsafe_enter (ptls );
349
407
look_at_value (e );
350
408
}
0 commit comments