xref: /llvm-project/clang/test/Analysis/builtin_overflow.c (revision fba6c887c110a501b311f6b01721eaf3a5dd994e)
1a017ed04SPavel Skripkin // RUN: %clang_analyze_cc1 -triple x86_64-unknown-unknown -verify %s \
2*fba6c887SPavel Skripkin // RUN:   -analyzer-checker=core,debug.ExprInspection,alpha.core.BoolAssignment
3a017ed04SPavel Skripkin 
4a017ed04SPavel Skripkin #define __UINT_MAX__ (__INT_MAX__ * 2U + 1U)
5a017ed04SPavel Skripkin #define __INT_MIN__  (-__INT_MAX__ - 1)
6a017ed04SPavel Skripkin 
7a017ed04SPavel Skripkin void clang_analyzer_dump_int(int);
8a017ed04SPavel Skripkin void clang_analyzer_dump_long(long);
9a017ed04SPavel Skripkin void clang_analyzer_eval(int);
10a017ed04SPavel Skripkin void clang_analyzer_warnIfReached(void);
11a017ed04SPavel Skripkin 
12a017ed04SPavel Skripkin void test_add_nooverflow(void)
13a017ed04SPavel Skripkin {
14a017ed04SPavel Skripkin    int res;
15a017ed04SPavel Skripkin 
16a017ed04SPavel Skripkin    if (__builtin_add_overflow(10, 20, &res)) {
17a017ed04SPavel Skripkin      clang_analyzer_warnIfReached();
18a017ed04SPavel Skripkin      return;
19a017ed04SPavel Skripkin    }
20a017ed04SPavel Skripkin 
21a017ed04SPavel Skripkin    clang_analyzer_dump_int(res); //expected-warning{{30 S32b}}
22a017ed04SPavel Skripkin }
23a017ed04SPavel Skripkin 
24a017ed04SPavel Skripkin void test_add_overflow(void)
25a017ed04SPavel Skripkin {
26a017ed04SPavel Skripkin    int res;
27a017ed04SPavel Skripkin 
28a017ed04SPavel Skripkin    if (__builtin_add_overflow(__INT_MAX__, 1, &res)) {
29a017ed04SPavel Skripkin      clang_analyzer_dump_int(res); //expected-warning{{1st function call argument is an uninitialized value}}
30a017ed04SPavel Skripkin      return;
31a017ed04SPavel Skripkin    }
32a017ed04SPavel Skripkin 
33a017ed04SPavel Skripkin    clang_analyzer_warnIfReached();
34a017ed04SPavel Skripkin }
35a017ed04SPavel Skripkin 
36a017ed04SPavel Skripkin void test_add_underoverflow(void)
37a017ed04SPavel Skripkin {
38a017ed04SPavel Skripkin    int res;
39a017ed04SPavel Skripkin 
40a017ed04SPavel Skripkin    if (__builtin_add_overflow(__INT_MIN__, -1, &res)) {
41a017ed04SPavel Skripkin      clang_analyzer_dump_int(res); //expected-warning{{1st function call argument is an uninitialized value}}
42a017ed04SPavel Skripkin      return;
43a017ed04SPavel Skripkin    }
44a017ed04SPavel Skripkin 
45a017ed04SPavel Skripkin    clang_analyzer_warnIfReached();
46a017ed04SPavel Skripkin }
47a017ed04SPavel Skripkin 
48a017ed04SPavel Skripkin void test_sub_underflow(void)
49a017ed04SPavel Skripkin {
50a017ed04SPavel Skripkin    int res;
51a017ed04SPavel Skripkin 
52a017ed04SPavel Skripkin    if (__builtin_sub_overflow(__INT_MIN__, 10, &res)) {
53a017ed04SPavel Skripkin      return;
54a017ed04SPavel Skripkin    }
55a017ed04SPavel Skripkin 
56a017ed04SPavel Skripkin    clang_analyzer_warnIfReached();
57a017ed04SPavel Skripkin }
58a017ed04SPavel Skripkin 
59a017ed04SPavel Skripkin void test_sub_overflow(void)
60a017ed04SPavel Skripkin {
61a017ed04SPavel Skripkin    int res;
62a017ed04SPavel Skripkin 
63a017ed04SPavel Skripkin    if (__builtin_sub_overflow(__INT_MAX__, -1, &res)) {
64a017ed04SPavel Skripkin      return;
65a017ed04SPavel Skripkin    }
66a017ed04SPavel Skripkin 
67a017ed04SPavel Skripkin    clang_analyzer_warnIfReached();
68a017ed04SPavel Skripkin }
69a017ed04SPavel Skripkin 
70a017ed04SPavel Skripkin void test_sub_nooverflow(void)
71a017ed04SPavel Skripkin {
72a017ed04SPavel Skripkin    int res;
73a017ed04SPavel Skripkin 
74a017ed04SPavel Skripkin    if (__builtin_sub_overflow(__INT_MAX__, 1, &res)) {
75a017ed04SPavel Skripkin      clang_analyzer_warnIfReached();
76a017ed04SPavel Skripkin      return;
77a017ed04SPavel Skripkin    }
78a017ed04SPavel Skripkin 
79a017ed04SPavel Skripkin    clang_analyzer_dump_int(res); //expected-warning{{2147483646 S32b}}
80a017ed04SPavel Skripkin }
81a017ed04SPavel Skripkin 
82a017ed04SPavel Skripkin void test_mul_overflow(void)
83a017ed04SPavel Skripkin {
84a017ed04SPavel Skripkin    int res;
85a017ed04SPavel Skripkin 
86a017ed04SPavel Skripkin    if (__builtin_mul_overflow(__INT_MAX__, 2, &res)) {
87a017ed04SPavel Skripkin      return;
88a017ed04SPavel Skripkin    }
89a017ed04SPavel Skripkin 
90a017ed04SPavel Skripkin    clang_analyzer_warnIfReached();
91a017ed04SPavel Skripkin }
92a017ed04SPavel Skripkin 
93a017ed04SPavel Skripkin void test_mul_underflow(void)
94a017ed04SPavel Skripkin {
95a017ed04SPavel Skripkin    int res;
96a017ed04SPavel Skripkin 
97a017ed04SPavel Skripkin    if (__builtin_mul_overflow(__INT_MIN__, -2, &res)) {
98a017ed04SPavel Skripkin      return;
99a017ed04SPavel Skripkin    }
100a017ed04SPavel Skripkin 
101a017ed04SPavel Skripkin    clang_analyzer_warnIfReached();
102a017ed04SPavel Skripkin }
103a017ed04SPavel Skripkin 
104a017ed04SPavel Skripkin void test_mul_nooverflow(void)
105a017ed04SPavel Skripkin {
106a017ed04SPavel Skripkin    int res;
107a017ed04SPavel Skripkin 
108a017ed04SPavel Skripkin    if (__builtin_mul_overflow(10, -2, &res)) {
109a017ed04SPavel Skripkin      clang_analyzer_warnIfReached();
110a017ed04SPavel Skripkin      return;
111a017ed04SPavel Skripkin    }
112a017ed04SPavel Skripkin 
113a017ed04SPavel Skripkin    clang_analyzer_dump_int(res); //expected-warning{{-20 S32b}}
114a017ed04SPavel Skripkin }
115a017ed04SPavel Skripkin 
116a017ed04SPavel Skripkin void test_nooverflow_diff_types(void)
117a017ed04SPavel Skripkin {
118a017ed04SPavel Skripkin    long res;
119a017ed04SPavel Skripkin 
120a017ed04SPavel Skripkin    // This is not an overflow, since result type is long.
121a017ed04SPavel Skripkin    if (__builtin_add_overflow(__INT_MAX__, 1, &res)) {
122a017ed04SPavel Skripkin      clang_analyzer_warnIfReached();
123a017ed04SPavel Skripkin      return;
124a017ed04SPavel Skripkin    }
125a017ed04SPavel Skripkin 
126a017ed04SPavel Skripkin    clang_analyzer_dump_long(res); //expected-warning{{2147483648 S64b}}
127a017ed04SPavel Skripkin }
128a017ed04SPavel Skripkin 
129a017ed04SPavel Skripkin void test_uaddll_overflow_contraints(unsigned long a, unsigned long b)
130a017ed04SPavel Skripkin {
131a017ed04SPavel Skripkin    unsigned long long res;
132a017ed04SPavel Skripkin 
133a017ed04SPavel Skripkin    if (a != 10)
134a017ed04SPavel Skripkin      return;
135a017ed04SPavel Skripkin    if (b != 10)
136a017ed04SPavel Skripkin      return;
137a017ed04SPavel Skripkin 
138a017ed04SPavel Skripkin    if (__builtin_uaddll_overflow(a, b, &res)) {
139a017ed04SPavel Skripkin      clang_analyzer_warnIfReached();
140a017ed04SPavel Skripkin      return;
141a017ed04SPavel Skripkin    }
142a017ed04SPavel Skripkin }
143a017ed04SPavel Skripkin 
144a017ed04SPavel Skripkin void test_uadd_overflow_contraints(unsigned a, unsigned b)
145a017ed04SPavel Skripkin {
146a017ed04SPavel Skripkin    unsigned res;
147a017ed04SPavel Skripkin 
148a017ed04SPavel Skripkin    if (a > 5)
149a017ed04SPavel Skripkin      return;
150a017ed04SPavel Skripkin    if (b != 10)
151a017ed04SPavel Skripkin      return;
152a017ed04SPavel Skripkin 
153a017ed04SPavel Skripkin    if (__builtin_uadd_overflow(a, b, &res)) {
154a017ed04SPavel Skripkin      clang_analyzer_warnIfReached();
155a017ed04SPavel Skripkin      return;
156a017ed04SPavel Skripkin    }
157a017ed04SPavel Skripkin }
158*fba6c887SPavel Skripkin 
159*fba6c887SPavel Skripkin void test_bool_assign(void)
160*fba6c887SPavel Skripkin {
161*fba6c887SPavel Skripkin     int res;
162*fba6c887SPavel Skripkin 
163*fba6c887SPavel Skripkin     // Reproduce issue from GH#111147. __builtin_*_overflow funcions
164*fba6c887SPavel Skripkin     // should return _Bool, but not int.
165*fba6c887SPavel Skripkin     _Bool ret = __builtin_mul_overflow(10, 20, &res); // no crash
166*fba6c887SPavel Skripkin }
167