xref: /aosp_15_r20/external/clang/test/Analysis/logical-ops.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -Wno-pointer-bool-conversion -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li void clang_analyzer_eval(int);
4*67e74705SXin Li 
testAnd(int i,int * p)5*67e74705SXin Li void testAnd(int i, int *p) {
6*67e74705SXin Li   int *nullP = 0;
7*67e74705SXin Li   int *knownP = &i;
8*67e74705SXin Li   clang_analyzer_eval((knownP && knownP) == 1); // expected-warning{{TRUE}}
9*67e74705SXin Li   clang_analyzer_eval((knownP && nullP) == 0); // expected-warning{{TRUE}}
10*67e74705SXin Li   clang_analyzer_eval((knownP && p) == 1); // expected-warning{{UNKNOWN}}
11*67e74705SXin Li }
12*67e74705SXin Li 
testOr(int i,int * p)13*67e74705SXin Li void testOr(int i, int *p) {
14*67e74705SXin Li   int *nullP = 0;
15*67e74705SXin Li   int *knownP = &i;
16*67e74705SXin Li   clang_analyzer_eval((nullP || knownP) == 1); // expected-warning{{TRUE}}
17*67e74705SXin Li   clang_analyzer_eval((nullP || nullP) == 0); // expected-warning{{TRUE}}
18*67e74705SXin Li   clang_analyzer_eval((nullP || p) == 1); // expected-warning{{UNKNOWN}}
19*67e74705SXin Li }
20*67e74705SXin Li 
21*67e74705SXin Li 
22*67e74705SXin Li // PR13461
testTypeIsInt(int i,void * p)23*67e74705SXin Li int testTypeIsInt(int i, void *p) {
24*67e74705SXin Li   if (i | (p && p))
25*67e74705SXin Li     return 1;
26*67e74705SXin Li   return 0;
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li // These crashed the analyzer at some point.
between(char * x)30*67e74705SXin Li int between(char *x) {
31*67e74705SXin Li   extern char start[];
32*67e74705SXin Li   extern char end[];
33*67e74705SXin Li   return x >= start && x < end;
34*67e74705SXin Li }
35*67e74705SXin Li 
undef(void)36*67e74705SXin Li int undef(void) {} // expected-warning{{control reaches end of non-void function}}
useUndef(void)37*67e74705SXin Li void useUndef(void) { 0 || undef(); }
38*67e74705SXin Li 
testPointer(void)39*67e74705SXin Li void testPointer(void) { (void) (1 && testPointer && 0); }
40