1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix -verify %s
2 // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix -analyzer-output=plist-multi-file %s -o %t.plist
3 // RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/plist-macros.cpp.plist -
4 
5 
6 typedef __typeof(sizeof(int)) size_t;
7 void *malloc(size_t);
8 
9 #define mallocmemory int *x = (int*)malloc(12);
noteOnMacro(int y)10 void noteOnMacro(int y) {
11   y++;
12   y--;
13   mallocmemory
14   y++;
15   y++;
16   delete x; // expected-warning {{Memory allocated by malloc() should be deallocated by free(), not 'delete'}}
17 }
18 
macroIsFirstInFunction(int y)19 void macroIsFirstInFunction(int y) {
20   mallocmemory
21   y++; // expected-warning {{Potential leak of memory pointed to by 'x'}}
22 }
23 
24 #define checkmacro p==0
25 void macroInExpressionAux(bool b);
macroInExpression(int * p,int y)26 int macroInExpression(int *p, int y) {;
27   y++;
28   macroInExpressionAux(checkmacro);
29 
30   return *p; // expected-warning {{Dereference of null pointer}}
31 }
32 
33 #define noPathNoteMacro y+y
macroInExpressionNoNote(int * p,int y)34 int macroInExpressionNoNote(int *p, int y) {;
35   y++;
36   if (5 + noPathNoteMacro)
37     if (p)
38       ;
39   return *p; // expected-warning {{Dereference of null pointer}}
40 }
41 
42 #define macroWithArg(mp) mp==0
macroWithArgInExpression(int * p,int y)43 int macroWithArgInExpression(int *p, int y) {;
44   y++;
45   if (macroWithArg(p))
46     ;
47   return *p; // expected-warning {{Dereference of null pointer}}
48 }
49 
50 #define multiNoteMacroWithError \
51   if (p) \
52     ;\
53   *p = 5;
useMultiNoteMacroWithError(int * p,int y)54 int useMultiNoteMacroWithError(int *p, int y) {;
55   y++;
56   multiNoteMacroWithError  // expected-warning {{Dereference of null pointer}}
57 
58   return *p;
59 }
60 
61 #define multiNoteMacro \
62 if (p) \
63   ;\
64 if (y) \
65   ;
useMultiNote(int * p,int y)66 int useMultiNote(int *p, int y) {;
67   y++;
68   if (p) {}
69   multiNoteMacro
70 
71   return *p; // expected-warning {{Dereference of null pointer}}
72 }
73 
74 #define CALL_FN(a) null_deref(a)
75 
null_deref(int * a)76 void null_deref(int *a) {
77   if (a)
78     return;
79   *a = 1; // expected-warning {{Dereference of null pointer}}
80 }
81 
test1()82 void test1() {
83   CALL_FN(0);
84 }
85 
test2(int * p)86 void test2(int *p) {
87   CALL_FN(p);
88 }
89