[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:
Anna Zaks 2013-04-05 23:50:11 +00:00
parent 7924997c36
commit 94b48bdbba
2 changed files with 21 additions and 18 deletions

View File

@ -926,22 +926,7 @@ bool bugreporter::trackNullOrUndefValue(const ExplodedNode *N,
if (R) {
// Mark both the variable region and its contents as interesting.
SVal V = state->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());
}
SVal V = LVState->getRawSVal(loc::MemRegionVal(R));
report.markInteresting(R);
report.markInteresting(V);
@ -960,11 +945,11 @@ bool bugreporter::trackNullOrUndefValue(const ExplodedNode *N,
report.addVisitor(ConstraintTracker);
// Add visitor, which will suppress inline defensive checks.
if (N->getState()->isNull(V).isConstrainedTrue() &&
if (LVState->isNull(V).isConstrainedTrue() &&
EnableNullFPSuppression) {
BugReporterVisitor *IDCSuppressor =
new SuppressInlineDefensiveChecksVisitor(V.castAs<DefinedSVal>(),
N);
LVNode);
report.addVisitor(IDCSuppressor);
}
}

View File

@ -52,4 +52,22 @@ void radar13224271_caller()
Ty value;
radar13224271_callee(getTyVal(), value );
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);
}