forked from OSchip/llvm-project
[analyzer] Fix null tracking for the given test case, by using the proper state and removing redundant code.
llvm-svn: 178933
This commit is contained in:
parent
7924997c36
commit
94b48bdbba
|
@ -926,22 +926,7 @@ bool bugreporter::trackNullOrUndefValue(const ExplodedNode *N,
|
||||||
|
|
||||||
if (R) {
|
if (R) {
|
||||||
// Mark both the variable region and its contents as interesting.
|
// Mark both the variable region and its contents as interesting.
|
||||||
SVal V = state->getRawSVal(loc::MemRegionVal(R));
|
SVal V = LVState->getRawSVal(loc::MemRegionVal(R));
|
||||||
|
|
||||||
// If the value matches the default for the variable region, that
|
|
||||||
// might mean that it's been cleared out of the state. Fall back to
|
|
||||||
// the full argument expression (with casts and such intact).
|
|
||||||
if (IsArg) {
|
|
||||||
bool UseArgValue = V.isUnknownOrUndef() || V.isZeroConstant();
|
|
||||||
if (!UseArgValue) {
|
|
||||||
const SymbolRegionValue *SRV =
|
|
||||||
dyn_cast_or_null<SymbolRegionValue>(V.getAsLocSymbol());
|
|
||||||
if (SRV)
|
|
||||||
UseArgValue = (SRV->getRegion() == R);
|
|
||||||
}
|
|
||||||
if (UseArgValue)
|
|
||||||
V = state->getSValAsScalarOrLoc(S, N->getLocationContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
report.markInteresting(R);
|
report.markInteresting(R);
|
||||||
report.markInteresting(V);
|
report.markInteresting(V);
|
||||||
|
@ -960,11 +945,11 @@ bool bugreporter::trackNullOrUndefValue(const ExplodedNode *N,
|
||||||
report.addVisitor(ConstraintTracker);
|
report.addVisitor(ConstraintTracker);
|
||||||
|
|
||||||
// Add visitor, which will suppress inline defensive checks.
|
// Add visitor, which will suppress inline defensive checks.
|
||||||
if (N->getState()->isNull(V).isConstrainedTrue() &&
|
if (LVState->isNull(V).isConstrainedTrue() &&
|
||||||
EnableNullFPSuppression) {
|
EnableNullFPSuppression) {
|
||||||
BugReporterVisitor *IDCSuppressor =
|
BugReporterVisitor *IDCSuppressor =
|
||||||
new SuppressInlineDefensiveChecksVisitor(V.castAs<DefinedSVal>(),
|
new SuppressInlineDefensiveChecksVisitor(V.castAs<DefinedSVal>(),
|
||||||
N);
|
LVNode);
|
||||||
report.addVisitor(IDCSuppressor);
|
report.addVisitor(IDCSuppressor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,4 +52,22 @@ void radar13224271_caller()
|
||||||
Ty value;
|
Ty value;
|
||||||
radar13224271_callee(getTyVal(), value );
|
radar13224271_callee(getTyVal(), value );
|
||||||
notNullArg(value); // no-warning
|
notNullArg(value); // no-warning
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Foo {
|
||||||
|
int *ptr;
|
||||||
|
Foo(int *p) {
|
||||||
|
*p = 1; // no-warning
|
||||||
|
}
|
||||||
|
};
|
||||||
|
void idc(int *p3) {
|
||||||
|
if (p3)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
int *retNull() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void test(int *p1, int *p2) {
|
||||||
|
idc(p1);
|
||||||
|
Foo f(p1);
|
||||||
}
|
}
|
Loading…
Reference in New Issue