brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 1318b35 Raw
167 lines · c
1// -fstrict-flex-arrays=2 means that only undefined or zero element arrays are considered as FAMs.2 3// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c90 \4// RUN:    -fstrict-flex-arrays=25// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c99 \6// RUN:    -fstrict-flex-arrays=27// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c11 \8// RUN:    -fstrict-flex-arrays=29// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \10// RUN:    -fstrict-flex-arrays=211 12// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++98 -x c++ \13// RUN:    -fstrict-flex-arrays=214// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++03 -x c++ \15// RUN:    -fstrict-flex-arrays=216// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++11 -x c++ \17// RUN:    -fstrict-flex-arrays=218// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++14 -x c++ \19// RUN:    -fstrict-flex-arrays=220// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ \21// RUN:    -fstrict-flex-arrays=222 23// By default, -fstrict-flex-arrays=0, which means that even single element arrays are considered as FAMs.24// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \25// RUN:    -DSINGLE_ELEMENT_FAMS26// RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ \27// RUN:    -DSINGLE_ELEMENT_FAMS28 29typedef __typeof(sizeof(int)) size_t;30size_t clang_analyzer_getExtent(void *);31void clang_analyzer_dump(size_t);32 33void *alloca(size_t size);34void *malloc(size_t size);35void free(void *ptr);36 37void test_incomplete_array_fam(void) {38  typedef struct FAM {39    char c;40    int data[];41  } FAM;42 43  FAM fam;44  clang_analyzer_dump(clang_analyzer_getExtent(&fam));45  clang_analyzer_dump(clang_analyzer_getExtent(fam.data));46  // expected-warning@-2 {{4 S64b}}47  // expected-warning@-2 {{0 S64b}}48 49  FAM *p = (FAM *)alloca(sizeof(FAM));50  clang_analyzer_dump(clang_analyzer_getExtent(p));51  clang_analyzer_dump(clang_analyzer_getExtent(p->data));52  // expected-warning@-2 {{4 S64b}}53  // expected-warning@-2 {{0 S64b}}54 55  FAM *q = (FAM *)malloc(sizeof(FAM));56  clang_analyzer_dump(clang_analyzer_getExtent(q));57  clang_analyzer_dump(clang_analyzer_getExtent(q->data));58  // expected-warning@-2 {{4 S64b}}59  // expected-warning@-2 {{0 S64b}}60  free(q);61 62  q = (FAM *)malloc(sizeof(FAM) + sizeof(int) * 2);63  clang_analyzer_dump(clang_analyzer_getExtent(q));64  clang_analyzer_dump(clang_analyzer_getExtent(q->data));65  // expected-warning@-2 {{12 S64b}}66  // expected-warning@-2 {{8 S64b}}67  free(q);68 69  typedef struct __attribute__((packed)) {70    char c;71    int data[];72  } PackedFAM;73 74  PackedFAM *t = (PackedFAM *)malloc(sizeof(PackedFAM) + sizeof(int) * 2);75  clang_analyzer_dump(clang_analyzer_getExtent(t));76  clang_analyzer_dump(clang_analyzer_getExtent(t->data));77  // expected-warning@-2 {{9 S64b}}78  // expected-warning@-2 {{8 S64b}}79  free(t);80}81 82void test_too_small_base(void) {83  typedef struct FAM {84    long c;85    int data[];86  } FAM;87  short s = 0;88  FAM *p = (FAM *) &s;89  clang_analyzer_dump(clang_analyzer_getExtent(p));90  clang_analyzer_dump(clang_analyzer_getExtent(p->data));91  // expected-warning@-2 {{2 S64b}}92  // expected-warning@-2 {{-6 S64b}}93}94 95void test_zero_length_array_fam(void) {96  typedef struct FAM {97    char c;98    int data[0];99  } FAM;100 101  FAM fam;102  clang_analyzer_dump(clang_analyzer_getExtent(&fam));103  clang_analyzer_dump(clang_analyzer_getExtent(fam.data));104  // expected-warning@-2 {{4 S64b}}105  // expected-warning@-2 {{0 S64b}}106 107  FAM *p = (FAM *)alloca(sizeof(FAM));108  clang_analyzer_dump(clang_analyzer_getExtent(p));109  clang_analyzer_dump(clang_analyzer_getExtent(p->data));110  // expected-warning@-2 {{4 S64b}}111  // expected-warning@-2 {{0 S64b}}112 113  FAM *q = (FAM *)malloc(sizeof(FAM));114  clang_analyzer_dump(clang_analyzer_getExtent(q));115  clang_analyzer_dump(clang_analyzer_getExtent(q->data));116  // expected-warning@-2 {{4 S64b}}117  // expected-warning@-2 {{0 S64b}}118  free(q);119}120 121void test_single_element_array_possible_fam(void) {122  typedef struct FAM {123    char c;124    int data[1];125  } FAM;126 127#ifdef SINGLE_ELEMENT_FAMS128  FAM likely_fam;129  clang_analyzer_dump(clang_analyzer_getExtent(&likely_fam));130  clang_analyzer_dump(clang_analyzer_getExtent(likely_fam.data));131  // expected-warning@-2 {{8 S64b}}132  // expected-warning@-2 {{4 S64b}}133 134  FAM *p = (FAM *)alloca(sizeof(FAM));135  clang_analyzer_dump(clang_analyzer_getExtent(p));136  clang_analyzer_dump(clang_analyzer_getExtent(p->data));137  // expected-warning@-2 {{8 S64b}}138  // expected-warning@-2 {{4 S64b}}139 140  FAM *q = (FAM *)malloc(sizeof(FAM));141  clang_analyzer_dump(clang_analyzer_getExtent(q));142  clang_analyzer_dump(clang_analyzer_getExtent(q->data));143  // expected-warning@-2 {{8 S64b}}144  // expected-warning@-2 {{4 S64b}}145  free(q);146#else147  FAM likely_fam;148  clang_analyzer_dump(clang_analyzer_getExtent(&likely_fam));149  clang_analyzer_dump(clang_analyzer_getExtent(likely_fam.data));150  // expected-warning@-2 {{8 S64b}}151  // expected-warning@-2 {{4 S64b}}152 153  FAM *p = (FAM *)alloca(sizeof(FAM));154  clang_analyzer_dump(clang_analyzer_getExtent(p));155  clang_analyzer_dump(clang_analyzer_getExtent(p->data));156  // expected-warning@-2 {{8 S64b}}157  // expected-warning@-2 {{4 S64b}}158 159  FAM *q = (FAM *)malloc(sizeof(FAM));160  clang_analyzer_dump(clang_analyzer_getExtent(q));161  clang_analyzer_dump(clang_analyzer_getExtent(q->data));162  // expected-warning@-2 {{8 S64b}}163  // expected-warning@-2 {{4 S64b}}164  free(q);165#endif166}167