]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/analyzer/data-model-1.c
1 /* { dg-require-effective-target alloca } */
6 #include "analyzer-decls.h"
13 /* Fields of a local. */
19 __analyzer_eval (f
.i
== 1); /* { dg-warning "TRUE" } */
22 /* Fields of a param. */
24 void test_2 (struct foo f
)
26 __analyzer_eval (f
.i
== 2); /* { dg-warning "UNKNOWN" } */
28 __analyzer_eval (f
.i
== 2); /* { dg-warning "TRUE" } */
31 /* Fields of a param ptr. */
33 void test_3 (struct foo
*f
)
35 __analyzer_eval (f
->i
== 3); /* { dg-warning "UNKNOWN" } */
37 __analyzer_eval (f
->i
== 3); /* { dg-warning "TRUE" } */
40 /* Fields of a global ptr. */
41 struct foo
*global_foo_ptr
;
45 struct foo
*tmp
= global_foo_ptr
;
46 __analyzer_eval (global_foo_ptr
->i
== 3); /* { dg-warning "UNKNOWN" } */
47 global_foo_ptr
->i
= 3;
48 __analyzer_eval (global_foo_ptr
->i
== 3); /* { dg-warning "TRUE" } */
51 /* Pointer to a local. */
59 __analyzer_eval (i
== 2); /* { dg-warning "TRUE" } */
67 a
[3] = 5; /* ARRAY_REF. */
68 __analyzer_eval (a
[3] == 5); /* { dg-warning "TRUE" } */
71 /* Local array, but using an unknown index. */
73 void test_5a (int idx
)
76 a
[idx
] = 5; /* ARRAY_REF. */
77 __analyzer_eval (a
[idx
] == 5); /* { dg-warning "TRUE" } */
80 /* Array passed in as a param. */
82 void test_6 (int a
[10])
84 /* POINTER_PLUS_EXPR then a MEM_REF. */
85 __analyzer_eval (a
[3] == 42); /* { dg-warning "UNKNOWN" } */
87 __analyzer_eval (a
[3] == 42); /* { dg-warning "TRUE" } */
90 /* Array passed in as a param ptr. */
94 __analyzer_eval (a
[3] == 42); /* { dg-warning "UNKNOWN" } */
96 __analyzer_eval (a
[3] == 42); /* { dg-warning "TRUE" } */
105 __analyzer_eval (glob_a
== 42); /* { dg-warning "UNKNOWN" } */
107 __analyzer_eval (glob_a
== 42); /* { dg-warning "TRUE" } */
114 void *p
= malloc (256);
115 void *q
= malloc (256);
117 /* malloc results should be unique. */
118 __analyzer_eval (p
== q
); /* { dg-warning "FALSE" } */
119 __analyzer_eval (p
!= q
); /* { dg-warning "TRUE" } */
120 __analyzer_eval (p
<= q
); /* { dg-warning "UNKNOWN" } */
121 __analyzer_eval (p
>= q
); /* { dg-warning "UNKNOWN" } */
122 __analyzer_eval (p
< q
); /* { dg-warning "UNKNOWN" } */
123 __analyzer_eval (p
> q
); /* { dg-warning "UNKNOWN" } */
125 __analyzer_eval (p
== p
); /* { dg-warning "TRUE" } */
126 __analyzer_eval (p
!= p
); /* { dg-warning "FALSE" } */
127 __analyzer_eval (p
<= p
); /* { dg-warning "TRUE" } */
128 __analyzer_eval (p
>= p
); /* { dg-warning "TRUE" } */
129 __analyzer_eval (p
< p
); /* { dg-warning "FALSE" } */
130 __analyzer_eval (p
> p
); /* { dg-warning "FALSE" } */
134 // TODO: mark freed memory as freed
135 //__analyzer_break ();
142 void *p
= __builtin_alloca (256);
143 void *q
= __builtin_alloca (256);
145 /* alloca results should be unique. */
146 __analyzer_eval (p
== q
); /* { dg-warning "FALSE" } */
148 // FIXME: complain about uses of poisoned values
151 /* Use of uninit value. */
155 return i
; // FIXME: do we see the return stmt?
158 void test_12b (void *p
, void *q
)
160 __analyzer_eval (p
== q
); /* { dg-warning "UNKNOWN" } */
168 j
= i
; // FIXME: should complain about this
179 int test_12d (struct coord c
)
183 __analyzer_eval (d
.x
== c
.x
); /* { dg-warning "TRUE" } */
184 __analyzer_eval (d
.y
== c
.y
); /* { dg-warning "TRUE" } */
185 __analyzer_eval (d
.x
== d
.y
); /* { dg-warning "UNKNOWN" } */
186 /* d and c share an unknown value of type "struct coord".
187 But d.x and d.y should be different unknown values (although they inherit
191 /* Nested structs. */
202 void test_13 (struct outer
*o
)
204 __analyzer_eval (o
->mid
.in
.f
== 0.f
); /* { dg-warning "UNKNOWN" } */
206 __analyzer_eval (o
->mid
.in
.f
== 0.f
); /* { dg-warning "TRUE" } */
209 void test_14 (struct outer o
)
211 __analyzer_eval (o
.mid
.in
.f
== 0.f
); /* { dg-warning "UNKNOWN" } */
213 __analyzer_eval (o
.mid
.in
.f
== 0.f
); /* { dg-warning "TRUE" } */
216 void test_15 (const char *str
)
219 __analyzer_eval (ch
== 'a'); /* { dg-warning "UNKNOWN" } */
220 __analyzer_eval (ch
== str
[0]); /* { dg-warning "TRUE" } */
223 __analyzer_eval (ch
== 'a'); /* { dg-warning "TRUE" } */
224 __analyzer_eval (str
[0] == 'a'); /* { dg-warning "UNKNOWN" } */
229 const char *msg
= "hello world";
231 __analyzer_eval (msg
!= NULL
); /* { dg-warning "TRUE" } */
233 __analyzer_eval (msg
[0] == 'h'); /* { dg-warning "TRUE" } */
235 __analyzer_eval (msg
[1] == 'e'); /* { dg-warning "TRUE" } */
237 __analyzer_eval (strlen (msg
) == 11); /* { dg-warning "TRUE" } */
240 __analyzer_eval (msg
[100] == 'e'); /* { dg-warning "UNKNOWN" } */
241 // TODO: some kind of warning for the out-of-bounds access
244 static const char *__attribute__((noinline
))
245 get_hello_world (void)
247 return "hello world";
250 void test_16_alt (void)
252 const char *msg
= get_hello_world ();
254 __analyzer_eval (msg
!= NULL
); /* { dg-warning "TRUE" } */
256 __analyzer_eval (msg
[0] == 'h'); /* { dg-warning "TRUE" } */
258 __analyzer_eval (msg
[1] == 'e'); /* { dg-warning "TRUE" } */
260 __analyzer_eval (strlen (msg
) == 11); /* { dg-warning "TRUE" } */
263 void test_16a (const char *msg
)
265 __analyzer_eval (strlen (msg
) == 11); /* { dg-warning "UNKNOWN" } */
268 void test_16b (const char *msg
)
270 __analyzer_eval (strlen (msg
) == strlen (msg
)); /* { dg-warning "TRUE" "desired" { xfail *-*-* } } */
271 /* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-1 } */
275 extern int unknown_result (void);
277 void test_16c (int i
)
282 __analyzer_eval (j
== i
); /* { dg-warning "TRUE" } */
284 j
= unknown_result ();
285 __analyzer_eval (j
== i
); /* { dg-warning "UNKNOWN" } */
288 void test_16c_a (void)
292 i
= unknown_result ();
293 j
= unknown_result ();
294 __analyzer_eval (i
== j
); /* { dg-warning "UNKNOWN" } */
299 void test_16d (int i
)
302 __analyzer_eval (global_int_16d
== i
); /* { dg-warning "TRUE" } */
304 global_int_16d
= unknown_result ();
305 __analyzer_eval (global_int_16d
== i
); /* { dg-warning "UNKNOWN" } */
308 extern void might_write_to (int *);
310 void test_16e (int i
)
315 __analyzer_eval (j
== i
); /* { dg-warning "TRUE" } */
318 __analyzer_eval (j
== i
); /* { dg-warning "UNKNOWN" } */
324 __analyzer_eval (j
== 42); /* { dg-warning "TRUE" } */
326 __analyzer_eval (i
== j
); /* { dg-warning "UNKNOWN" } */
328 __analyzer_eval (i
== j
); /* { dg-warning "TRUE" } */
334 __analyzer_eval (i
== 42); /* { dg-warning "UNKNOWN" } */
338 __analyzer_eval (i
== j
); /* { dg-warning "TRUE" } */
339 __analyzer_eval (i
>= j
); /* { dg-warning "TRUE" } */
340 __analyzer_eval (i
<= j
); /* { dg-warning "TRUE" } */
342 __analyzer_eval (i
!= j
); /* { dg-warning "FALSE" } */
343 __analyzer_eval (i
> j
); /* { dg-warning "FALSE" } */
344 __analyzer_eval (i
< j
); /* { dg-warning "FALSE" } */
350 /* Compare two uninitialized locals. */
351 __analyzer_eval (i
== j
); /* { dg-warning "UNKNOWN" } */
354 void test_20 (int i
, int j
)
356 __analyzer_eval (i
+ 1); /* { dg-warning "UNKNOWN" } */
357 __analyzer_eval (i
+ j
); /* { dg-warning "UNKNOWN" } */
359 __analyzer_eval (i
- 1); /* { dg-warning "UNKNOWN" } */
360 __analyzer_eval (i
- j
); /* { dg-warning "UNKNOWN" } */
362 __analyzer_eval (i
* 2); /* { dg-warning "UNKNOWN" } */
363 __analyzer_eval (i
* j
); /* { dg-warning "UNKNOWN" } */
365 __analyzer_eval (i
/ 2); /* { dg-warning "UNKNOWN" } */
366 __analyzer_eval (i
/ j
); /* { dg-warning "UNKNOWN" } */
368 __analyzer_eval (i
% 2); /* { dg-warning "UNKNOWN" } */
369 __analyzer_eval (i
% j
); /* { dg-warning "UNKNOWN" } */
371 __analyzer_eval (i
& 1); /* { dg-warning "UNKNOWN" } */
372 __analyzer_eval (i
& j
); /* { dg-warning "UNKNOWN" } */
374 __analyzer_eval (i
| 1); /* { dg-warning "UNKNOWN" } */
375 __analyzer_eval (i
| j
); /* { dg-warning "UNKNOWN" } */
377 __analyzer_eval (i
^ 1); /* { dg-warning "UNKNOWN" } */
378 __analyzer_eval (i
^ j
); /* { dg-warning "UNKNOWN" } */
380 __analyzer_eval (i
>> 1); /* { dg-warning "UNKNOWN" } */
381 __analyzer_eval (i
>> j
); /* { dg-warning "UNKNOWN" } */
383 __analyzer_eval (i
<< 1); /* { dg-warning "UNKNOWN" } */
384 __analyzer_eval (i
<< j
); /* { dg-warning "UNKNOWN" } */
386 __analyzer_eval (i
&& 0); /* { dg-warning "FALSE" } */
387 __analyzer_eval (i
&& 1); /* { dg-warning "UNKNOWN" } */
388 __analyzer_eval (i
&& j
); /* { dg-warning "UNKNOWN" } */
390 __analyzer_eval (i
|| 0); /* { dg-warning "UNKNOWN" } */
392 __analyzer_eval (i
|| 1); /* { dg-warning "TRUE" } */
393 __analyzer_eval (i
|| j
); /* { dg-warning "UNKNOWN" } */
395 __analyzer_eval (~i
); /* { dg-warning "UNKNOWN" } */
396 __analyzer_eval (-i
); /* { dg-warning "UNKNOWN" } */
397 __analyzer_eval (+i
); /* { dg-warning "UNKNOWN" } */
399 /* Anything added above should be added to the next function also. */
402 /* As above, but where the values are known due to the region model,
403 but not known to GCC's regular optimizations (folding and SSA). */
415 __analyzer_eval (i
+ j
== 8); /* { dg-warning "TRUE" } */
416 __analyzer_eval (i
- j
== 2); /* { dg-warning "TRUE" } */
417 __analyzer_eval (i
* j
== 15); /* { dg-warning "TRUE" } */
418 __analyzer_eval (i
/ j
== 1); /* { dg-warning "TRUE" } */
419 __analyzer_eval (i
% j
== 2); /* { dg-warning "TRUE" } */
421 /* Division by zero. */
422 // TODO: should we warn for this?
423 __analyzer_eval (i
/ zero
); /* { dg-warning "UNKNOWN" } */
424 __analyzer_eval (i
% zero
); /* { dg-warning "UNKNOWN" } */
426 __analyzer_eval ((i
& 1) == (5 & 1)); /* { dg-warning "TRUE" } */
427 __analyzer_eval ((i
& j
) == (5 & 3)); /* { dg-warning "TRUE" } */
428 __analyzer_eval ((i
| 1) == (5 | 1)); /* { dg-warning "TRUE" } */
429 __analyzer_eval ((i
| j
) == (5 | 3)); /* { dg-warning "TRUE" } */
430 __analyzer_eval ((i
^ 1) == (5 ^ 1)); /* { dg-warning "TRUE" } */
431 __analyzer_eval ((i
^ j
) == (5 ^ 3)); /* { dg-warning "TRUE" } */
432 __analyzer_eval ((i
>> 1) == (5 >> 1)); /* { dg-warning "TRUE" } */
433 __analyzer_eval ((i
>> j
) == (5 >> 3)); /* { dg-warning "TRUE" } */
434 __analyzer_eval ((i
<< 1) == (5 << 1)); /* { dg-warning "TRUE" } */
435 __analyzer_eval ((i
<< j
) == (5 << 3)); /* { dg-warning "TRUE" } */
436 __analyzer_eval (i
&& 0); /* { dg-warning "FALSE" } */
437 __analyzer_eval (i
&& 1); /* { dg-warning "TRUE" } */
438 __analyzer_eval (i
&& j
); /* { dg-warning "TRUE" } */
440 __analyzer_eval (i
|| 0); /* { dg-warning "TRUE" } */
441 __analyzer_eval (i
|| 1); /* { dg-warning "TRUE" } */
442 __analyzer_eval (i
|| j
); /* { dg-warning "TRUE" } */
444 __analyzer_eval (~i
== ~5); /* { dg-warning "TRUE" } */
445 __analyzer_eval (-i
== -5); /* { dg-warning "TRUE" } */
446 __analyzer_eval (+i
== +5); /* { dg-warning "TRUE" } */
449 void test_22 (int i
, int j
)
451 __analyzer_eval (i
+ j
== i
+ j
); /* { dg-warning "TRUE" } */
452 // FIXME: this is getting folded; can we build a non-folded equivalent?
455 void test_23 (struct foo
*f
, struct foo
*g
)
461 __analyzer_eval (i
== j
); /* { dg-warning "TRUE" } */
462 __analyzer_eval (i
== k
); /* { dg-warning "UNKNOWN" } */
465 void test_24 (struct foo
*f
)
469 __analyzer_eval (g
.i
== 42); /* { dg-warning "TRUE" } */
471 /* Overwriting a whole struct should invalidate our knowledge
472 about fields within it. */
474 __analyzer_eval (g
.i
== 42); /* { dg-warning "UNKNOWN" } */
477 void test_25 (struct foo
*f
)
482 __analyzer_eval (f
->i
== 43); /* { dg-warning "TRUE" } */
483 __analyzer_eval (g
.i
== 42); /* { dg-warning "TRUE" } */
485 /* Overwriting a whole struct where we know things about the
486 source value should update our knowledge about fields within
489 __analyzer_eval (g
.i
== 43); /* { dg-warning "TRUE" } */
492 void test_26 (struct coord
*p
, struct coord
*q
)
495 q
->y
= 17; /* could clobber p->x. */
496 __analyzer_eval (p
->x
== 42); /* { dg-warning "UNKNOWN" } */
497 __analyzer_eval (p
->y
); /* { dg-warning "UNKNOWN" } */
498 __analyzer_eval (q
->x
); /* { dg-warning "UNKNOWN" } */
499 __analyzer_eval (q
->y
== 17); /* { dg-warning "TRUE" } */
501 /* Overwriting a whole struct where we know some things about the
502 source value should update our knowledge about fields within
505 __analyzer_eval (p
->x
); /* { dg-warning "UNKNOWN" } */
506 __analyzer_eval (p
->y
== 17); /* { dg-warning "TRUE" } */
508 __analyzer_eval (q
->x
); /* { dg-warning "UNKNOWN" } */
509 __analyzer_eval (q
->y
== 17); /* { dg-warning "TRUE" "desired" { xfail *-*-* } } */
510 /* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-1 } */
513 void test_27 (struct coord
*p
)
515 memset (p
, 0, sizeof (struct coord
));
516 __analyzer_eval (p
->x
== 0); /* { dg-warning "TRUE" } */
517 __analyzer_eval (p
->y
== 0); /* { dg-warning "TRUE" } */
520 void test_28 (struct coord
*p
)
522 memset (p
, 0, sizeof (struct coord
) * 10);
523 __analyzer_eval (p
[0].x
== 0); /* { dg-warning "TRUE" } */
524 __analyzer_eval (p
[0].y
== 0); /* { dg-warning "TRUE" } */
526 __analyzer_eval (p
[9].x
== 0); /* { dg-warning "TRUE" } */
527 __analyzer_eval (p
[9].y
== 0); /* { dg-warning "TRUE" } */
529 __analyzer_eval (p
[10].x
== 0); /* { dg-warning "UNKNOWN" } */
530 __analyzer_eval (p
[10].y
== 0); /* { dg-warning "UNKNOWN" } */
533 void test_29 (struct coord
*p
)
546 __analyzer_eval (p
[0].x
== 100024); /* { dg-warning "TRUE" } */
547 __analyzer_eval (p
[0].y
== 100025); /* { dg-warning "TRUE" } */
549 __analyzer_eval (p
[7].x
== 107024); /* { dg-warning "TRUE" } */
550 __analyzer_eval (p
[7].y
== 107025); /* { dg-warning "TRUE" } */
552 __analyzer_eval (p
[9].x
== 109024); /* { dg-warning "TRUE" } */
553 __analyzer_eval (p
[9].y
== 109025); /* { dg-warning "TRUE" } */
555 __analyzer_eval (p
[10].x
== 0); /* { dg-warning "UNKNOWN" } */
556 __analyzer_eval (p
[10].y
== 0); /* { dg-warning "UNKNOWN" } */
560 __analyzer_eval (q
->x
== 107024); /* { dg-warning "TRUE" } */
561 __analyzer_eval (q
->y
== 107025); /* { dg-warning "TRUE" } */
563 __analyzer_eval (q
[2].x
== 109024); /* { dg-warning "TRUE" } */
564 __analyzer_eval (q
[2].y
== 109025); /* { dg-warning "TRUE" } */
568 __analyzer_eval (q
->x
== 109024); /* { dg-warning "TRUE" } */
569 __analyzer_eval (q
->y
== 109025); /* { dg-warning "TRUE" } */
571 __analyzer_eval (q
[-2].x
== 107024); /* { dg-warning "TRUE" } */
572 __analyzer_eval (q
[-2].y
== 107025); /* { dg-warning "TRUE" } */
576 __analyzer_eval (q
->x
== 107024); /* { dg-warning "TRUE" } */
577 __analyzer_eval (q
->y
== 107025); /* { dg-warning "TRUE" } */
580 void test_29a (struct coord p
[])
593 __analyzer_eval (p
[0].x
== 100024); /* { dg-warning "TRUE" } */
594 __analyzer_eval (p
[0].y
== 100025); /* { dg-warning "TRUE" } */
596 __analyzer_eval (p
[7].x
== 107024); /* { dg-warning "TRUE" } */
597 __analyzer_eval (p
[7].y
== 107025); /* { dg-warning "TRUE" } */
599 __analyzer_eval (p
[9].x
== 109024); /* { dg-warning "TRUE" } */
600 __analyzer_eval (p
[9].y
== 109025); /* { dg-warning "TRUE" } */
602 __analyzer_eval (p
[10].x
== 0); /* { dg-warning "UNKNOWN" } */
603 __analyzer_eval (p
[10].y
== 0); /* { dg-warning "UNKNOWN" } */
607 __analyzer_eval (q
->x
== 107024); /* { dg-warning "TRUE" } */
608 __analyzer_eval (q
->y
== 107025); /* { dg-warning "TRUE" } */
610 __analyzer_eval (q
[2].x
== 109024); /* { dg-warning "TRUE" } */
611 __analyzer_eval (q
[2].y
== 109025); /* { dg-warning "TRUE" } */
615 __analyzer_eval (q
->x
== 109024); /* { dg-warning "TRUE" } */
616 __analyzer_eval (q
->y
== 109025); /* { dg-warning "TRUE" } */
618 __analyzer_eval (q
[-2].x
== 107024); /* { dg-warning "TRUE" } */
619 __analyzer_eval (q
[-2].y
== 107025); /* { dg-warning "TRUE" } */
622 __analyzer_eval (q
== &p
[7]); /* { dg-warning "UNKNOWN" } */
623 // TODO: make this be TRUE
625 __analyzer_eval (q
->x
== 107024); /* { dg-warning "TRUE" } */
626 __analyzer_eval (q
->y
== 107025); /* { dg-warning "TRUE" } */
643 __analyzer_eval (p
[0].x
== 100024); /* { dg-warning "TRUE" } */
644 __analyzer_eval (p
[0].y
== 100025); /* { dg-warning "TRUE" } */
646 __analyzer_eval (p
[7].x
== 107024); /* { dg-warning "TRUE" } */
647 __analyzer_eval (p
[7].y
== 107025); /* { dg-warning "TRUE" } */
649 __analyzer_eval (p
[9].x
== 109024); /* { dg-warning "TRUE" } */
650 __analyzer_eval (p
[9].y
== 109025); /* { dg-warning "TRUE" } */
652 __analyzer_eval (p
[10].x
== 0); /* { dg-warning "UNKNOWN" } */
653 __analyzer_eval (p
[10].y
== 0); /* { dg-warning "UNKNOWN" } */
657 __analyzer_eval (q
->x
== 107024); /* { dg-warning "TRUE" } */
658 __analyzer_eval (q
->y
== 107025); /* { dg-warning "TRUE" } */
660 __analyzer_eval (q
[2].x
== 109024); /* { dg-warning "TRUE" } */
661 __analyzer_eval (q
[2].y
== 109025); /* { dg-warning "TRUE" } */
665 __analyzer_eval (q
->x
== 109024); /* { dg-warning "TRUE" } */
666 __analyzer_eval (q
->y
== 109025); /* { dg-warning "TRUE" } */
668 __analyzer_eval (q
[-2].x
== 107024); /* { dg-warning "TRUE" } */
669 __analyzer_eval (q
[-2].y
== 107025); /* { dg-warning "TRUE" } */
672 __analyzer_eval (q
== &p
[7]); /* { dg-warning "TRUE" } */
674 __analyzer_eval (q
->x
== 107024); /* { dg-warning "TRUE" } */
675 __analyzer_eval (q
->y
== 107025); /* { dg-warning "TRUE" } */
678 void test_29c (int len
)
692 __analyzer_eval (p
[0].x
== 100024); /* { dg-warning "TRUE" } */
693 __analyzer_eval (p
[0].y
== 100025); /* { dg-warning "TRUE" } */
695 __analyzer_eval (p
[7].x
== 107024); /* { dg-warning "TRUE" } */
696 __analyzer_eval (p
[7].y
== 107025); /* { dg-warning "TRUE" } */
698 __analyzer_eval (p
[9].x
== 109024); /* { dg-warning "TRUE" } */
699 __analyzer_eval (p
[9].y
== 109025); /* { dg-warning "TRUE" } */
701 __analyzer_eval (p
[10].x
== 0); /* { dg-warning "UNKNOWN" } */
702 __analyzer_eval (p
[10].y
== 0); /* { dg-warning "UNKNOWN" } */
706 __analyzer_eval (q
->x
== 107024); /* { dg-warning "TRUE" } */
707 __analyzer_eval (q
->y
== 107025); /* { dg-warning "TRUE" } */
709 __analyzer_eval (q
[2].x
== 109024); /* { dg-warning "TRUE" } */
710 __analyzer_eval (q
[2].y
== 109025); /* { dg-warning "TRUE" } */
714 __analyzer_eval (q
->x
== 109024); /* { dg-warning "TRUE" } */
715 __analyzer_eval (q
->y
== 109025); /* { dg-warning "TRUE" } */
717 __analyzer_eval (q
[-2].x
== 107024); /* { dg-warning "TRUE" } */
718 __analyzer_eval (q
[-2].y
== 107025); /* { dg-warning "TRUE" } */
721 __analyzer_eval (q
== &p
[7]); /* { dg-warning "TRUE" } */
723 __analyzer_eval (q
->x
== 107024); /* { dg-warning "TRUE" } */
724 __analyzer_eval (q
->y
== 107025); /* { dg-warning "TRUE" } */
727 void test_30 (void *ptr
)
729 struct coord
*p
= (struct coord
*)ptr
;
730 struct coord
*q
= (struct coord
*)ptr
;
734 __analyzer_eval (p
->x
== 42); /* { dg-warning "TRUE" } */
735 __analyzer_eval (q
->x
== 42); /* { dg-warning "TRUE" } */
738 void test_31 (unsigned i
)
742 j
= i
< 100 ? i
: 100; /* MIN_EXPR. */
743 k
= i
< 100 ? 100 : i
; /* MAX_EXPR. */
753 void test_32 (enum color c
)
755 __analyzer_eval (c
== GREEN
); /* { dg-warning "UNKNOWN" } */
759 __analyzer_eval (c
== RED
); /* { dg-warning "TRUE" } */
760 __analyzer_eval (c
== GREEN
); /* { dg-warning "FALSE" } */
767 __analyzer_eval (s
== 42); /* { dg-warning "UNKNOWN" } */
771 __analyzer_eval (s
== 42); /* { dg-warning "TRUE" } */
774 static int __attribute__((noinline
))
775 __analyzer_only_called_by_test_34 (int parm
)
777 __analyzer_eval (parm
== 42); /* { dg-warning "TRUE" } */
784 int result
= __analyzer_only_called_by_test_34 (42);
785 __analyzer_eval (result
== 84); /* { dg-warning "TRUE" } */
788 void test_35 (int i
, int j
)
790 __analyzer_eval (&i
== &i
); /* { dg-warning "TRUE" } */
791 __analyzer_eval (&i
!= &j
); /* { dg-warning "TRUE" } */
794 static void __attribute__((noinline
))
795 write_through_ptr (int *dst
, int val
)
802 __analyzer_eval (i
== 42); /* { dg-warning "UNKNOWN" } */
804 write_through_ptr (&i
, 42);
806 __analyzer_eval (i
== 42); /* { dg-warning "TRUE" } */
809 /* Read through uninitialized pointer. */
814 return *ptr
; /* { dg-warning "use of uninitialized value 'ptr'" "uninit-warning-removed" { xfail *-*-* } } */
817 /* Write through uninitialized pointer. */
819 void test_37a (int i
)
822 *ptr
= i
; /* { dg-warning "use of uninitialized value 'ptr'" "uninit-warning-removed" { xfail *-*-* } } */
825 // TODO: the various other ptr deref poisonings
827 /* Read through NULL pointer. */
832 return *ptr
; /* { dg-warning "dereference of NULL 'ptr'" } */
835 /* Write through NULL pointer. */
840 *ptr
= i
; /* { dg-warning "dereference of NULL 'ptr'" } */
843 /* Read through non-NULL constant pointer. */
847 int *ptr
= (int *)0x1000;
851 int test_40 (int flag
)
859 /* With state-merging, we lose the relationship between 'flag' and 'i'. */
860 __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
863 __analyzer_eval (i
== 43); /* { dg-warning "UNKNOWN" } */
865 __analyzer_eval (i
== 17); /* { dg-warning "UNKNOWN" } */
874 /* Traversing a singly-linked list. */
876 void foo (struct link
*in
)
885 __analyzer_eval (in
->next
->next
->next
->f
== 42); /* { dg-warning "TRUE" } */
898 __analyzer_eval (u
.i
== 42); /* { dg-warning "TRUE" } */
899 __analyzer_eval (u
.ptr
== NULL
); /* { dg-warning "UNKNOWN|FALSE" } */
901 /* Writes to a union member should invalidate knowledge about other members. */
903 __analyzer_eval (u
.ptr
== NULL
); /* { dg-warning "TRUE" } */
904 __analyzer_eval (u
.i
== 42); /* { dg-warning "UNKNOWN|FALSE" } */
913 __analyzer_eval (f
== 42.0); /* { dg-warning "TRUE" } */
922 __analyzer_eval (i
== 42); /* { dg-warning "TRUE" } */
937 __analyzer_eval (bits
.b0
== -1); /* { dg-warning "TRUE" } */
940 __analyzer_eval (bits
.b456
== -4); /* { dg-warning "TRUE" } */
946 unsigned int b123
: 3;
947 unsigned int b456
: 3;
955 __analyzer_eval (bits
.b0
== 1); /* { dg-warning "TRUE" } */
958 __analyzer_eval (bits
.b456
== 5); /* { dg-warning "TRUE" } */
961 extern const char *char_ptr
;
965 if (strcmp("literal", char_ptr
))
972 static const char* my_version
= "1.1.3";
973 return my_version
[0];
976 unsigned test_48 (unsigned char *p
, unsigned char *q
)
978 return (unsigned int)(p
- q
);
982 const char *filename
;
990 loc_last
= __extension__(loc
) { "", 328 };
991 loc_last
= __extension__(loc
) { "", 333 };
994 void test_50 (void *p
, void *q
)
996 __analyzer_eval (p
== q
); /* { dg-warning "UNKNOWN" } */
997 __analyzer_eval (p
== p
); /* { dg-warning "TRUE" } */
998 __analyzer_eval (q
== q
); /* { dg-warning "TRUE" } */
999 __analyzer_eval (p
== (struct coord
*)p
); /* { dg-warning "TRUE" } */
1000 __analyzer_eval (p
== (const struct coord
*)p
); /* { dg-warning "TRUE" } */
1002 struct coord
*cp
= (struct coord
*)p
;
1003 __analyzer_eval (p
== cp
); /* { dg-warning "TRUE" } */
1005 struct coord
*cq
= (struct coord
*)q
;
1006 __analyzer_eval (q
== cq
); /* { dg-warning "TRUE" } */
1008 __analyzer_eval (cp
== cq
); /* { dg-warning "UNKNOWN" } */
1011 void test_51 (struct coord c
)
1014 memcpy (&d
, &c
, sizeof (struct coord
));
1015 __analyzer_eval (c
.x
== d
.x
); /* { dg-warning "TRUE" } */
1016 __analyzer_eval (c
.y
== d
.y
); /* { dg-warning "TRUE" } */
1024 void test_52 (struct big b
)
1027 memcpy (&d
, &b
, sizeof (struct big
));
1028 __analyzer_eval (b
.ia
[0] == d
.ia
[0]); /* { dg-warning "TRUE" } */
1029 __analyzer_eval (b
.ia
[1023] == d
.ia
[1023]); /* { dg-warning "TRUE" } */
1032 void test_53 (const char *msg
)
1034 (void)fprintf(stderr
, "LOG: %s", msg
);