// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix -verify %s // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix -analyzer-output=plist-multi-file %s -o %t.plist // RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/plist-macros.cpp.plist - typedef __typeof(sizeof(int)) size_t; void *malloc(size_t); #define mallocmemory int *x = (int*)malloc(12); void noteOnMacro(int y) { y++; y--; mallocmemory y++; y++; delete x; // expected-warning {{Memory allocated by malloc() should be deallocated by free(), not 'delete'}} } void macroIsFirstInFunction(int y) { mallocmemory y++; // expected-warning {{Potential leak of memory pointed to by 'x'}} } #define checkmacro p==0 void macroInExpressionAux(bool b); int macroInExpression(int *p, int y) {; y++; macroInExpressionAux(checkmacro); return *p; // expected-warning {{Dereference of null pointer}} } #define noPathNoteMacro y+y int macroInExpressionNoNote(int *p, int y) {; y++; if (5 + noPathNoteMacro) if (p) ; return *p; // expected-warning {{Dereference of null pointer}} } #define macroWithArg(mp) mp==0 int macroWithArgInExpression(int *p, int y) {; y++; if (macroWithArg(p)) ; return *p; // expected-warning {{Dereference of null pointer}} } #define multiNoteMacroWithError \ if (p) \ ;\ *p = 5; int useMultiNoteMacroWithError(int *p, int y) {; y++; multiNoteMacroWithError // expected-warning {{Dereference of null pointer}} return *p; } #define multiNoteMacro \ if (p) \ ;\ if (y) \ ; int useMultiNote(int *p, int y) {; y++; if (p) {} multiNoteMacro return *p; // expected-warning {{Dereference of null pointer}} } #define CALL_FN(a) null_deref(a) void null_deref(int *a) { if (a) return; *a = 1; // expected-warning {{Dereference of null pointer}} } void test1() { CALL_FN(0); } void test2(int *p) { CALL_FN(p); }