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