xref: /llvm-project/clang/test/CodeGen/ignore-overflow-pattern-false-pos.c (revision 76236fafda19ff3760443196edcd3cd9610ed733)
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