import java.util.BitSet; import org.checkerframework.common.value.qual.*; class Binaries { private BitSet bitmap; public void test() { int length = bitmap.length(); for (int i = 0, t = 0; i < length; i++) { t |= (bitmap.get(i) ? (1 << (7 - i % 8)) : 0); if (i % 8 == 7 || i == length - 1) { write(t); t = 0; } } } void write(int t) {} // Test widenUpperBound is working. public void loop(int c) { double v = 0; int decexp = 0; int seendot = 0; while (true) { if (c == '.' && seendot == 0) seendot = 1; else if ('0' <= c && c <= '9') { v = v * 10 + (c - '0'); decexp += seendot; } else break; } } public void testIntRange( @IntVal({1, 2}) int values, @IntRange(from = 3, to = 4) int range1, @IntRange(from = 5, to = 20) int range2, @BottomVal int bottom, @UnknownVal int top) { /* IntRange + IntRange */ @IntRange(from = 8, to = 24) int a = range1 + range2; /* IntRange * IntVal */ @IntRange(from = 3, to = 8) int b = values * range1; /* IntRange * BottomVal */ int c = range1 * bottom; /* IntRange * UnknownVal */ @IntRange(from = 0) //:: error: (assignment.type.incompatible) int d = range1 + top; } public void add() { int a = 1; if (true) { a = 2; } @IntVal({3, 4}) int b = a + 2; double c = 1.0; if (true) { c = 2.0; } @DoubleVal({3.0, 4.0}) double d = c + 2; char e = '1'; if (true) { e = '2'; } @IntVal({'3', '4'}) char f = (char) (e + 2); String g = "A"; if (true) { g = "B"; } @StringVal({"AC", "BC"}) String h = g + "C"; } public void subtract() { int a = 1; if (true) { a = 2; } @IntVal({-1, 0}) int b = a - 2; double c = 1.0; if (true) { c = 2.0; } @DoubleVal({-1.0, 0.0}) double d = c - 2; char e = '2'; if (true) { e = '3'; } @IntVal({'0', '1'}) char f = (char) (e - 2); } public void multiply() { int a = 1; if (true) { a = 2; } @IntVal({2, 4}) int b = a * 2; double c = 1.0; if (true) { c = 2.0; } @DoubleVal({2.0, 4.0}) double d = (double) (c * 2); char e = (char) 25; if (true) { e = (char) 26; } @IntVal({'2', '4'}) char f = (char) (e * 2); @DoubleVal(0.75) float g = 1 * 0.75f; } public void divide() { int a = 2; if (true) { a = 4; } @IntVal({1, 2}) int b = a / 2; double c = 1.0; if (true) { c = 2.0; } @DoubleVal({0.5, 1.0}) double d = c / 2; char e = (char) 96; if (true) { e = (char) 98; } @IntVal({'0', '1'}) char f = (char) (e / 2); @IntVal(0) int g = 2 / 3; @IntVal(0) int h = (Integer.MAX_VALUE - 1) / Integer.MAX_VALUE; @IntVal(0) long l = (Long.MAX_VALUE - 1) / Long.MAX_VALUE; } public void remainder() { int a = 4; if (true) { a = 5; } @IntVal({1, 2}) int b = a % 3; double c = 4.0; if (true) { c = 5.0; } @DoubleVal({1.0, 2.0}) double d = c % 3; char e = (char) 98; if (true) { e = (char) 99; } @IntVal({'0', '1'}) char f = (char) (e % 50); } public boolean flag = true; public void and() { boolean a = true; if (flag) { a = false; } //:: error: (assignment.type.incompatible) @BoolVal({true}) boolean b = a & true; int c = 4; if (true) { c = 5; } @IntVal({0, 1}) int d = c & 3; char e = (char) 48; if (true) { e = (char) 51; } @IntVal({'0', '2'}) char f = (char) (e & 50); } public void or() { boolean a = true; if (true) { a = false; } //TODO: we could detect this case //:: error: (assignment.type.incompatible) @BoolVal({true}) boolean b = a | true; int c = 4; if (true) { c = 5; } @IntVal({7}) int d = c | 3; char e = (char) 48; if (true) { e = (char) 51; } @IntVal({'1', '3'}) char f = (char) (e | 1); } public void xor() { boolean a = true; if (true) { a = false; } //:: error: (assignment.type.incompatible) @BoolVal({true}) boolean b = a ^ true; int c = 4; if (true) { c = 5; } @IntVal({7, 6}) int d = c ^ 3; char e = (char) 48; if (true) { e = (char) 51; } @IntVal({'1', '2'}) char f = (char) (e ^ 1); } public void boolAnd() { @BoolVal({false}) boolean a = true && false; @BoolVal({true}) boolean b = false || true; } public void conditionals() { @BoolVal({false}) boolean a = 1.0f == '1'; @BoolVal({true}) boolean b = 1 != 2.0; @BoolVal({true}) boolean c = 1 > 0.5; @BoolVal({true}) boolean d = 1 >= 1.0; @BoolVal({true}) boolean e = 1 < 1.1f; @BoolVal({true}) boolean f = (char) 2 <= 2.0; @IntVal('!') Character BANG = '!'; @BoolVal(true) boolean g = (BANG == '!'); char bangChar = '!'; @BoolVal(true) boolean h = (BANG == bangChar); Character bang = '!'; // Reference equalitiy is used //:: error: (assignment.type.incompatible) @BoolVal(false) boolean i = (BANG == bang); } public void loop() throws InterruptedException { int spurious_count = 0; while (true) { wait(); if (System.currentTimeMillis() == 0) { spurious_count++; if (spurious_count > 1024) { break; } } } } public void shifts() { int a = -8; if (true) { a = 4; } @IntVal({1, -2}) int b = a >> 2; int c = 1; if (true) { c = 2; } @IntVal({4, 8}) int d = c << 2; int e = -8; if (true) { e = 4; } @IntVal({Integer.MAX_VALUE / 2 - 1, 1}) int f = e >>> 2; char g = (char) 24; if (true) { g = (char) 25; } @IntVal({'0', '2'}) char h = (char) (g << 1); } public void chains() { char a = 2; int b = 3; double c = 5; @DoubleVal({1}) double d = a * b - c; @DoubleVal({3}) double e = a * c - 2 * b - (char) 1; } public void compareWithNull() { String s = "1"; //TODO //:: error: (assignment.type.incompatible) @BoolVal(true) boolean b = (s != null); } public void conditionalComparisions() { @BoolVal(true) boolean a1 = true || false; @BoolVal(true) boolean a2 = true || true; @BoolVal(false) boolean a3 = false || false; @BoolVal(true) boolean a4 = false || true; @BoolVal(false) boolean a5 = true && false; @BoolVal(true) boolean a6 = true && true; @BoolVal(false) boolean a7 = false && false; @BoolVal(false) boolean a8 = false && true; boolean unknown = flag ? true : false; @BoolVal(true) boolean a9 = true || unknown; @BoolVal(true) boolean a11 = unknown || true; //:: error: (assignment.type.incompatible) @BoolVal(false) boolean a12 = unknown || false; //:: error: (assignment.type.incompatible) @BoolVal(true) boolean a13 = false || unknown; //:: error: (assignment.type.incompatible) @BoolVal(true) boolean a14 = true && unknown; //:: error: (assignment.type.incompatible) @BoolVal(true) boolean a15 = unknown && true; @BoolVal(false) boolean a16 = unknown && false; @BoolVal(false) boolean a17 = false && unknown; } }