xref: /aosp_15_r20/external/clang/test/Analysis/region-store.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix,debug.ExprInspection -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li int printf(const char *restrict,...);
4*67e74705SXin Li 
5*67e74705SXin Li // Testing core functionality of the region store.
6*67e74705SXin Li // radar://10127782
compoundLiteralTest()7*67e74705SXin Li int compoundLiteralTest() {
8*67e74705SXin Li     int index = 0;
9*67e74705SXin Li     for (index = 0; index < 2; index++) {
10*67e74705SXin Li         int thing = (int []){0, 1}[index];
11*67e74705SXin Li         printf("thing: %i\n", thing);
12*67e74705SXin Li     }
13*67e74705SXin Li     return 0;
14*67e74705SXin Li }
15*67e74705SXin Li 
compoundLiteralTest2()16*67e74705SXin Li int compoundLiteralTest2() {
17*67e74705SXin Li     int index = 0;
18*67e74705SXin Li     for (index = 0; index < 3; index++) {
19*67e74705SXin Li         int thing = (int [][3]){{0,0,0}, {1,1,1}, {2,2,2}}[index][index];
20*67e74705SXin Li         printf("thing: %i\n", thing);
21*67e74705SXin Li     }
22*67e74705SXin Li     return 0;
23*67e74705SXin Li }
24*67e74705SXin Li 
concreteOffsetBindingIsInvalidatedBySymbolicOffsetAssignment(int length,int i)25*67e74705SXin Li int concreteOffsetBindingIsInvalidatedBySymbolicOffsetAssignment(int length,
26*67e74705SXin Li                                                                  int i) {
27*67e74705SXin Li   int values[length];
28*67e74705SXin Li   values[i] = 4;
29*67e74705SXin Li   return values[0]; // no-warning
30*67e74705SXin Li }
31*67e74705SXin Li 
32*67e74705SXin Li struct X{
33*67e74705SXin Li   int mem;
34*67e74705SXin Li };
35*67e74705SXin Li int initStruct(struct X *st);
structOffsetBindingIsInvalidated(int length,int i)36*67e74705SXin Li int structOffsetBindingIsInvalidated(int length, int i){
37*67e74705SXin Li   struct X l;
38*67e74705SXin Li   initStruct(&l);
39*67e74705SXin Li   return l.mem; // no-warning
40*67e74705SXin Li }
41*67e74705SXin Li 
42*67e74705SXin Li void clang_analyzer_eval(int);
testConstraintOnRegionOffset(int * values,int length,int i)43*67e74705SXin Li void testConstraintOnRegionOffset(int *values, int length, int i){
44*67e74705SXin Li   if (values[1] == 4) {
45*67e74705SXin Li     values[i] = 5;
46*67e74705SXin Li     clang_analyzer_eval(values[1] == 4);// expected-warning {{UNKNOWN}}
47*67e74705SXin Li   }
48*67e74705SXin Li }
49*67e74705SXin Li 
50*67e74705SXin Li int initArray(int *values);
testConstraintOnRegionOffsetStack(int * values,int length,int i)51*67e74705SXin Li void testConstraintOnRegionOffsetStack(int *values, int length, int i) {
52*67e74705SXin Li   if (values[0] == 4) {
53*67e74705SXin Li     initArray(values);
54*67e74705SXin Li     clang_analyzer_eval(values[0] == 4);// expected-warning {{UNKNOWN}}
55*67e74705SXin Li   }
56*67e74705SXin Li }
57