summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2018-11-30 04:26:17 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2018-11-30 04:26:17 +0000
commitc0769073848512c410099fa8bf6897f36c24af0f (patch)
tree581d9f95d24a3530f40d29e5877273495a85882a
parente2b5438a730abb5d2728db12aa711f4ed1bb6846 (diff)
downloadbcm5719-llvm-c0769073848512c410099fa8bf6897f36c24af0f.tar.gz
bcm5719-llvm-c0769073848512c410099fa8bf6897f36c24af0f.zip
Revert r344580 "[analyzer] Nullability: Don't detect post factum violation..."
Fails under ASan! llvm-svn: 347956
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp22
-rw-r--r--clang/test/Analysis/nullability-arc.mm39
-rw-r--r--clang/test/Analysis/nullability.mm35
3 files changed, 8 insertions, 88 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp
index 38c694d5a25..eae0a974ce8 100644
--- a/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp
@@ -329,8 +329,8 @@ NullabilityChecker::NullabilityBugVisitor::VisitNode(const ExplodedNode *N,
nullptr);
}
-/// Returns true when the value stored at the given location has been
-/// constrained to null after being passed through an object of nonnnull type.
+/// Returns true when the value stored at the given location is null
+/// and the passed in type is nonnnull.
static bool checkValueAtLValForInvariantViolation(ProgramStateRef State,
SVal LV, QualType T) {
if (getNullabilityAnnotation(T) != Nullability::Nonnull)
@@ -340,14 +340,9 @@ static bool checkValueAtLValForInvariantViolation(ProgramStateRef State,
if (!RegionVal)
return false;
- // If the value was constrained to null *after* it was passed through that
- // location, it could not have been a concrete pointer *when* it was passed.
- // In that case we would have handled the situation when the value was
- // bound to that location, by emitting (or not emitting) a report.
- // Therefore we are only interested in symbolic regions that can be either
- // null or non-null depending on the value of their respective symbol.
- auto StoredVal = State->getSVal(*RegionVal).getAs<loc::MemRegionVal>();
- if (!StoredVal || !isa<SymbolicRegion>(StoredVal->getRegion()))
+ auto StoredVal =
+ State->getSVal(RegionVal->getRegion()).getAs<DefinedOrUnknownSVal>();
+ if (!StoredVal)
return false;
if (getNullConstraint(*StoredVal, State) == NullConstraint::IsNull)
@@ -1175,15 +1170,10 @@ void NullabilityChecker::printState(raw_ostream &Out, ProgramStateRef State,
NullabilityMapTy B = State->get<NullabilityMap>();
- if (State->get<InvariantViolated>())
- Out << Sep << NL
- << "Nullability invariant was violated, warnings suppressed." << NL;
-
if (B.isEmpty())
return;
- if (!State->get<InvariantViolated>())
- Out << Sep << NL;
+ Out << Sep << NL;
for (NullabilityMapTy::iterator I = B.begin(), E = B.end(); I != E; ++I) {
Out << I->first << " : ";
diff --git a/clang/test/Analysis/nullability-arc.mm b/clang/test/Analysis/nullability-arc.mm
deleted file mode 100644
index 5c68dda42ed..00000000000
--- a/clang/test/Analysis/nullability-arc.mm
+++ /dev/null
@@ -1,39 +0,0 @@
-// RUN: %clang_analyze_cc1 -w -analyzer-checker=core,nullability\
-// RUN: -analyzer-output=text -verify %s
-// RUN: %clang_analyze_cc1 -w -analyzer-checker=core,nullability\
-// RUN: -analyzer-output=text -verify %s -fobjc-arc
-
-#if !__has_feature(objc_arc)
-// expected-no-diagnostics
-#endif
-
-
-#define nil ((id)0)
-
-@interface Param
-@end
-
-@interface Base
-- (void)foo:(Param *_Nonnull)param;
-@end
-
-@interface Derived : Base
-@end
-
-@implementation Derived
-- (void)foo:(Param *)param {
- // FIXME: Why do we not emit the warning under ARC?
- [super foo:param];
-#if __has_feature(objc_arc)
- // expected-warning@-2{{nil passed to a callee that requires a non-null 1st parameter}}
- // expected-note@-3 {{nil passed to a callee that requires a non-null 1st parameter}}
-#endif
-
- [self foo:nil];
-#if __has_feature(objc_arc)
- // expected-note@-2{{Calling 'foo:'}}
- // expected-note@-3{{Passing nil object reference via 1st parameter 'param'}}
-#endif
-}
-@end
-
diff --git a/clang/test/Analysis/nullability.mm b/clang/test/Analysis/nullability.mm
index c3f27e4d22a..2278efff3e9 100644
--- a/clang/test/Analysis/nullability.mm
+++ b/clang/test/Analysis/nullability.mm
@@ -1,36 +1,5 @@
-// RUN: %clang_analyze_cc1 -fblocks -verify %s -analyzer-checker=core \
-// RUN: -analyzer-checker=nullability.NullPassedToNonnull \
-// RUN: -analyzer-checker=nullability.NullReturnedFromNonnull \
-// RUN: -analyzer-checker=nullability.NullablePassedToNonnull \
-// RUN: -analyzer-checker=nullability.NullableReturnedFromNonnull \
-// RUN: -analyzer-checker=nullability.NullableDereferenced \
-// RUN: -DNOSYSTEMHEADERS=0
-
-// RUN: %clang_analyze_cc1 -fblocks -verify %s -analyzer-checker=core \
-// RUN: -analyzer-checker=nullability.NullPassedToNonnull \
-// RUN: -analyzer-checker=nullability.NullReturnedFromNonnull \
-// RUN: -analyzer-checker=nullability.NullablePassedToNonnull \
-// RUN: -analyzer-checker=nullability.NullableReturnedFromNonnull \
-// RUN: -analyzer-checker=nullability.NullableDereferenced \
-// RUN: -DNOSYSTEMHEADERS=1 \
-// RUN: -analyzer-config nullability:NoDiagnoseCallsToSystemHeaders=true
-
-// RUN: %clang_analyze_cc1 -fblocks -verify %s -analyzer-checker=core\
-// RUN: -analyzer-checker=nullability.NullPassedToNonnull\
-// RUN: -analyzer-checker=nullability.NullReturnedFromNonnull\
-// RUN: -analyzer-checker=nullability.NullablePassedToNonnull\
-// RUN: -analyzer-checker=nullability.NullableReturnedFromNonnull\
-// RUN: -analyzer-checker=nullability.NullableDereferenced\
-// RUN: -DNOSYSTEMHEADERS=0 -fobjc-arc
-
-// RUN: %clang_analyze_cc1 -fblocks -verify %s -analyzer-checker=core\
-// RUN: -analyzer-checker=nullability.NullPassedToNonnull\
-// RUN: -analyzer-checker=nullability.NullReturnedFromNonnull\
-// RUN: -analyzer-checker=nullability.NullablePassedToNonnull\
-// RUN: -analyzer-checker=nullability.NullableReturnedFromNonnull\
-// RUN: -analyzer-checker=nullability.NullableDereferenced\
-// RUN: -DNOSYSTEMHEADERS=1 -fobjc-arc\
-// RUN: -analyzer-config nullability:NoDiagnoseCallsToSystemHeaders=true
+// RUN: %clang_analyze_cc1 -fblocks -analyzer-checker=core,nullability.NullPassedToNonnull,nullability.NullReturnedFromNonnull,nullability.NullablePassedToNonnull,nullability.NullableReturnedFromNonnull,nullability.NullableDereferenced -DNOSYSTEMHEADERS=0 -verify %s
+// RUN: %clang_analyze_cc1 -fblocks -analyzer-checker=core,nullability.NullPassedToNonnull,nullability.NullReturnedFromNonnull,nullability.NullablePassedToNonnull,nullability.NullableReturnedFromNonnull,nullability.NullableDereferenced -analyzer-config nullability:NoDiagnoseCallsToSystemHeaders=true -DNOSYSTEMHEADERS=1 -verify %s
#include "Inputs/system-header-simulator-for-nullability.h"
OpenPOWER on IntegriCloud