]> granicus.if.org Git - clang/commitdiff
[analyzer] Teach NonNullParamChecker about 'nonnull' attributes on parameters.
authorTed Kremenek <kremenek@apple.com>
Fri, 17 Jan 2014 07:15:35 +0000 (07:15 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 17 Jan 2014 07:15:35 +0000 (07:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199473 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 273a7a38824ad8399317de55ce15eb15ca23edd1..bde902707ebecde59722c022699a3204dc902195 100644 (file)
@@ -43,7 +43,7 @@ public:
 } // end anonymous namespace
 
 void NonNullParamChecker::checkPreCall(const CallEvent &Call,
-                                      CheckerContext &C) const {
+                                       CheckerContext &C) const {
   const Decl *FD = Call.getDecl();
   if (!FD)
     return;
@@ -66,6 +66,12 @@ void NonNullParamChecker::checkPreCall(const CallEvent &Call,
     }
 
     bool haveAttrNonNull = Att && Att->isNonNull(idx);
+    if (!haveAttrNonNull) {
+      // Check if the parameter is also marked 'nonnull'.
+      ArrayRef<ParmVarDecl*> parms = Call.parameters();
+      if (idx < parms.size())
+        haveAttrNonNull = parms[idx]->hasAttr<NonNullAttr>();
+    }
 
     if (!haveRefTypeParam && !haveAttrNonNull)
       continue;
index c32a7f780ece0afddb3c523ad9499f3eccc6f962..a4955ca0a45e41b753975f925111dcd891131e3f 100644 (file)
@@ -2,6 +2,8 @@
 
 @interface MyObject
 - (void)takePointer:(void *)ptr __attribute__((nonnull(1)));
+- (void)takePointerArg:(void *)__attribute__((nonnull)) ptr;
+
 @end
 
 void testNonNullMethod(int *p, MyObject *obj) {
@@ -21,3 +23,10 @@ void testSubclass(int *p, Subclass *obj) {
     return;
   [obj takePointer:p]; // expected-warning{{nonnull}}
 }
+
+void testSubclassArg(int *p, Subclass *obj) {
+  if (p)
+    return;
+  [obj takePointerArg:p]; // expected-warning{{nonnull}}
+}
+