From df1f4e0cc6ec9a734aae41ffd48ee8b2007fcabb Mon Sep 17 00:00:00 2001 From: Balazs Benics Date: Wed, 25 Aug 2021 16:43:25 +0200 Subject: [PATCH] Revert "[analyzer] Ignore IncompleteArrayTypes in getStaticSize() for FAMs" This reverts commit 360ced3b8fd2cfb9f2a26deb739e6c381e98b9a5. --- clang/lib/StaticAnalyzer/Core/MemRegion.cpp | 23 ++----- clang/test/Analysis/flexible-array-members.c | 96 ---------------------------- 2 files changed, 5 insertions(+), 114 deletions(-) delete mode 100644 clang/test/Analysis/flexible-array-members.c diff --git a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp index 1a614d4..bd725ee 100644 --- a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp +++ b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -768,27 +768,14 @@ DefinedOrUnknownSVal MemRegionManager::getStaticSize(const MemRegion *MR, return UnknownVal(); QualType Ty = cast(SR)->getDesugaredValueType(Ctx); - const DefinedOrUnknownSVal Size = getElementExtent(Ty, SVB); + DefinedOrUnknownSVal Size = getElementExtent(Ty, SVB); // A zero-length array at the end of a struct often stands for dynamically // allocated extra memory. - const auto isFlexibleArrayMemberCandidate = [this](QualType Ty) -> bool { - const ArrayType *AT = Ctx.getAsArrayType(Ty); - if (!AT) - return false; - if (isa(AT)) - return true; - - if (const auto *CAT = dyn_cast(AT)) { - const llvm::APInt &Size = CAT->getSize(); - if (Size.isNullValue()) - return true; - } - return false; - }; - - if (isFlexibleArrayMemberCandidate(Ty)) - return UnknownVal(); + if (Size.isZeroConstant()) { + if (isa(Ty)) + return UnknownVal(); + } return Size; } diff --git a/clang/test/Analysis/flexible-array-members.c b/clang/test/Analysis/flexible-array-members.c deleted file mode 100644 index 23a8d1f..0000000 --- a/clang/test/Analysis/flexible-array-members.c +++ /dev/null @@ -1,96 +0,0 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c90 -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c99 -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c11 -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 - -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++98 -x c++ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++03 -x c++ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++11 -x c++ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++14 -x c++ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ - -typedef __typeof(sizeof(int)) size_t; -size_t clang_analyzer_getExtent(void *); -void clang_analyzer_dump(size_t); - -void *alloca(size_t size); -void *malloc(size_t size); -void free(void *ptr); - -void test_incomplete_array_fam() { - typedef struct FAM { - char c; - int data[]; - } FAM; - - FAM fam; - clang_analyzer_dump(clang_analyzer_getExtent(&fam)); - clang_analyzer_dump(clang_analyzer_getExtent(fam.data)); - // expected-warning@-2 {{4 S64b}} - // expected-warning@-2 {{Unknown}} - - FAM *p = (FAM *)alloca(sizeof(FAM)); - clang_analyzer_dump(clang_analyzer_getExtent(p)); - clang_analyzer_dump(clang_analyzer_getExtent(p->data)); - // expected-warning@-2 {{4 U64b}} - // expected-warning@-2 {{Unknown}} - - FAM *q = (FAM *)malloc(sizeof(FAM)); - clang_analyzer_dump(clang_analyzer_getExtent(q)); - clang_analyzer_dump(clang_analyzer_getExtent(q->data)); - // expected-warning@-2 {{4 U64b}} - // expected-warning@-2 {{Unknown}} - free(q); -} - -void test_zero_length_array_fam() { - typedef struct FAM { - char c; - int data[0]; - } FAM; - - FAM fam; - clang_analyzer_dump(clang_analyzer_getExtent(&fam)); - clang_analyzer_dump(clang_analyzer_getExtent(fam.data)); - // expected-warning@-2 {{4 S64b}} - // expected-warning@-2 {{Unknown}} - - FAM *p = (FAM *)alloca(sizeof(FAM)); - clang_analyzer_dump(clang_analyzer_getExtent(p)); - clang_analyzer_dump(clang_analyzer_getExtent(p->data)); - // expected-warning@-2 {{4 U64b}} - // expected-warning@-2 {{Unknown}} - - FAM *q = (FAM *)malloc(sizeof(FAM)); - clang_analyzer_dump(clang_analyzer_getExtent(q)); - clang_analyzer_dump(clang_analyzer_getExtent(q->data)); - // expected-warning@-2 {{4 U64b}} - // expected-warning@-2 {{Unknown}} - free(q); -} - -void test_single_element_array_possible_fam() { - typedef struct FAM { - char c; - int data[1]; - } FAM; - - FAM likely_fam; - clang_analyzer_dump(clang_analyzer_getExtent(&likely_fam)); - clang_analyzer_dump(clang_analyzer_getExtent(likely_fam.data)); - // expected-warning@-2 {{8 S64b}} - // expected-warning@-2 {{4 S64b}} - - FAM *p = (FAM *)alloca(sizeof(FAM)); - clang_analyzer_dump(clang_analyzer_getExtent(p)); - clang_analyzer_dump(clang_analyzer_getExtent(p->data)); - // expected-warning@-2 {{8 U64b}} - // expected-warning@-2 {{4 S64b}} - - FAM *q = (FAM *)malloc(sizeof(FAM)); - clang_analyzer_dump(clang_analyzer_getExtent(q)); - clang_analyzer_dump(clang_analyzer_getExtent(q->data)); - // expected-warning@-2 {{8 U64b}} - // expected-warning@-2 {{4 S64b}} - free(q); -} -- 2.7.4