| // 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); |
| } |