| // 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 | |
| // 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 | |
| // Check for potential false positives from patterns that _almost_ match classic overflow-dependent or overflow-prone code patterns | |
| extern unsigned a, b, c; | |
| extern unsigned some(void); | |
| // Make sure all these still have handler paths, we shouldn't be excluding | |
| // instrumentation of any "near" patterns. | |
| // CHECK-LABEL: close_but_not_quite | |
| void close_but_not_quite(void) { | |
| // CHECK: br i1{{.*}}handler. | |
| if (a + b > a) | |
| c = 9; | |
| // CHECK: br i1{{.*}}handler. | |
| if (a - b < a) | |
| c = 9; | |
| // CHECK: br i1{{.*}}handler. | |
| if (a + b < a) | |
| c = 9; | |
| // CHECK: br i1{{.*}}handler. | |
| if (a + b + 1 < a) | |
| c = 9; | |
| // CHECK: br i1{{.*}}handler. | |
| // CHECK: br i1{{.*}}handler. | |
| if (a + b < a + 1) | |
| c = 9; | |
| // CHECK: br i1{{.*}}handler. | |
| if (b >= a + b) | |
| c = 9; | |
| // CHECK: br i1{{.*}}handler. | |
| if (a + a < a) | |
| c = 9; | |
| // CHECK: br i1{{.*}}handler. | |
| if (a + b == a) | |
| c = 9; | |
| // CHECK: br i1{{.*}}handler | |
| while (--a) | |
| some(); | |
| } | |
| // CHECK-LABEL: function_calls | |
| void function_calls(void) { | |
| // CHECK: br i1{{.*}}handler | |
| if (some() + b < some()) | |
| c = 9; | |
| } | |
| // CHECK-LABEL: not_quite_a_negated_unsigned_const | |
| void not_quite_a_negated_unsigned_const(void) { | |
| // CHECK: br i1{{.*}}handler | |
| a = -b; | |
| } |