[analyzer] Fix crash in NullabilityChecker calling block with too few arguments
authorDevin Coughlin <dcoughlin@apple.com>
Mon, 14 Nov 2016 22:46:02 +0000 (22:46 +0000)
committerDevin Coughlin <dcoughlin@apple.com>
Mon, 14 Nov 2016 22:46:02 +0000 (22:46 +0000)
Fix a crash when checking parameter nullability on a block invocation
with fewer arguments than the block declaration requires.

rdar://problem/29237566

llvm-svn: 286901

clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp
clang/test/Analysis/nullability.c [new file with mode: 0644]

index d642356cb40a050c2e76649efa23bd3638fb4462..eaeed5913b87f539f46e637427dde847c9b76858 100644 (file)
@@ -679,9 +679,10 @@ void NullabilityChecker::checkPreCall(const CallEvent &Call,
     if (Param->isParameterPack())
       break;
 
-    const Expr *ArgExpr = nullptr;
-    if (Idx < Call.getNumArgs())
-      ArgExpr = Call.getArgExpr(Idx);
+    if (Idx >= Call.getNumArgs())
+      break;
+
+    const Expr *ArgExpr = Call.getArgExpr(Idx);
     auto ArgSVal = Call.getArgSVal(Idx++).getAs<DefinedOrUnknownSVal>();
     if (!ArgSVal)
       continue;
diff --git a/clang/test/Analysis/nullability.c b/clang/test/Analysis/nullability.c
new file mode 100644 (file)
index 0000000..e165879
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fblocks -analyze -analyzer-checker=core,nullability -verify %s
+
+void it_takes_two(int a, int b);
+void function_pointer_arity_mismatch() {
+  void(*fptr)() = it_takes_two;
+  fptr(1); // no-crash expected-warning {{Function taking 2 arguments is called with less (1)}}
+}
+
+void block_arity_mismatch() {
+  void(^b)() = ^(int a, int b) { }; // no-crash
+  b(1);
+}