annotate gcc/testsuite/gcc.dg/analyzer/attribute-nonnull.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 #include <stdlib.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 extern void foo(void *ptrA, void *ptrB, void *ptrC) /* { dg-message "argument 1 of 'foo' must be non-null" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 __attribute__((nonnull (1, 3)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 extern void bar(void *ptrA, void *ptrB, void *ptrC) /* { dg-message "argument 1 of 'bar' must be non-null" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 __attribute__((nonnull));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // TODO: complain about NULL and possible NULL args
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 // FIXME: ought to complain about NULL args
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 void test_1 (void *p, void *q, void *r)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 foo(p, q, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 foo(NULL, q, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 foo(p, NULL, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 foo(p, q, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 void test_1a (void *q, void *r)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 void *p = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 foo(p, q, r); /* { dg-warning "use of NULL 'p' where non-null expected" "warning" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 /* { dg-message "argument 1 \\('p'\\) NULL where non-null expected" "note" { target *-*-* } .-1 } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 void test_2 (void *p, void *q, void *r)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 bar(p, q, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 bar(NULL, q, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 bar(p, NULL, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 bar(p, q, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 void test_3 (void *q, void *r)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 void *p = malloc(1024); /* { dg-message "\\(1\\) this call could return NULL" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 foo(p, q, r); /* { dg-warning "use of possibly-NULL 'p' where non-null expected" "warning" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 /* { dg-message "argument 1 \\('p'\\) from \\(1\\) could be NULL where non-null expected" "note" { target *-*-* } .-1 } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 foo(p, q, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 free(p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 void test_4 (void *q, void *r)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 void *p = malloc(1024); /* { dg-message "\\(1\\) this call could return NULL" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 bar(p, q, r); /* { dg-warning "use of possibly-NULL 'p' where non-null expected" "warning" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 /* { dg-message "argument 1 \\('p'\\) from \\(1\\) could be NULL where non-null expected" "note" { target *-*-* } .-1 } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 bar(p, q, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 free(p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 /* Verify that we detect passing NULL to a __attribute__((nonnull)) function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 when it's called via a function pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 typedef void (*bar_t)(void *ptrA, void *ptrB, void *ptrC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 static bar_t __attribute__((noinline))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 get_bar (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 return bar;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 void test_5 (void *q, void *r)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 void *p = malloc(1024); /* { dg-message "\\(1\\) this call could return NULL" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 bar_t cb = get_bar ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 cb(p, q, r); /* { dg-warning "use of possibly-NULL 'p' where non-null expected" "warning" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 /* { dg-message "argument 1 \\('p'\\) from \\(1\\) could be NULL where non-null expected" "note" { target *-*-* } .-1 } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 /* TODO: do we want an event showing where cb is assigned "bar"? */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 cb(p, q, r);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 free(p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 }