From: Alexander Kornienko Date: Wed, 9 May 2018 12:27:21 +0000 (+0000) Subject: Fixes issue introduced by r331556. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=80679644bf863c44b57f81d0f16600a3b2956148;p=clang Fixes issue introduced by r331556. Closes bug: https://bugs.llvm.org/show_bug.cgi?id=37357 Patch by Rafael Stahl! Differential revision: https://reviews.llvm.org/D46633 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@331870 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/RegionStore.cpp b/lib/StaticAnalyzer/Core/RegionStore.cpp index 557a89e626..be4b5aa918 100644 --- a/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -1711,13 +1711,15 @@ SVal RegionStoreManager::getBindingForField(RegionBindingsConstRef B, if (const auto *VR = dyn_cast(superR)) { const VarDecl *VD = VR->getDecl(); QualType RecordVarTy = VD->getType(); + unsigned Index = FD->getFieldIndex(); // Either the record variable or the field has to be const qualified. if (RecordVarTy.isConstQualified() || Ty.isConstQualified()) if (const Expr *Init = VD->getInit()) if (const auto *InitList = dyn_cast(Init)) - if (const Expr *FieldInit = InitList->getInit(FD->getFieldIndex())) - if (Optional V = svalBuilder.getConstantVal(FieldInit)) - return *V; + if (Index < InitList->getNumInits()) + if (const Expr *FieldInit = InitList->getInit(Index)) + if (Optional V = svalBuilder.getConstantVal(FieldInit)) + return *V; } return getBindingForFieldOrElementCommon(B, R, Ty); diff --git a/test/Analysis/initialization.c b/test/Analysis/initialization.c new file mode 100644 index 0000000000..a6fe9be2b7 --- /dev/null +++ b/test/Analysis/initialization.c @@ -0,0 +1,7 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s +// expected-no-diagnostics + +void initbug() { + const union { float a; } u = {}; + (void)u.a; // no-crash +}