Skip several analyzer socket tests on hppa*-*-hpux*
[official-gcc.git] / gcc / testsuite / c-c++-common / analyzer / deref-before-check-2.c
blobc0409c42d8982423744fe1cabb23e26c3fffa2bc
1 #include <stdio.h>
3 struct st
5 char *str;
6 int i;
7 };
9 int test_1 (struct st *p)
11 fprintf (stderr, "str: %s\n", p->str); /* { dg-message "pointer 'p' is dereferenced here" } */
12 if (!p) /* { dg-warning "check of 'p' for NULL after already dereferencing it" } */
13 return -1;
14 return p->i;
17 int test_2 (int flag_a, int flag_b, struct st *p)
19 if (flag_a)
21 int j = p->i; /* { dg-message "pointer 'p' is dereferenced here" } */
22 if (flag_b && p) /* { dg-warning "check of 'p' for NULL after already dereferencing it" } */
23 return 1;
24 return j;
26 return 2;
29 int test_3 (struct st *a, struct st *b)
31 if (!a)
32 return b->i;
33 if (!b)
34 return a->i;
35 return 0;
38 int test_4 (struct st *p)
40 int *q = &p->i;
41 if (!p)
42 return -1;
43 return *q;
46 void test_check_after_strlen (const char *str)
48 size_t len_a = __builtin_strlen (str); /* { dg-message "pointer 'str' is dereferenced here" } */
49 size_t len_b = str ? __builtin_strlen (str) : 0; /* { dg-warning "check of 'str' for NULL after already dereferencing it" } */
52 void test_6 (struct st *a, struct st *b)
54 int diff = a->i - b->i; /* { dg-message "pointer 'b' is dereferenced here" } */
56 /* ... */
58 if (b) /* { dg-warning "check of 'b' for NULL after already dereferencing it" } */
59 fprintf (stderr, "str: %s\n", b->str);
62 void test_check_after_strcmp (const char *s1, const char *s2)
64 if (!__builtin_strcmp (s1, s2)) /* { dg-message "pointer 's1' is dereferenced here" } */
65 return;
67 /* ... */
69 if (s1) /* { dg-warning "check of 's1' for NULL after already dereferencing it" } */
70 return;
73 void test_more_than_one_deref (struct st *p)
75 char *str = p->str; /* { dg-message "pointer 'p' is dereferenced here" } */
76 int i = p->i;
78 /* ... */
80 if (p) /* { dg-warning "check of 'p' for NULL after already dereferencing it" } */
81 return;
83 /* ... */
86 void test_deref_under_another_name (struct st *p)
88 struct st *q = p;
89 int i = q->i; /* { dg-message "pointer 'p' is dereferenced here" } */
91 /* ... */
93 if (p) /* { dg-warning "check of 'p' for NULL after already dereferencing it" } */
94 return;
96 /* ... */
99 void test_check_after_memcpy_src (struct st *dst, struct st *src)
101 __builtin_memcpy (dst, src, sizeof (struct st)); /* { dg-message "pointer 'src' is dereferenced here" } */
103 /* ... */
105 if (!src) /* { dg-warning "check of 'src' for NULL after already dereferencing it" } */
106 return;
108 /* ... */
111 void test_check_after_memcpy_dst (struct st *dst, struct st *src)
113 __builtin_memcpy (dst, src, sizeof (struct st)); /* { dg-message "pointer 'dst' is dereferenced here" } */
115 /* ... */
117 if (!dst) /* { dg-warning "check of 'dst' for NULL after already dereferencing it" } */
118 return;
120 /* ... */
123 void test_merger (int *p, int flag)
125 int x = *p;
126 if (flag)
127 __builtin_free (p);
128 if (!flag)
129 __builtin_free (p); /* { dg-bogus "double-'free'" } */