From 8dad0e6cce24238911caf3cf053af23f42b3d155 Mon Sep 17 00:00:00 2001 From: George Karpenkov Date: Fri, 2 Mar 2018 21:34:24 +0000 Subject: [PATCH] [analyzer] Don't throw NSNumberObjectConversion warning on object initialization in if-expression ``` if (NSNumber* x = ...) ``` is a reasonable pattern in objc++, we should not warn on it. rdar://35152234 Differential Revision: https://reviews.llvm.org/D44044 llvm-svn: 326619 --- .../Checkers/NumberObjectConversionChecker.cpp | 6 ++++-- clang/test/Analysis/number-object-conversion.mm | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 clang/test/Analysis/number-object-conversion.mm diff --git a/clang/lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp index 40e379cb2efc..d1749cfdbe27 100644 --- a/clang/lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp @@ -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/clang/test/Analysis/number-object-conversion.mm b/clang/test/Analysis/number-object-conversion.mm new file mode 100644 index 000000000000..32628b2e8f20 --- /dev/null +++ b/clang/test/Analysis/number-object-conversion.mm @@ -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; +}