From owner-svn-src-all@freebsd.org Sun Feb 5 19:37:42 2017 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B2CF3CD2215; Sun, 5 Feb 2017 19:37:42 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 753E216E9; Sun, 5 Feb 2017 19:37:42 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v15Jbfjd038842; Sun, 5 Feb 2017 19:37:41 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v15Jbe9m038834; Sun, 5 Feb 2017 19:37:40 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201702051937.v15Jbe9m038834@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Sun, 5 Feb 2017 19:37:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r313291 - in vendor/clang/dist: lib/Sema lib/StaticAnalyzer/Checkers lib/StaticAnalyzer/Core test/Analysis test/SemaObjCXX X-SVN-Group: vendor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 05 Feb 2017 19:37:42 -0000 Author: dim Date: Sun Feb 5 19:37:40 2017 New Revision: 313291 URL: https://svnweb.freebsd.org/changeset/base/313291 Log: Vendor import of clang release_40 branch r294123: https://llvm.org/svn/llvm-project/cfe/branches/release_40@294123 Added: vendor/clang/dist/test/Analysis/null-deref-static.m Modified: vendor/clang/dist/lib/Sema/SemaExprCXX.cpp vendor/clang/dist/lib/Sema/TreeTransform.h vendor/clang/dist/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp vendor/clang/dist/lib/StaticAnalyzer/Core/MemRegion.cpp vendor/clang/dist/lib/StaticAnalyzer/Core/RegionStore.cpp vendor/clang/dist/test/Analysis/dispatch-once.m vendor/clang/dist/test/SemaObjCXX/typo-correction.mm Modified: vendor/clang/dist/lib/Sema/SemaExprCXX.cpp ============================================================================== --- vendor/clang/dist/lib/Sema/SemaExprCXX.cpp Sun Feb 5 19:37:35 2017 (r313290) +++ vendor/clang/dist/lib/Sema/SemaExprCXX.cpp Sun Feb 5 19:37:40 2017 (r313291) @@ -7190,14 +7190,6 @@ public: ExprResult TransformBlockExpr(BlockExpr *E) { return Owned(E); } - ExprResult TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { - return Owned(E); - } - - ExprResult TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { - return Owned(E); - } - ExprResult Transform(Expr *E) { ExprResult Res; while (true) { Modified: vendor/clang/dist/lib/Sema/TreeTransform.h ============================================================================== --- vendor/clang/dist/lib/Sema/TreeTransform.h Sun Feb 5 19:37:35 2017 (r313290) +++ vendor/clang/dist/lib/Sema/TreeTransform.h Sun Feb 5 19:37:40 2017 (r313291) @@ -2932,16 +2932,17 @@ public: ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, SourceLocation IvarLoc, bool IsArrow, bool IsFreeIvar) { - // FIXME: We lose track of the IsFreeIvar bit. CXXScopeSpec SS; DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); - return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), - /*FIXME:*/IvarLoc, IsArrow, - SS, SourceLocation(), - /*FirstQualifierInScope=*/nullptr, - NameInfo, - /*TemplateArgs=*/nullptr, - /*S=*/nullptr); + ExprResult Result = getSema().BuildMemberReferenceExpr( + BaseArg, BaseArg->getType(), + /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), + /*FirstQualifierInScope=*/nullptr, NameInfo, + /*TemplateArgs=*/nullptr, + /*S=*/nullptr); + if (IsFreeIvar && Result.isUsable()) + cast(Result.get())->setIsFreeIvar(IsFreeIvar); + return Result; } /// \brief Build a new Objective-C property reference expression. Modified: vendor/clang/dist/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp ============================================================================== --- vendor/clang/dist/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp Sun Feb 5 19:37:35 2017 (r313290) +++ vendor/clang/dist/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp Sun Feb 5 19:37:40 2017 (r313291) @@ -94,11 +94,18 @@ void MacOSXAPIChecker::CheckDispatchOnce bool SuggestStatic = false; os << "Call to '" << FName << "' uses"; if (const VarRegion *VR = dyn_cast(RB)) { + const VarDecl *VD = VR->getDecl(); + // FIXME: These should have correct memory space and thus should be filtered + // out earlier. This branch only fires when we're looking from a block, + // which we analyze as a top-level declaration, onto a static local + // in a function that contains the block. + if (VD->isStaticLocal()) + return; // We filtered out globals earlier, so it must be a local variable // or a block variable which is under UnknownSpaceRegion. if (VR != R) os << " memory within"; - if (VR->getDecl()->hasAttr()) + if (VD->hasAttr()) os << " the block variable '"; else os << " the local variable '"; Modified: vendor/clang/dist/lib/StaticAnalyzer/Core/MemRegion.cpp ============================================================================== --- vendor/clang/dist/lib/StaticAnalyzer/Core/MemRegion.cpp Sun Feb 5 19:37:35 2017 (r313290) +++ vendor/clang/dist/lib/StaticAnalyzer/Core/MemRegion.cpp Sun Feb 5 19:37:40 2017 (r313291) @@ -816,9 +816,11 @@ const VarRegion* MemRegionManager::getVa const StackFrameContext *STC = V.get(); - if (!STC) + if (!STC) { + // FIXME: Assign a more sensible memory space to static locals + // we see from within blocks that we analyze as top-level declarations. sReg = getUnknownRegion(); - else { + } else { if (D->hasLocalStorage()) { sReg = isa(D) || isa(D) ? static_cast(getStackArgumentsRegion(STC)) Modified: vendor/clang/dist/lib/StaticAnalyzer/Core/RegionStore.cpp ============================================================================== --- vendor/clang/dist/lib/StaticAnalyzer/Core/RegionStore.cpp Sun Feb 5 19:37:35 2017 (r313290) +++ vendor/clang/dist/lib/StaticAnalyzer/Core/RegionStore.cpp Sun Feb 5 19:37:40 2017 (r313291) @@ -1849,6 +1849,8 @@ SVal RegionStoreManager::getBindingForVa // Function-scoped static variables are default-initialized to 0; if they // have an initializer, it would have been processed by now. + // FIXME: This is only true when we're starting analysis from main(). + // We're losing a lot of coverage here. if (isa(MS)) return svalBuilder.makeZeroVal(T); Modified: vendor/clang/dist/test/Analysis/dispatch-once.m ============================================================================== --- vendor/clang/dist/test/Analysis/dispatch-once.m Sun Feb 5 19:37:35 2017 (r313290) +++ vendor/clang/dist/test/Analysis/dispatch-once.m Sun Feb 5 19:37:40 2017 (r313291) @@ -107,3 +107,10 @@ void test_block_var_from_outside_block() }; dispatch_once(&once, ^{}); // expected-warning{{Call to 'dispatch_once' uses the block variable 'once' for the predicate value.}} } + +void test_static_var_from_outside_block() { + static dispatch_once_t once; + ^{ + dispatch_once(&once, ^{}); // no-warning + }; +} Added: vendor/clang/dist/test/Analysis/null-deref-static.m ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ vendor/clang/dist/test/Analysis/null-deref-static.m Sun Feb 5 19:37:40 2017 (r313291) @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -w -fblocks -analyze -analyzer-checker=core,deadcode,alpha.core,debug.ExprInspection -verify %s + +void *malloc(unsigned long); +void clang_analyzer_warnIfReached(); + +void test_static_from_block() { + static int *x; + ^{ + *x; // no-warning + }; +} + +void test_static_within_block() { + ^{ + static int *x; + *x; // expected-warning{{Dereference of null pointer}} + }; +} + +void test_static_control_flow(int y) { + static int *x; + if (x) { + // FIXME: Should be reachable. + clang_analyzer_warnIfReached(); // no-warning + } + if (y) { + // We are not sure if this branch is possible, because the developer + // may argue that function is always called with y == 1 for the first time. + // In this case, we can only advise the developer to add assertions + // for suppressing such path. + *x; // expected-warning{{Dereference of null pointer}} + } else { + x = malloc(1); + } +} Modified: vendor/clang/dist/test/SemaObjCXX/typo-correction.mm ============================================================================== --- vendor/clang/dist/test/SemaObjCXX/typo-correction.mm Sun Feb 5 19:37:35 2017 (r313290) +++ vendor/clang/dist/test/SemaObjCXX/typo-correction.mm Sun Feb 5 19:37:40 2017 (r313291) @@ -21,3 +21,18 @@ public: self.m_prop2 = new ClassB(m_prop1); // expected-error {{use of undeclared identifier 'm_prop1'; did you mean '_m_prop1'?}} } @end + +// rdar://30310772 + +@interface InvalidNameInIvarAndPropertyBase +{ +@public + float _a; +} +@property float _b; +@end + +void invalidNameInIvarAndPropertyBase() { + float a = ((InvalidNameInIvarAndPropertyBase*)node)->_a; // expected-error {{use of undeclared identifier 'node'}} + float b = ((InvalidNameInIvarAndPropertyBase*)node)._b; // expected-error {{use of undeclared identifier 'node'}} +}