forked from OSchip/llvm-project
[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:
parent
41375a3545
commit
d0f89283cf
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
Loading…
Reference in New Issue