1*295fe0bdSJustin Stitt // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsanitize=signed-integer-overflow,unsigned-integer-overflow -fsanitize-undefined-ignore-overflow-pattern=all %s -emit-llvm -o - | FileCheck %s 2*295fe0bdSJustin Stitt // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsanitize=signed-integer-overflow,unsigned-integer-overflow -fsanitize-undefined-ignore-overflow-pattern=all -fwrapv %s -emit-llvm -o - | FileCheck %s 3*295fe0bdSJustin Stitt 4*295fe0bdSJustin Stitt // Check for potential false positives from patterns that _almost_ match classic overflow-dependent or overflow-prone code patterns 5*295fe0bdSJustin Stitt extern unsigned a, b, c; 6*295fe0bdSJustin Stitt 7*295fe0bdSJustin Stitt extern unsigned some(void); 8*295fe0bdSJustin Stitt 9*295fe0bdSJustin Stitt // Make sure all these still have handler paths, we shouldn't be excluding 10*295fe0bdSJustin Stitt // instrumentation of any "near" patterns. 11*295fe0bdSJustin Stitt // CHECK-LABEL: close_but_not_quite 12*295fe0bdSJustin Stitt void close_but_not_quite(void) { 13*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 14*295fe0bdSJustin Stitt if (a + b > a) 15*295fe0bdSJustin Stitt c = 9; 16*295fe0bdSJustin Stitt 17*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 18*295fe0bdSJustin Stitt if (a - b < a) 19*295fe0bdSJustin Stitt c = 9; 20*295fe0bdSJustin Stitt 21*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 22*295fe0bdSJustin Stitt if (a + b < a) 23*295fe0bdSJustin Stitt c = 9; 24*295fe0bdSJustin Stitt 25*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 26*295fe0bdSJustin Stitt if (a + b + 1 < a) 27*295fe0bdSJustin Stitt c = 9; 28*295fe0bdSJustin Stitt 29*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 30*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 31*295fe0bdSJustin Stitt if (a + b < a + 1) 32*295fe0bdSJustin Stitt c = 9; 33*295fe0bdSJustin Stitt 34*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 35*295fe0bdSJustin Stitt if (b >= a + b) 36*295fe0bdSJustin Stitt c = 9; 37*295fe0bdSJustin Stitt 38*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 39*295fe0bdSJustin Stitt if (a + a < a) 40*295fe0bdSJustin Stitt c = 9; 41*295fe0bdSJustin Stitt 42*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler. 43*295fe0bdSJustin Stitt if (a + b == a) 44*295fe0bdSJustin Stitt c = 9; 45*295fe0bdSJustin Stitt 46*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler 47*295fe0bdSJustin Stitt while (--a) 48*295fe0bdSJustin Stitt some(); 49*295fe0bdSJustin Stitt } 50*295fe0bdSJustin Stitt 51*295fe0bdSJustin Stitt // CHECK-LABEL: function_calls 52*295fe0bdSJustin Stitt void function_calls(void) { 53*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler 54*295fe0bdSJustin Stitt if (some() + b < some()) 55*295fe0bdSJustin Stitt c = 9; 56*295fe0bdSJustin Stitt } 57*295fe0bdSJustin Stitt 58*295fe0bdSJustin Stitt // CHECK-LABEL: not_quite_a_negated_unsigned_const 59*295fe0bdSJustin Stitt void not_quite_a_negated_unsigned_const(void) { 60*295fe0bdSJustin Stitt // CHECK: br i1{{.*}}handler 61*295fe0bdSJustin Stitt a = -b; 62*295fe0bdSJustin Stitt } 63