159 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -analyzer-config suppress-null-return-paths=false -verify %s2// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=plist-multi-file -analyzer-config suppress-null-return-paths=false %s -o %t.plist3// RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/path-notes.c.plist -4 5void zero(int **p) {6 *p = 0;7 // expected-note@-1 {{Null pointer value stored to 'a'}}8}9 10void testZero(int *a) {11 zero(&a);12 // expected-note@-1 {{Calling 'zero'}}13 // expected-note@-2 {{Returning from 'zero'}}14 *a = 1; // expected-warning{{Dereference of null pointer}}15 // expected-note@-1 {{Dereference of null pointer (loaded from variable 'a')}}16}17 18void testCheck(int *a) {19 if (a) {20 // expected-note@-1 + {{Assuming 'a' is null}}21 // expected-note@-2 + {{Taking false branch}}22 ;23 }24 *a = 1; // expected-warning{{Dereference of null pointer}}25 // expected-note@-1 {{Dereference of null pointer (loaded from variable 'a')}}26}27 28 29int *getPointer(void);30 31void testInitCheck(void) {32 int *a = getPointer();33 // expected-note@-1 {{'a' initialized here}}34 if (a) {35 // expected-note@-1 + {{Assuming 'a' is null}}36 // expected-note@-2 + {{Taking false branch}}37 ;38 }39 *a = 1; // expected-warning{{Dereference of null pointer}}40 // expected-note@-1 {{Dereference of null pointer (loaded from variable 'a')}}41}42 43void testStoreCheck(int *a) {44 a = getPointer();45 // expected-note@-1 {{Value assigned to 'a'}}46 if (a) {47 // expected-note@-1 + {{Assuming 'a' is null}}48 // expected-note@-2 + {{Taking false branch}}49 ;50 }51 *a = 1; // expected-warning{{Dereference of null pointer}}52 // expected-note@-1 {{Dereference of null pointer (loaded from variable 'a')}}53}54 55 56int *getZero(void) {57 int *p = 0;58 // expected-note@-1 + {{'p' initialized to a null pointer value}}59 // ^ This note checks that we add a second visitor for the return value.60 return p;61 // expected-note@-1 + {{Returning null pointer (loaded from 'p')}}62}63 64void testReturnZero(void) {65 *getZero() = 1; // expected-warning{{Dereference of null pointer}}66 // expected-note@-1 {{Calling 'getZero'}}67 // expected-note@-2 {{Returning from 'getZero'}}68 // expected-note@-3 {{Dereference of null pointer}}69}70 71int testReturnZero2(void) {72 return *getZero(); // expected-warning{{Dereference of null pointer}}73 // expected-note@-1 {{Calling 'getZero'}}74 // expected-note@-2 {{Returning from 'getZero'}}75 // expected-note@-3 {{Dereference of null pointer}}76}77 78void testInitZero(void) {79 int *a = getZero();80 // expected-note@-1 {{Calling 'getZero'}}81 // expected-note@-2 {{Returning from 'getZero'}}82 // expected-note@-3 {{'a' initialized to a null pointer value}}83 *a = 1; // expected-warning{{Dereference of null pointer}}84 // expected-note@-1 {{Dereference of null pointer (loaded from variable 'a')}}85}86 87void testStoreZero(int *a) {88 a = getZero();89 // expected-note@-1 {{Calling 'getZero'}}90 // expected-note@-2 {{Returning from 'getZero'}}91 // expected-note@-3 {{Null pointer value stored to 'a'}}92 *a = 1; // expected-warning{{Dereference of null pointer}}93 // expected-note@-1 {{Dereference of null pointer (loaded from variable 'a')}}94}95 96void usePointer(int *p) {97 *p = 1; // expected-warning{{Dereference of null pointer}}98 // expected-note@-1 {{Dereference of null pointer}}99}100 101void testUseOfNullPointer(void) {102 // Test the case where an argument expression is itself a call.103 usePointer(getZero());104 // expected-note@-1 {{Calling 'getZero'}}105 // expected-note@-2 {{Returning from 'getZero'}}106 // expected-note@-3 {{Passing null pointer value via 1st parameter 'p'}}107 // expected-note@-4 {{Calling 'usePointer'}}108}109 110struct X { char *p; };111 112void setFieldToNull(struct X *x) {113 x->p = 0; // expected-note {{Null pointer value stored to field 'p'}}114}115 116int testSetFieldToNull(struct X *x) {117 setFieldToNull(x); // expected-note {{Calling 'setFieldToNull'}}118 // expected-note@-1{{Returning from 'setFieldToNull'}}119 return *x->p;120 // expected-warning@-1 {{Dereference of null pointer (loaded from field 'p')}}121 // expected-note@-2 {{Dereference of null pointer (loaded from field 'p')}}122}123 124struct Outer {125 struct Inner {126 int *p;127 } inner;128};129 130void test(struct Outer *wrapperPtr) {131 wrapperPtr->inner.p = 0; // expected-note {{Null pointer value stored to field 'p'}}132 *wrapperPtr->inner.p = 1; //expected-warning {{Dereference of null pointer (loaded from field 'p')}}133 // expected-note@-1 {{Dereference of null pointer (loaded from field 'p')}}134}135 136void test4(int **p) {137 if (*p) return; // expected-note {{Taking false branch}}138 // expected-note@-1 {{Assuming pointer value is null}}139 **p = 1; // expected-warning {{Dereference of null pointer}}140 // expected-note@-1 {{Dereference of null pointer}}141}142 143void boringCallee(void) {144}145 146void interestingCallee(int *x) {147 *x = 0; // expected-note{{The value 0 is assigned to 'x'}}148 boringCallee(); // no-note149}150 151int testBoringCalleeOfInterestingCallee(void) {152 int x;153 interestingCallee(&x); // expected-note{{Calling 'interestingCallee'}}154 // expected-note@-1{{Returning from 'interestingCallee'}}155 return 1 / x; // expected-warning{{Division by zero}}156 // expected-note@-1{{Division by zero}}157}158 159