1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s 2*67e74705SXin Li 3*67e74705SXin Li void clang_analyzer_eval(int); 4*67e74705SXin Li 5*67e74705SXin Li // There should be no warnings unless otherwise indicated. 6*67e74705SXin Li testComparisons(int a)7*67e74705SXin Livoid testComparisons (int a) { 8*67e74705SXin Li // Sema can already catch the simple comparison a==a, 9*67e74705SXin Li // since that's usually a logic error (and not path-dependent). 10*67e74705SXin Li int b = a; 11*67e74705SXin Li clang_analyzer_eval(b == a); // expected-warning{{TRUE}} 12*67e74705SXin Li clang_analyzer_eval(b >= a); // expected-warning{{TRUE}} 13*67e74705SXin Li clang_analyzer_eval(b <= a); // expected-warning{{TRUE}} 14*67e74705SXin Li clang_analyzer_eval(b != a); // expected-warning{{FALSE}} 15*67e74705SXin Li clang_analyzer_eval(b > a); // expected-warning{{FALSE}} 16*67e74705SXin Li clang_analyzer_eval(b < a); // expected-warning{{FALSE}} 17*67e74705SXin Li } 18*67e74705SXin Li testSelfOperations(int a)19*67e74705SXin Livoid testSelfOperations (int a) { 20*67e74705SXin Li clang_analyzer_eval((a|a) == a); // expected-warning{{TRUE}} 21*67e74705SXin Li clang_analyzer_eval((a&a) == a); // expected-warning{{TRUE}} 22*67e74705SXin Li clang_analyzer_eval((a^a) == 0); // expected-warning{{TRUE}} 23*67e74705SXin Li clang_analyzer_eval((a-a) == 0); // expected-warning{{TRUE}} 24*67e74705SXin Li } 25*67e74705SXin Li testIdempotent(int a)26*67e74705SXin Livoid testIdempotent (int a) { 27*67e74705SXin Li clang_analyzer_eval((a*1) == a); // expected-warning{{TRUE}} 28*67e74705SXin Li clang_analyzer_eval((a/1) == a); // expected-warning{{TRUE}} 29*67e74705SXin Li clang_analyzer_eval((a+0) == a); // expected-warning{{TRUE}} 30*67e74705SXin Li clang_analyzer_eval((a-0) == a); // expected-warning{{TRUE}} 31*67e74705SXin Li clang_analyzer_eval((a<<0) == a); // expected-warning{{TRUE}} 32*67e74705SXin Li clang_analyzer_eval((a>>0) == a); // expected-warning{{TRUE}} 33*67e74705SXin Li clang_analyzer_eval((a^0) == a); // expected-warning{{TRUE}} 34*67e74705SXin Li clang_analyzer_eval((a&(~0)) == a); // expected-warning{{TRUE}} 35*67e74705SXin Li clang_analyzer_eval((a|0) == a); // expected-warning{{TRUE}} 36*67e74705SXin Li } 37*67e74705SXin Li testReductionToConstant(int a)38*67e74705SXin Livoid testReductionToConstant (int a) { 39*67e74705SXin Li clang_analyzer_eval((a*0) == 0); // expected-warning{{TRUE}} 40*67e74705SXin Li clang_analyzer_eval((a&0) == 0); // expected-warning{{TRUE}} 41*67e74705SXin Li clang_analyzer_eval((a|(~0)) == (~0)); // expected-warning{{TRUE}} 42*67e74705SXin Li } 43*67e74705SXin Li testSymmetricIntSymOperations(int a)44*67e74705SXin Livoid testSymmetricIntSymOperations (int a) { 45*67e74705SXin Li clang_analyzer_eval((2+a) == (a+2)); // expected-warning{{TRUE}} 46*67e74705SXin Li clang_analyzer_eval((2*a) == (a*2)); // expected-warning{{TRUE}} 47*67e74705SXin Li clang_analyzer_eval((2&a) == (a&2)); // expected-warning{{TRUE}} 48*67e74705SXin Li clang_analyzer_eval((2^a) == (a^2)); // expected-warning{{TRUE}} 49*67e74705SXin Li clang_analyzer_eval((2|a) == (a|2)); // expected-warning{{TRUE}} 50*67e74705SXin Li } 51*67e74705SXin Li testAsymmetricIntSymOperations(int a)52*67e74705SXin Livoid testAsymmetricIntSymOperations (int a) { 53*67e74705SXin Li clang_analyzer_eval(((~0) >> a) == (~0)); // expected-warning{{TRUE}} 54*67e74705SXin Li clang_analyzer_eval((0 >> a) == 0); // expected-warning{{TRUE}} 55*67e74705SXin Li clang_analyzer_eval((0 << a) == 0); // expected-warning{{TRUE}} 56*67e74705SXin Li 57*67e74705SXin Li // Unsigned right shift shifts in zeroes. 58*67e74705SXin Li clang_analyzer_eval(((~0U) >> a) != (~0U)); // expected-warning{{UNKNOWN}} 59*67e74705SXin Li } 60*67e74705SXin Li testLocations(char * a)61*67e74705SXin Livoid testLocations (char *a) { 62*67e74705SXin Li char *b = a; 63*67e74705SXin Li clang_analyzer_eval(b == a); // expected-warning{{TRUE}} 64*67e74705SXin Li clang_analyzer_eval(b >= a); // expected-warning{{TRUE}} 65*67e74705SXin Li clang_analyzer_eval(b <= a); // expected-warning{{TRUE}} 66*67e74705SXin Li clang_analyzer_eval(b != a); // expected-warning{{FALSE}} 67*67e74705SXin Li clang_analyzer_eval(b > a); // expected-warning{{FALSE}} 68*67e74705SXin Li clang_analyzer_eval(b < a); // expected-warning{{FALSE}} 69*67e74705SXin Li } 70*67e74705SXin Li testMixedTypeComparisons(char a,unsigned long b)71*67e74705SXin Livoid testMixedTypeComparisons (char a, unsigned long b) { 72*67e74705SXin Li if (a != 0) return; 73*67e74705SXin Li if (b != 0x100) return; 74*67e74705SXin Li 75*67e74705SXin Li clang_analyzer_eval(a <= b); // expected-warning{{TRUE}} 76*67e74705SXin Li clang_analyzer_eval(b >= a); // expected-warning{{TRUE}} 77*67e74705SXin Li clang_analyzer_eval(a != b); // expected-warning{{TRUE}} 78*67e74705SXin Li } 79