Clang Project

clang_source_code/test/Analysis/bitwise-ops.c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -triple x86_64-apple-darwin13 -Wno-shift-count-overflow -verify %s
2
3void clang_analyzer_eval(int);
4#define CHECK(expr) if (!(expr)) return; clang_analyzer_eval(expr)
5
6void testPersistentConstraints(int x, int y) {
7  // Sanity check
8  CHECK(x); // expected-warning{{TRUE}}
9  CHECK(x & 1); // expected-warning{{TRUE}}
10  
11  CHECK(1 - x); // expected-warning{{TRUE}}
12  CHECK(x & y); // expected-warning{{TRUE}}
13}
14
15int testConstantShifts_PR18073(int which) {
16  // FIXME: We should have a checker that actually specifically checks bitwise
17  // shifts against the width of the LHS's /static/ type, rather than just
18  // having BasicValueFactory return "undefined" when dealing with two constant
19  // operands.
20  switch (which) {
21  case 1:
22    return 0ULL << 63; // no-warning
23  case 2:
24    return 0ULL << 64; // expected-warning{{The result of the left shift is undefined due to shifting by '64', which is greater or equal to the width of type 'unsigned long long'}}
25  case 3:
26    return 0ULL << 65; // expected-warning{{The result of the left shift is undefined due to shifting by '65', which is greater or equal to the width of type 'unsigned long long'}}
27
28  default:
29    return 0;
30  }
31}
32
33int testOverflowShift(int a) {
34  if (a == 323) {
35    return 1 << a; // expected-warning{{The result of the left shift is undefined due to shifting by '323', which is greater or equal to the width of type 'int'}}
36  }
37  return 0;
38}
39
40int testNegativeShift(int a) {
41  if (a == -5) {
42    return 1 << a; // expected-warning{{The result of the left shift is undefined because the right operand is negative}}
43  }
44  return 0;
45}
46
47int testNegativeLeftShift(int a) {
48  if (a == -3) {
49    return a << 1; // expected-warning{{The result of the left shift is undefined because the left operand is negative}}
50  }
51  return 0;
52}
53
54int testUnrepresentableLeftShift(int a) {
55  if (a == 8)
56    return a << 30; // expected-warning{{The result of the left shift is undefined due to shifting '8' by '30', which is unrepresentable in the unsigned version of the return type 'int'}}
57  return 0;
58}
59