1184c6242SDominic Chen // RUN: %clang_analyze_cc1 %s -analyzer-checker=core.NullDereference -analyzer-output=text -verify 239165091SGeorge Karpenkov // RUN: %clang_analyze_cc1 %s -analyzer-checker=core.NullDereference -analyzer-output=plist -o %t 361c848d2SHubert Tong // RUN: %normalize_plist <%t | diff -ub %S/Inputs/expected-plists/conditional-path-notes.c.plist - 4e692cfa3SJordan Rose testCondOp(int * p)5e692cfa3SJordan Rosevoid testCondOp(int *p) { 6e692cfa3SJordan Rose int *x = p ? p : p; 7e692cfa3SJordan Rose // expected-note@-1 {{Assuming 'p' is null}} 8e692cfa3SJordan Rose // expected-note@-2 {{'?' condition is false}} 9e692cfa3SJordan Rose // expected-note@-3 {{'x' initialized to a null pointer value}} 10e692cfa3SJordan Rose *x = 1; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} 11e692cfa3SJordan Rose // expected-note@-1 {{Dereference of null pointer (loaded from variable 'x')}} 12e692cfa3SJordan Rose } 13e692cfa3SJordan Rose testCondProblem(int * p)14e692cfa3SJordan Rosevoid testCondProblem(int *p) { 15e692cfa3SJordan Rose if (p) return; 16e692cfa3SJordan Rose // expected-note@-1 {{Assuming 'p' is null}} 17e692cfa3SJordan Rose // expected-note@-2 {{Taking false branch}} 18e692cfa3SJordan Rose 19e692cfa3SJordan Rose int x = *p ? 0 : 1; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}} 20e692cfa3SJordan Rose // expected-note@-1 {{Dereference of null pointer (loaded from variable 'p')}} 21e692cfa3SJordan Rose (void)x; 22e692cfa3SJordan Rose } 23e692cfa3SJordan Rose testLHSProblem(int * p)24e692cfa3SJordan Rosevoid testLHSProblem(int *p) { 25e692cfa3SJordan Rose int x = !p ? *p : 1; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}} 26e692cfa3SJordan Rose // expected-note@-1 {{Assuming 'p' is null}} 27e692cfa3SJordan Rose // expected-note@-2 {{'?' condition is true}} 28e692cfa3SJordan Rose // expected-note@-3 {{Dereference of null pointer (loaded from variable 'p')}} 29e692cfa3SJordan Rose (void)x; 30e692cfa3SJordan Rose } 31e692cfa3SJordan Rose testRHSProblem(int * p)32e692cfa3SJordan Rosevoid testRHSProblem(int *p) { 33e692cfa3SJordan Rose int x = p ? 1 : *p; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}} 34e692cfa3SJordan Rose // expected-note@-1 {{Assuming 'p' is null}} 35e692cfa3SJordan Rose // expected-note@-2 {{'?' condition is false}} 36e692cfa3SJordan Rose // expected-note@-3 {{Dereference of null pointer (loaded from variable 'p')}} 37e692cfa3SJordan Rose (void)x; 38e692cfa3SJordan Rose } 39e692cfa3SJordan Rose testBinaryCondOp(int * p)40e692cfa3SJordan Rosevoid testBinaryCondOp(int *p) { 41e692cfa3SJordan Rose int *x = p ?: p; 42e692cfa3SJordan Rose // expected-note@-1 {{'?' condition is false}} 43e692cfa3SJordan Rose // expected-note@-2 {{'x' initialized to a null pointer value}} 44e692cfa3SJordan Rose *x = 1; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} 45e692cfa3SJordan Rose // expected-note@-1 {{Dereference of null pointer (loaded from variable 'x')}} 46e692cfa3SJordan Rose } 47e692cfa3SJordan Rose testBinaryLHSProblem(int * p)48e692cfa3SJordan Rosevoid testBinaryLHSProblem(int *p) { 49e692cfa3SJordan Rose if (p) return; 50e692cfa3SJordan Rose // expected-note@-1 {{Assuming 'p' is null}} 51e692cfa3SJordan Rose // expected-note@-2 {{Taking false branch}} 52e692cfa3SJordan Rose 53e692cfa3SJordan Rose int x = *p ?: 1; // expected-warning{{Dereference of null pointer (loaded from variable 'p')}} 54e692cfa3SJordan Rose // expected-note@-1 {{Dereference of null pointer (loaded from variable 'p')}} 55e692cfa3SJordan Rose (void)x; 56e692cfa3SJordan Rose } 57e692cfa3SJordan Rose testDiagnosableBranch(int a)58e692cfa3SJordan Rosevoid testDiagnosableBranch(int a) { 59e692cfa3SJordan Rose if (a) { 60e692cfa3SJordan Rose // expected-note@-1 {{Assuming 'a' is not equal to 0}} 61e692cfa3SJordan Rose // expected-note@-2 {{Taking true branch}} 62*97c675d3SNico Weber *(volatile int *)0 = 1; // expected-warning{{Dereference of null pointer}} 63e692cfa3SJordan Rose // expected-note@-1 {{Dereference of null pointer}} 64e692cfa3SJordan Rose } 65e692cfa3SJordan Rose } 66e692cfa3SJordan Rose testDiagnosableBranchLogical(int a,int b)679cb5614cSArtem Dergachevvoid testDiagnosableBranchLogical(int a, int b) { 68e692cfa3SJordan Rose if (a && b) { 699cb5614cSArtem Dergachev // expected-note@-1 {{Assuming 'a' is not equal to 0}} 700c33406aSArtem Dergachev // expected-note@-2 {{Left side of '&&' is true}} 719cb5614cSArtem Dergachev // expected-note@-3 {{Assuming 'b' is not equal to 0}} 729cb5614cSArtem Dergachev // expected-note@-4 {{Taking true branch}} 73*97c675d3SNico Weber *(volatile int *)0 = 1; // expected-warning{{Dereference of null pointer}} 74e692cfa3SJordan Rose // expected-note@-1 {{Dereference of null pointer}} 75e692cfa3SJordan Rose } 76e692cfa3SJordan Rose } 77e692cfa3SJordan Rose testNonDiagnosableBranchArithmetic(int a,int b)78e692cfa3SJordan Rosevoid testNonDiagnosableBranchArithmetic(int a, int b) { 79e692cfa3SJordan Rose if (a - b) { 80c0402c69SDominic Chen // expected-note@-1 {{Taking true branch}} 812bbccca9SAdam Balogh // expected-note@-2 {{Assuming the condition is true}} 82*97c675d3SNico Weber *(volatile int *)0 = 1; // expected-warning{{Dereference of null pointer}} 83e692cfa3SJordan Rose // expected-note@-1 {{Dereference of null pointer}} 84e692cfa3SJordan Rose } 85e692cfa3SJordan Rose } 86e692cfa3SJordan Rose 87