The current argument order has "expected" and "actual" the wrong way around, so that the diff shows the change from expected to actual, not from actual to expected. Namely, if the expected diagnostics contains the string "foo", but the analyzer emits "bar", we really want to see: ``` - foo + bar ``` not ``` - bar + foo ``` since adapting to most changes would require applying that diff to the expected output. Differential Revision: https://reviews.llvm.org/D56340 llvm-svn: 350866
89 lines
1.8 KiB
C++
89 lines
1.8 KiB
C++
// 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: cat %t.plist | %diff_plist %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);
|
|
}
|