summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCsaba Dabis <dabis.csaba98@gmail.com>2019-08-22 00:06:58 +0000
committerCsaba Dabis <dabis.csaba98@gmail.com>2019-08-22 00:06:58 +0000
commitb55c8505d68ca889a022da275aa53143917fea8a (patch)
tree1825edb69ad659da8cc239bb9231729be2410e77
parentbc226679135d1105b97157c2b740e6c4a8b70060 (diff)
downloadclang-b55c8505d68ca889a022da275aa53143917fea8a.tar.gz
[analyzer] TrackConstraintBRVisitor: Do not track unknown values
Summary: - Reviewers: NoQ, Szelethus Reviewed By: NoQ, Szelethus Differential Revision: https://reviews.llvm.org/D66267 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@369604 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/StaticAnalyzer/Core/BugReporterVisitors.cpp7
-rw-r--r--test/Analysis/cast-value.cpp12
2 files changed, 8 insertions, 11 deletions
diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
index 973580ed00..20af02842c 100644
--- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
+++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
@@ -1992,9 +1992,10 @@ bool bugreporter::trackExpressionValue(const ExplodedNode *InputNode,
report.markInteresting(V, TKind);
report.addVisitor(std::make_unique<UndefOrNullArgVisitor>(R));
- // If the contents are symbolic, find out when they became null.
- if (V.getAsLocSymbol(/*IncludeBaseRegions*/ true))
- report.addVisitor(std::make_unique<TrackConstraintBRVisitor>(
+ // If the contents are symbolic and null, find out when they became null.
+ if (V.getAsLocSymbol(/*IncludeBaseRegions=*/true))
+ if (LVState->isNull(V).isConstrainedTrue())
+ report.addVisitor(std::make_unique<TrackConstraintBRVisitor>(
V.castAs<DefinedSVal>(), false));
// Add visitor, which will suppress inline defensive checks.
diff --git a/test/Analysis/cast-value.cpp b/test/Analysis/cast-value.cpp
index a67ffe2c08..fcf145365e 100644
--- a/test/Analysis/cast-value.cpp
+++ b/test/Analysis/cast-value.cpp
@@ -152,8 +152,7 @@ void evalReferences(const Shape &S) {
void evalNonNullParamNonNullReturnReference(const Shape &S) {
const auto *C = dyn_cast_or_null<Circle>(S);
// expected-note@-1 {{Assuming dynamic cast from 'Shape' to 'Circle' succeeds}}
- // expected-note@-2 {{Assuming pointer value is null}}
- // expected-note@-3 {{'C' initialized here}}
+ // expected-note@-2 {{'C' initialized here}}
(void)(1 / !(bool)C);
// expected-note@-1 {{'C' is non-null}}
@@ -165,8 +164,7 @@ void evalNonNullParamNonNullReturnReference(const Shape &S) {
void evalNonNullParamNonNullReturn(const Shape *S) {
const auto *C = cast<Circle>(S);
// expected-note@-1 {{Checked cast from 'Shape' to 'Circle' succeeds}}
- // expected-note@-2 {{Assuming pointer value is null}}
- // expected-note@-3 {{'C' initialized here}}
+ // expected-note@-2 {{'C' initialized here}}
(void)(1 / !(bool)C);
// expected-note@-1 {{'C' is non-null}}
@@ -178,7 +176,6 @@ void evalNonNullParamNonNullReturn(const Shape *S) {
void evalNonNullParamNullReturn(const Shape *S) {
const auto *C = dyn_cast_or_null<Circle>(S);
// expected-note@-1 {{Assuming dynamic cast from 'Shape' to 'Circle' fails}}
- // expected-note@-2 {{Assuming pointer value is null}}
if (const auto *T = dyn_cast_or_null<Triangle>(S)) {
// expected-note@-1 {{Assuming dynamic cast from 'Shape' to 'Triangle' succeeds}}
@@ -207,9 +204,8 @@ void evalNullParamNullReturn(const Shape *S) {
void evalZeroParamNonNullReturnPointer(const Shape *S) {
const auto *C = S->castAs<Circle>();
- // expected-note@-1 {{Assuming pointer value is null}}
- // expected-note@-2 {{Checked cast to 'Circle' succeeds}}
- // expected-note@-3 {{'C' initialized here}}
+ // expected-note@-1 {{Checked cast to 'Circle' succeeds}}
+ // expected-note@-2 {{'C' initialized here}}
(void)(1 / !(bool)C);
// expected-note@-1 {{'C' is non-null}}