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) {
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue