| // 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; |
| } |