xref: /llvm-project/clang/test/CodeGen/ignore-overflow-pattern-false-pos.c (revision 76236fafda19ff3760443196edcd3cd9610ed733)
1 // 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 // 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 
4 // Check for potential false positives from patterns that _almost_ match classic overflow-dependent or overflow-prone code patterns
5 extern unsigned a, b, c;
6 
7 extern unsigned some(void);
8 
9 // Make sure all these still have handler paths, we shouldn't be excluding
10 // instrumentation of any "near" patterns.
11 // CHECK-LABEL: close_but_not_quite
12 void close_but_not_quite(void) {
13   // CHECK: br i1{{.*}}handler.
14   if (a + b > a)
15     c = 9;
16 
17   // CHECK: br i1{{.*}}handler.
18   if (a - b < a)
19     c = 9;
20 
21   // CHECK: br i1{{.*}}handler.
22   if (a + b < a)
23     c = 9;
24 
25   // CHECK: br i1{{.*}}handler.
26   if (a + b + 1 < a)
27     c = 9;
28 
29   // CHECK: br i1{{.*}}handler.
30   // CHECK: br i1{{.*}}handler.
31   if (a + b < a + 1)
32     c = 9;
33 
34   // CHECK: br i1{{.*}}handler.
35   if (b >= a + b)
36     c = 9;
37 
38   // CHECK: br i1{{.*}}handler.
39   if (a + a < a)
40     c = 9;
41 
42   // CHECK: br i1{{.*}}handler.
43   if (a + b == a)
44     c = 9;
45 
46   // CHECK: br i1{{.*}}handler
47   while (--a)
48     some();
49 }
50 
51 // CHECK-LABEL: function_calls
52 void function_calls(void) {
53   // CHECK: br i1{{.*}}handler
54   if (some() + b < some())
55     c = 9;
56 }
57 
58 // CHECK-LABEL: not_quite_a_negated_unsigned_const
59 void not_quite_a_negated_unsigned_const(void) {
60   // CHECK: br i1{{.*}}handler
61   a = -b;
62 }
63