Fine with merging. Thank you! Anna. > On Feb 1, 2017, at 11:00 AM, Hans Wennborg <h...@chromium.org> wrote: > > If Anna is Ok with it, I'm fine with merging. > > Thanks, > Hans > > On Wed, Feb 1, 2017 at 10:29 AM, Artem Dergachev <noqnoq...@gmail.com> wrote: >> Hans, >> >> This is a fixed and tested version of the previously-merged-and-reverted >> r292800, do we still have time to land this into 4.0? >> >> Thanks, >> Artem. >> >> >> On 1/25/17 1:21 PM, Artem Dergachev via cfe-commits wrote: >>> >>> Author: dergachev >>> Date: Wed Jan 25 04:21:45 2017 >>> New Revision: 293043 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=293043&view=rev >>> Log: >>> [analyzer] Fix MacOSXAPIChecker fp with static locals seen from nested >>> blocks. >>> >>> This is an attempt to avoid new false positives caused by the reverted >>> r292800, >>> however the scope of the fix is significantly reduced - some variables are >>> still >>> in incorrect memory spaces. >>> >>> Relevant test cases added. >>> >>> rdar://problem/30105546 >>> rdar://problem/30156693 >>> Differential revision: https://reviews.llvm.org/D28946 >>> >>> Added: >>> cfe/trunk/test/Analysis/null-deref-static.m >>> Modified: >>> cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp >>> cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp >>> cfe/trunk/lib/StaticAnalyzer/Core/RegionStore.cpp >>> cfe/trunk/test/Analysis/dispatch-once.m >>> >>> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp?rev=293043&r1=293042&r2=293043&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp (original) >>> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp Wed Jan 25 >>> 04:21:45 2017 >>> @@ -94,11 +94,18 @@ void MacOSXAPIChecker::CheckDispatchOnce >>> bool SuggestStatic = false; >>> os << "Call to '" << FName << "' uses"; >>> if (const VarRegion *VR = dyn_cast<VarRegion>(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<BlocksAttr>()) >>> + if (VD->hasAttr<BlocksAttr>()) >>> os << " the block variable '"; >>> else >>> os << " the local variable '"; >>> >>> Modified: cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp?rev=293043&r1=293042&r2=293043&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp (original) >>> +++ cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp Wed Jan 25 04:21:45 >>> 2017 >>> @@ -816,9 +816,11 @@ const VarRegion* MemRegionManager::getVa >>> const StackFrameContext *STC = V.get<const StackFrameContext*>(); >>> - 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<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D) >>> ? static_cast<const >>> MemRegion*>(getStackArgumentsRegion(STC)) >>> >>> Modified: cfe/trunk/lib/StaticAnalyzer/Core/RegionStore.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/RegionStore.cpp?rev=293043&r1=293042&r2=293043&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/StaticAnalyzer/Core/RegionStore.cpp (original) >>> +++ cfe/trunk/lib/StaticAnalyzer/Core/RegionStore.cpp Wed Jan 25 04:21:45 >>> 2017 >>> @@ -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<StaticGlobalSpaceRegion>(MS)) >>> return svalBuilder.makeZeroVal(T); >>> >>> Modified: cfe/trunk/test/Analysis/dispatch-once.m >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/dispatch-once.m?rev=293043&r1=293042&r2=293043&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/test/Analysis/dispatch-once.m (original) >>> +++ cfe/trunk/test/Analysis/dispatch-once.m Wed Jan 25 04:21:45 2017 >>> @@ -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: cfe/trunk/test/Analysis/null-deref-static.m >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/null-deref-static.m?rev=293043&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/test/Analysis/null-deref-static.m (added) >>> +++ cfe/trunk/test/Analysis/null-deref-static.m Wed Jan 25 04:21:45 2017 >>> @@ -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); >>> + } >>> +} >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits