blob: a6819cc48b043af2f9a6c2d92256787f92ec1ac9 [file] [log] [blame]
Ted Kremenekd71ed262008-04-10 22:16:52 +00001// RUN: clang -checker-simple -verify %s
Ted Kremenek2f54af42008-04-02 16:54:39 +00002
Ted Kremenek0fe33bc2008-04-22 21:10:18 +00003#include<stdint.h>
Ted Kremenek8c3e7fb2008-09-16 23:24:45 +00004#include <assert.h>
Ted Kremenek0fe33bc2008-04-22 21:10:18 +00005
Ted Kremenek2f54af42008-04-02 16:54:39 +00006void f1(int *p) {
7 if (p) *p = 1;
8 else *p = 0; // expected-warning{{ereference}}
9}
Ted Kremenekb9ab6902008-04-21 23:44:17 +000010
11struct foo_struct {
12 int x;
13};
14
15int f2(struct foo_struct* p) {
16
17 if (p)
18 p->x = 1;
19
Ted Kremenek3603d732008-04-21 23:45:26 +000020 return p->x++; // expected-warning{{Dereference of null pointer.}}
Ted Kremenekb9ab6902008-04-21 23:44:17 +000021}
Ted Kremenek9704eac2008-04-22 04:56:55 +000022
23int f3(char* x) {
24
25 int i = 2;
26
27 if (x)
28 return x[i - 1];
29
30 return x[i+1]; // expected-warning{{Dereference of null pointer.}}
31}
32
Ted Kremeneke2013f52008-04-29 23:25:09 +000033int f3_b(char* x) {
34
35 int i = 2;
36
37 if (x)
38 return x[i - 1];
39
40 return x[i+1]++; // expected-warning{{Dereference of null pointer.}}
41}
42
Ted Kremenek0fe33bc2008-04-22 21:10:18 +000043int f4(int *p) {
44
Daniel Dunbar4489fe12008-08-05 00:07:51 +000045 uintptr_t x = (uintptr_t) p;
Ted Kremenek0fe33bc2008-04-22 21:10:18 +000046
47 if (x)
48 return 1;
49
50 int *q = (int*) x;
51 return *q; // expected-warning{{Dereference of null pointer.}}
Ted Kremeneka5488462008-04-22 21:39:21 +000052}
53
54int f5() {
55
56 char *s = "hello world";
57 return s[0]; // no-warning
58}
59
Ted Kremenek7fb43c12008-09-01 19:57:52 +000060int bar(int* p, int q) __attribute__((nonnull));
Ted Kremenek584def72008-07-22 00:46:16 +000061
62int f6(int *p) {
Ted Kremenek7fb43c12008-09-01 19:57:52 +000063 return !p ? bar(p, 1) // expected-warning {{Null pointer passed as an argument to a 'nonnull' parameter}}
64 : bar(p, 0); // no-warning
65}
Ted Kremenek584def72008-07-22 00:46:16 +000066
Ted Kremenek22bda882008-07-31 20:31:27 +000067int* qux();
68
69int f7(int x) {
70
71 int* p = 0;
72
73 if (0 == x)
74 p = qux();
75
76 if (0 == x)
77 *p = 1; // no-warning
78
79 return x;
80}
81
Ted Kremenekdd463b82008-08-16 00:45:40 +000082int f8(int *p, int *q) {
83 if (!p)
84 if (p)
85 *p = 1; // no-warning
86
87 if (q)
88 if (!q)
89 *q = 1; // no-warning
90}
Ted Kremenek8c3e7fb2008-09-16 23:24:45 +000091
92int* qux();
93
94int f9(int len) {
95 assert (len != 0);
96 int *p = 0;
97
98 for (int i = 0; i < len; ++i)
99 p = foo(i);
100
101 return *p++; // no-warning
102}