xref: /llvm-project/clang/test/Analysis/array-bound-v2-constraint-check.c (revision 12559064e05a11e8418425de59d8745f0cfb1122)
1*12559064Sdingfei // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc,alpha.security.ArrayBoundV2,debug.ExprInspection \
2de254732SDonát Nagy // RUN:   -analyzer-config eagerly-assume=false -verify %s
3de254732SDonát Nagy 
4de254732SDonát Nagy void clang_analyzer_eval(int);
5de254732SDonát Nagy void clang_analyzer_printState(void);
6de254732SDonát Nagy 
7*12559064Sdingfei typedef typeof(sizeof(int)) size_t;
8de254732SDonát Nagy const char a[] = "abcd"; // extent: 5 bytes
9de254732SDonát Nagy 
symbolic_size_t_and_int0(size_t len)10de254732SDonát Nagy void symbolic_size_t_and_int0(size_t len) {
11de254732SDonát Nagy   (void)a[len + 1]; // no-warning
12de254732SDonát Nagy   // We infered that the 'len' must be in a specific range to make the previous indexing valid.
13de254732SDonát Nagy   // len: [0,3]
14de254732SDonát Nagy   clang_analyzer_eval(len <= 3); // expected-warning {{TRUE}}
15de254732SDonát Nagy   clang_analyzer_eval(len <= 2); // expected-warning {{UNKNOWN}}
16de254732SDonát Nagy }
17de254732SDonát Nagy 
symbolic_size_t_and_int1(size_t len)18de254732SDonát Nagy void symbolic_size_t_and_int1(size_t len) {
19de254732SDonát Nagy   (void)a[len]; // no-warning
20de254732SDonát Nagy   // len: [0,4]
21de254732SDonát Nagy   clang_analyzer_eval(len <= 4); // expected-warning {{TRUE}}
22de254732SDonát Nagy   clang_analyzer_eval(len <= 3); // expected-warning {{UNKNOWN}}
23de254732SDonát Nagy }
24de254732SDonát Nagy 
symbolic_size_t_and_int2(size_t len)25de254732SDonát Nagy void symbolic_size_t_and_int2(size_t len) {
26de254732SDonát Nagy   (void)a[len - 1]; // no-warning
27de254732SDonát Nagy   // len: [1,5]
28de254732SDonát Nagy   clang_analyzer_eval(1 <= len && len <= 5); // expected-warning {{TRUE}}
29de254732SDonát Nagy   clang_analyzer_eval(2 <= len);             // expected-warning {{UNKNOWN}}
30de254732SDonát Nagy   clang_analyzer_eval(len <= 4);             // expected-warning {{UNKNOWN}}
31de254732SDonát Nagy }
32de254732SDonát Nagy 
symbolic_uint_and_int0(unsigned len)33de254732SDonát Nagy void symbolic_uint_and_int0(unsigned len) {
34de254732SDonát Nagy   (void)a[len + 1]; // no-warning
35de254732SDonát Nagy   // len: [0,3]
36de254732SDonát Nagy   clang_analyzer_eval(0 <= len && len <= 3); // expected-warning {{TRUE}}
37de254732SDonát Nagy   clang_analyzer_eval(1 <= len);             // expected-warning {{UNKNOWN}}
38de254732SDonát Nagy   clang_analyzer_eval(len <= 2);             // expected-warning {{UNKNOWN}}
39de254732SDonát Nagy }
40de254732SDonát Nagy 
symbolic_uint_and_int1(unsigned len)41de254732SDonát Nagy void symbolic_uint_and_int1(unsigned len) {
42de254732SDonát Nagy   (void)a[len]; // no-warning
43de254732SDonát Nagy   // len: [0,4]
44de254732SDonát Nagy   clang_analyzer_eval(0 <= len && len <= 4); // expected-warning {{TRUE}}
45de254732SDonát Nagy   clang_analyzer_eval(1 <= len);             // expected-warning {{UNKNOWN}}
46de254732SDonát Nagy   clang_analyzer_eval(len <= 3);             // expected-warning {{UNKNOWN}}
47de254732SDonát Nagy }
symbolic_uint_and_int2(unsigned len)48de254732SDonát Nagy void symbolic_uint_and_int2(unsigned len) {
49de254732SDonát Nagy   (void)a[len - 1]; // no-warning
50de254732SDonát Nagy   // len: [1,5]
51de254732SDonát Nagy   clang_analyzer_eval(1 <= len && len <= 5); // expected-warning {{TRUE}}
52de254732SDonát Nagy   clang_analyzer_eval(2 <= len);             // expected-warning {{UNKNOWN}}
53de254732SDonát Nagy   clang_analyzer_eval(len <= 4);             // expected-warning {{UNKNOWN}}
54de254732SDonát Nagy }
55de254732SDonát Nagy 
symbolic_int_and_int0(int len)56de254732SDonát Nagy void symbolic_int_and_int0(int len) {
57de254732SDonát Nagy   (void)a[len + 1]; // no-warning
58de254732SDonát Nagy   // len: [-1,3]
59de254732SDonát Nagy   clang_analyzer_eval(-1 <= len && len <= 3); // expected-warning {{TRUE}}
60de254732SDonát Nagy   clang_analyzer_eval(0 <= len);              // expected-warning {{UNKNOWN}}
61de254732SDonát Nagy   clang_analyzer_eval(len <= 2);              // expected-warning {{UNKNOWN}}
62de254732SDonát Nagy }
symbolic_int_and_int1(int len)63de254732SDonát Nagy void symbolic_int_and_int1(int len) {
64de254732SDonát Nagy   (void)a[len]; // no-warning
65de254732SDonát Nagy   // len: [0,4]
66de254732SDonát Nagy   clang_analyzer_eval(0 <= len && len <= 4); // expected-warning {{TRUE}}
67de254732SDonát Nagy   clang_analyzer_eval(1 <= len);             // expected-warning {{UNKNOWN}}
68de254732SDonát Nagy   clang_analyzer_eval(len <= 3);             // expected-warning {{UNKNOWN}}
69de254732SDonát Nagy }
symbolic_int_and_int2(int len)70de254732SDonát Nagy void symbolic_int_and_int2(int len) {
71de254732SDonát Nagy   (void)a[len - 1]; // no-warning
72de254732SDonát Nagy   // len: [1,5]
73de254732SDonát Nagy   clang_analyzer_eval(1 <= len && len <= 5); // expected-warning {{TRUE}}
74de254732SDonát Nagy   clang_analyzer_eval(2 <= len);             // expected-warning {{UNKNOWN}}
75de254732SDonát Nagy   clang_analyzer_eval(len <= 4);             // expected-warning {{UNKNOWN}}
76de254732SDonát Nagy }
77de254732SDonát Nagy 
symbolic_longlong_and_int0(long long len)78de254732SDonát Nagy void symbolic_longlong_and_int0(long long len) {
79de254732SDonát Nagy   (void)a[len + 1]; // no-warning
80de254732SDonát Nagy   // len: [-1,3]
81de254732SDonát Nagy   clang_analyzer_eval(-1 <= len && len <= 3); // expected-warning {{TRUE}}
82de254732SDonát Nagy   clang_analyzer_eval(0 <= len);              // expected-warning {{UNKNOWN}}
83de254732SDonát Nagy   clang_analyzer_eval(len <= 2);              // expected-warning {{UNKNOWN}}
84de254732SDonát Nagy }
85de254732SDonát Nagy 
86*12559064Sdingfei void *malloc(size_t);
87*12559064Sdingfei void free(void *);
symbolic_longlong_and_int0_dynamic_extent(long long len)88*12559064Sdingfei void symbolic_longlong_and_int0_dynamic_extent(long long len) {
89*12559064Sdingfei   char *b = malloc(5);
90*12559064Sdingfei   (void)b[len + 1]; // no-warning
91*12559064Sdingfei   // len: [-1,3]
92*12559064Sdingfei   clang_analyzer_eval(-1 <= len && len <= 3); // expected-warning {{TRUE}}
93*12559064Sdingfei   clang_analyzer_eval(0 <= len);              // expected-warning {{UNKNOWN}}
94*12559064Sdingfei   clang_analyzer_eval(len <= 2);              // expected-warning {{UNKNOWN}}
95*12559064Sdingfei   free(b);
96*12559064Sdingfei }
97*12559064Sdingfei 
symbolic_longlong_and_int1(long long len)98de254732SDonát Nagy void symbolic_longlong_and_int1(long long len) {
99de254732SDonát Nagy   (void)a[len]; // no-warning
100de254732SDonát Nagy   // len: [0,4]
101de254732SDonát Nagy   clang_analyzer_eval(0 <= len && len <= 4); // expected-warning {{TRUE}}
102de254732SDonát Nagy   clang_analyzer_eval(1 <= len);             // expected-warning {{UNKNOWN}}
103de254732SDonát Nagy   clang_analyzer_eval(len <= 3);             // expected-warning {{UNKNOWN}}
104de254732SDonát Nagy }
105de254732SDonát Nagy 
symbolic_longlong_and_int2(long long len)106de254732SDonát Nagy void symbolic_longlong_and_int2(long long len) {
107de254732SDonát Nagy   (void)a[len - 1]; // no-warning
108de254732SDonát Nagy   // len: [1,5]
109de254732SDonát Nagy   clang_analyzer_eval(1 <= len && len <= 5); // expected-warning {{TRUE}}
110de254732SDonát Nagy   clang_analyzer_eval(2 <= len);             // expected-warning {{UNKNOWN}}
111de254732SDonát Nagy   clang_analyzer_eval(len <= 4);             // expected-warning {{UNKNOWN}}
112de254732SDonát Nagy }
113