]> granicus.if.org Git - clang/commitdiff
[analyzer] Don't throw NSNumberObjectConversion warning on object initialization...
authorGeorge Karpenkov <ekarpenkov@apple.com>
Fri, 2 Mar 2018 21:34:24 +0000 (21:34 +0000)
committerGeorge Karpenkov <ekarpenkov@apple.com>
Fri, 2 Mar 2018 21:34:24 +0000 (21:34 +0000)
```
if (NSNumber* x = ...)
```
is a reasonable pattern in objc++, we should not warn on it.

rdar://35152234

Differential Revision: https://reviews.llvm.org/D44044

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

lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp
test/Analysis/number-object-conversion.mm [new file with mode: 0644]

index 40e379cb2efc608b092251f23d1b698eb56488d2..d1749cfdbe2752338cc311dba5213eb0a7ab3671 100644 (file)
@@ -270,8 +270,10 @@ void NumberObjectConversionChecker::checkASTCodeBody(const Decl *D,
                            hasRHS(SuspiciousNumberObjectExprM)));
 
   auto ConversionThroughBranchingM =
-      ifStmt(hasCondition(SuspiciousNumberObjectExprM))
-      .bind("pedantic");
+      ifStmt(allOf(
+          hasCondition(SuspiciousNumberObjectExprM),
+          unless(hasConditionVariableStatement(declStmt())
+      ))).bind("pedantic");
 
   auto ConversionThroughCallM =
       callExpr(hasAnyArgument(allOf(hasType(SuspiciousScalarTypeM),
diff --git a/test/Analysis/number-object-conversion.mm b/test/Analysis/number-object-conversion.mm
new file mode 100644 (file)
index 0000000..32628b2
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -fobjc-arc -w -analyzer-checker=osx.NumberObjectConversion -analyzer-config osx.NumberObjectConversion:Pedantic=true %s -verify
+
+#include "Inputs/system-header-simulator-objc.h"
+
+NSNumber* generateNumber();
+
+// expected-no-diagnostics
+int test_initialization_in_ifstmt() { // Don't warn on initialization in guard.
+  if (NSNumber* number = generateNumber()) { // no-warning
+    return 0;
+  }
+  return 1;
+}