forked from OSchip/llvm-project
[analyzer] TrackConstraintBRVisitor: Do not track unknown values
Summary: - Reviewers: NoQ, Szelethus Reviewed By: NoQ, Szelethus Differential Revision: https://reviews.llvm.org/D66267 llvm-svn: 369604
This commit is contained in:
parent
edb08da450
commit
b73a5711f6
|
@ -1992,9 +1992,10 @@ bool bugreporter::trackExpressionValue(const ExplodedNode *InputNode,
|
||||||
report.markInteresting(V, TKind);
|
report.markInteresting(V, TKind);
|
||||||
report.addVisitor(std::make_unique<UndefOrNullArgVisitor>(R));
|
report.addVisitor(std::make_unique<UndefOrNullArgVisitor>(R));
|
||||||
|
|
||||||
// If the contents are symbolic, find out when they became null.
|
// If the contents are symbolic and null, find out when they became null.
|
||||||
if (V.getAsLocSymbol(/*IncludeBaseRegions*/ true))
|
if (V.getAsLocSymbol(/*IncludeBaseRegions=*/true))
|
||||||
report.addVisitor(std::make_unique<TrackConstraintBRVisitor>(
|
if (LVState->isNull(V).isConstrainedTrue())
|
||||||
|
report.addVisitor(std::make_unique<TrackConstraintBRVisitor>(
|
||||||
V.castAs<DefinedSVal>(), false));
|
V.castAs<DefinedSVal>(), false));
|
||||||
|
|
||||||
// Add visitor, which will suppress inline defensive checks.
|
// Add visitor, which will suppress inline defensive checks.
|
||||||
|
|
|
@ -152,8 +152,7 @@ void evalReferences(const Shape &S) {
|
||||||
void evalNonNullParamNonNullReturnReference(const Shape &S) {
|
void evalNonNullParamNonNullReturnReference(const Shape &S) {
|
||||||
const auto *C = dyn_cast_or_null<Circle>(S);
|
const auto *C = dyn_cast_or_null<Circle>(S);
|
||||||
// expected-note@-1 {{Assuming dynamic cast from 'Shape' to 'Circle' succeeds}}
|
// expected-note@-1 {{Assuming dynamic cast from 'Shape' to 'Circle' succeeds}}
|
||||||
// expected-note@-2 {{Assuming pointer value is null}}
|
// expected-note@-2 {{'C' initialized here}}
|
||||||
// expected-note@-3 {{'C' initialized here}}
|
|
||||||
|
|
||||||
(void)(1 / !(bool)C);
|
(void)(1 / !(bool)C);
|
||||||
// expected-note@-1 {{'C' is non-null}}
|
// expected-note@-1 {{'C' is non-null}}
|
||||||
|
@ -165,8 +164,7 @@ void evalNonNullParamNonNullReturnReference(const Shape &S) {
|
||||||
void evalNonNullParamNonNullReturn(const Shape *S) {
|
void evalNonNullParamNonNullReturn(const Shape *S) {
|
||||||
const auto *C = cast<Circle>(S);
|
const auto *C = cast<Circle>(S);
|
||||||
// expected-note@-1 {{Checked cast from 'Shape' to 'Circle' succeeds}}
|
// expected-note@-1 {{Checked cast from 'Shape' to 'Circle' succeeds}}
|
||||||
// expected-note@-2 {{Assuming pointer value is null}}
|
// expected-note@-2 {{'C' initialized here}}
|
||||||
// expected-note@-3 {{'C' initialized here}}
|
|
||||||
|
|
||||||
(void)(1 / !(bool)C);
|
(void)(1 / !(bool)C);
|
||||||
// expected-note@-1 {{'C' is non-null}}
|
// expected-note@-1 {{'C' is non-null}}
|
||||||
|
@ -178,7 +176,6 @@ void evalNonNullParamNonNullReturn(const Shape *S) {
|
||||||
void evalNonNullParamNullReturn(const Shape *S) {
|
void evalNonNullParamNullReturn(const Shape *S) {
|
||||||
const auto *C = dyn_cast_or_null<Circle>(S);
|
const auto *C = dyn_cast_or_null<Circle>(S);
|
||||||
// expected-note@-1 {{Assuming dynamic cast from 'Shape' to 'Circle' fails}}
|
// 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)) {
|
if (const auto *T = dyn_cast_or_null<Triangle>(S)) {
|
||||||
// expected-note@-1 {{Assuming dynamic cast from 'Shape' to 'Triangle' succeeds}}
|
// 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) {
|
void evalZeroParamNonNullReturnPointer(const Shape *S) {
|
||||||
const auto *C = S->castAs<Circle>();
|
const auto *C = S->castAs<Circle>();
|
||||||
// expected-note@-1 {{Assuming pointer value is null}}
|
// expected-note@-1 {{Checked cast to 'Circle' succeeds}}
|
||||||
// expected-note@-2 {{Checked cast to 'Circle' succeeds}}
|
// expected-note@-2 {{'C' initialized here}}
|
||||||
// expected-note@-3 {{'C' initialized here}}
|
|
||||||
|
|
||||||
(void)(1 / !(bool)C);
|
(void)(1 / !(bool)C);
|
||||||
// expected-note@-1 {{'C' is non-null}}
|
// expected-note@-1 {{'C' is non-null}}
|
||||||
|
|
Loading…
Reference in New Issue