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
87 lines
3.3 KiB
C
87 lines
3.3 KiB
C
// RUN: %clang_analyze_cc1 %s -analyzer-checker=core.NullDereference -analyzer-output=text -verify
|
|
// RUN: %clang_analyze_cc1 %s -analyzer-checker=core.NullDereference -analyzer-output=plist -o %t
|
|
// RUN: cat %t | %diff_plist %S/Inputs/expected-plists/conditional-path-notes.c.plist -
|
|
|
|
void testCondOp(int *p) {
|
|
int *x = p ? p : p;
|
|
// expected-note@-1 {{Assuming 'p' is null}}
|
|
// expected-note@-2 {{'?' condition is false}}
|
|
// expected-note@-3 {{'x' initialized to a null pointer value}}
|
|
*x = 1; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}}
|
|
// expected-note@-1 {{Dereference of null pointer (loaded from variable 'x')}}
|
|
}
|
|
|
|
void testCondProblem(int *p) {
|
|
if (p) return;
|
|
// expected-note@-1 {{Assuming 'p' is null}}
|
|
// expected-note@-2 {{Taking false branch}}
|
|
|
|
int x = *p ? 0 : 1; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}}
|
|
// expected-note@-1 {{Dereference of null pointer (loaded from variable 'p')}}
|
|
(void)x;
|
|
}
|
|
|
|
void testLHSProblem(int *p) {
|
|
int x = !p ? *p : 1; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}}
|
|
// expected-note@-1 {{Assuming 'p' is null}}
|
|
// expected-note@-2 {{'?' condition is true}}
|
|
// expected-note@-3 {{Dereference of null pointer (loaded from variable 'p')}}
|
|
(void)x;
|
|
}
|
|
|
|
void testRHSProblem(int *p) {
|
|
int x = p ? 1 : *p; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}}
|
|
// expected-note@-1 {{Assuming 'p' is null}}
|
|
// expected-note@-2 {{'?' condition is false}}
|
|
// expected-note@-3 {{Dereference of null pointer (loaded from variable 'p')}}
|
|
(void)x;
|
|
}
|
|
|
|
void testBinaryCondOp(int *p) {
|
|
int *x = p ?: p;
|
|
// expected-note@-1 {{'?' condition is false}}
|
|
// expected-note@-2 {{'x' initialized to a null pointer value}}
|
|
*x = 1; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}}
|
|
// expected-note@-1 {{Dereference of null pointer (loaded from variable 'x')}}
|
|
}
|
|
|
|
void testBinaryLHSProblem(int *p) {
|
|
if (p) return;
|
|
// expected-note@-1 {{Assuming 'p' is null}}
|
|
// expected-note@-2 {{Taking false branch}}
|
|
|
|
int x = *p ?: 1; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}}
|
|
// expected-note@-1 {{Dereference of null pointer (loaded from variable 'p')}}
|
|
(void)x;
|
|
}
|
|
|
|
void testDiagnosableBranch(int a) {
|
|
if (a) {
|
|
// expected-note@-1 {{Assuming 'a' is not equal to 0}}
|
|
// expected-note@-2 {{Taking true branch}}
|
|
*(volatile int *)0 = 1; // expected-warning{{Dereference of null pointer}}
|
|
// expected-note@-1 {{Dereference of null pointer}}
|
|
}
|
|
}
|
|
|
|
void testDiagnosableBranchLogical(int a, int b) {
|
|
if (a && b) {
|
|
// expected-note@-1 {{Assuming 'a' is not equal to 0}}
|
|
// expected-note@-2 {{Left side of '&&' is true}}
|
|
// expected-note@-3 {{Assuming 'b' is not equal to 0}}
|
|
// expected-note@-4 {{Taking true branch}}
|
|
*(volatile int *)0 = 1; // expected-warning{{Dereference of null pointer}}
|
|
// expected-note@-1 {{Dereference of null pointer}}
|
|
}
|
|
}
|
|
|
|
void testNonDiagnosableBranchArithmetic(int a, int b) {
|
|
if (a - b) {
|
|
// expected-note@-1 {{Taking true branch}}
|
|
// expected-note@-2 {{Assuming the condition is true}}
|
|
*(volatile int *)0 = 1; // expected-warning{{Dereference of null pointer}}
|
|
// expected-note@-1 {{Dereference of null pointer}}
|
|
}
|
|
}
|
|
|