]> granicus.if.org Git - clang/commitdiff
[analyzer] NonNullParamChecker: don't freak out about nested transparent_unions.
authorJordan Rose <jordan_rose@apple.com>
Wed, 26 Feb 2014 01:20:19 +0000 (01:20 +0000)
committerJordan Rose <jordan_rose@apple.com>
Wed, 26 Feb 2014 01:20:19 +0000 (01:20 +0000)
For now, just ignore them. Later, we could try looking through LazyCompoundVals,
but we at least shouldn't crash.

<rdar://problem/16153464>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202212 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/NonNullParamChecker.cpp
test/Analysis/nonnull.m

index c9b86399fd96d2f46740bdc4234b12a60d6a07c1..f9a43ad803d0a0e8629b588ac0f8d8ea8c3e38e3 100644 (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))
index a4955ca0a45e41b753975f925111dcd891131e3f..0cea80b536d801977415ecffc6cc275ee4d5e87f 100644 (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}}
+}