[analyzer] NonNullParamChecker: don't freak out about nested transparent_unions.

For now, just ignore them. Later, we could try looking through LazyCompoundVals,
but we at least shouldn't crash.

<rdar://problem/16153464>

llvm-svn: 202212
This commit is contained in:
Jordan Rose 2014-02-26 01:20:19 +00:00
parent 7eb0b2c181
commit e359d0168f
2 changed files with 49 additions and 2 deletions

View File

@ -104,7 +104,9 @@ void NonNullParamChecker::checkPreCall(const CallEvent &Call,
V = *CSV_I;
DV = V.getAs<DefinedSVal>();
assert(++CSV_I == CSV->end());
if (!DV)
// FIXME: Handle (some_union){ some_other_union_val }, which turns into
// a LazyCompoundVal inside a CompoundVal.
if (!V.getAs<Loc>())
continue;
// Retrieve the corresponding expression.
if (const CompoundLiteralExpr *CE = dyn_cast<CompoundLiteralExpr>(ArgE))

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s
// RUN: %clang_cc1 -analyze -analyzer-checker=core -w -verify %s
@interface MyObject
- (void)takePointer:(void *)ptr __attribute__((nonnull(1)));
@ -30,3 +30,48 @@ void testSubclassArg(int *p, Subclass *obj) {
[obj takePointerArg:p]; // expected-warning{{nonnull}}
}
union rdar16153464_const_cp_t {
const struct rdar16153464_cczp *zp;
const struct rdar16153464_cczp_prime *prime;
} __attribute__((transparent_union));
struct rdar16153464_header {
union rdar16153464_const_cp_t cp;
unsigned char pad[16 - sizeof(union rdar16153464_const_cp_t *)];
} __attribute__((aligned(16)));
struct rdar16153464_full_ctx {
struct rdar16153464_header hdr;
} __attribute__((aligned(16)));
struct rdar16153464_pub_ctx {
struct rdar16153464_header hdr;
} __attribute__((aligned(16)));
union rdar16153464_full_ctx_t {
struct rdar16153464_full_ctx *_full;
struct rdar16153464_header *hdr;
struct rdar16153464_body *body;
struct rdar16153464_public *pub;
} __attribute__((transparent_union));
union rdar16153464_pub_ctx_t {
struct rdar16153464_pub_ctx *_pub;
struct rdar16153464_full_ctx *_full;
struct rdar16153464_header *hdr;
struct rdar16153464_body *body;
struct rdar16153464_public *pub;
union rdar16153464_full_ctx_t innert;
} __attribute__((transparent_union));
int rdar16153464(union rdar16153464_full_ctx_t inner)
{
extern void rdar16153464_check(union rdar16153464_pub_ctx_t outer) __attribute((nonnull(1)));
rdar16153464_check((union rdar16153464_pub_ctx_t){ .innert = inner }); // no-warning
rdar16153464_check(inner); // no-warning
rdar16153464_check(0); // expected-warning{{nonnull}}
}