[analyzer] Fix false positive on introspection of a block's internal layout.

When implementation of the block runtime is available, we should not
warn that block layout fields are uninitialized simply because they're
on the stack.
This commit is contained in:
Artem Dergachev 2019-12-06 13:20:36 -08:00
parent d5abaaf140
commit 040c39d50f
2 changed files with 11 additions and 1 deletions

View File

@ -1951,7 +1951,8 @@ RegionStoreManager::getBindingForFieldOrElementCommon(RegionBindingsConstRef B,
if (hasSymbolicIndex)
return UnknownVal();
if (!hasPartialLazyBinding)
// Additionally allow introspection of a block's internal layout.
if (!hasPartialLazyBinding && !isa<BlockDataRegion>(R->getBaseRegion()))
return UndefinedVal();
}

View File

@ -47,6 +47,10 @@ typedef struct __aslmsg *aslmsg;
aslclient asl_open(const char *ident, const char *facility, uint32_t opts);
int asl_log(aslclient asl, aslmsg msg, int level, const char *format, ...) __attribute__((__format__ (__printf__, 4, 5)));
struct Block_layout {
int flags;
};
//===----------------------------------------------------------------------===//
// Begin actual test cases.
//===----------------------------------------------------------------------===//
@ -241,3 +245,8 @@ void call_block_with_fewer_arguments() {
b(); // expected-warning {{Block taking 1 argument is called with fewer (0)}}
}
#endif
int getBlockFlags() {
int x = 0;
return ((struct Block_layout *)^{ (void)x; })->flags; // no-warning
}