svn commit: r313291 - in vendor/clang/dist: lib/Sema lib/StaticAnalyzer/Checkers lib/StaticAnalyzer/Core test/Analysis test/SemaObjCXX
Dimitry Andric
dim at FreeBSD.org
Sun Feb 5 19:37:42 UTC 2017
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<ObjCIvarRefExpr>(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<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: 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<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: 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<StaticGlobalSpaceRegion>(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
+
+ at interface InvalidNameInIvarAndPropertyBase
+{
+ at public
+ float _a;
+}
+ at property float _b;
+ at 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'}}
+}
More information about the svn-src-vendor
mailing list