[analyzer] We currently do not fully support CompoundLiterals in

RegionStore, so be explicit about it and generate UnknownVal().

This is a hack to ensure we never produce undefined values for a value
coming from a compound value. (The undefined values can lead to
false positives.) 

radar://10127782

llvm-svn: 156446
This commit is contained in:
Anna Zaks 2012-05-08 23:40:38 +00:00
parent 41375a3545
commit d0f89283cf
2 changed files with 33 additions and 1 deletions

View File

@ -1152,7 +1152,16 @@ RegionStoreManager::GetLazyBinding(RegionBindings B, const MemRegion *R,
}
SVal RegionStoreManager::getBindingForElement(Store store,
const ElementRegion* R) {
const ElementRegion* R) {
// We do not currently model bindings of the CompoundLiteralregion.
const ElementRegion *Tmp = R;
while (Tmp) {
const MemRegion *Sup = Tmp->getSuperRegion();
if (isa<CompoundLiteralRegion>(Sup))
return UnknownVal();
Tmp = dyn_cast<ElementRegion>(Sup);
}
// Check if the region has a binding.
RegionBindings B = GetRegionBindings(store);
if (const Optional<SVal> &V = getDirectBinding(B, R))

View File

@ -0,0 +1,23 @@
// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix -verify %s
int printf(const char *restrict,...);
// Testing core functionality of the region store.
// radar://10127782
int compoundLiteralTest() {
int index = 0;
for (index = 0; index < 2; index++) {
int thing = (int []){0, 1}[index];
printf("thing: %i\n", thing);
}
return 0;
}
int compoundLiteralTest2() {
int index = 0;
for (index = 0; index < 3; index++) {
int thing = (int [][3]){{0,0,0}, {1,1,1}, {2,2,2}}[index][index];
printf("thing: %i\n", thing);
}
return 0;
}