From: Csaba Dabis Date: Thu, 22 Aug 2019 00:06:58 +0000 (+0000) Subject: [analyzer] TrackConstraintBRVisitor: Do not track unknown values X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b55c8505d68ca889a022da275aa53143917fea8a;p=clang [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 --- 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(R)); - // If the contents are symbolic, find out when they became null. - if (V.getAsLocSymbol(/*IncludeBaseRegions*/ true)) - report.addVisitor(std::make_unique( + // 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( V.castAs(), 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(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(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(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(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(); - // 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}}