[analyzer] PR43551: Do not dereferce void* in UndefOrNullArgVisitor.

Patch by Kristóf Umann!

Differential Revision: https://reviews.llvm.org/D68591

llvm-svn: 375329
This commit is contained in:
Artem Dergachev
2019-10-19 01:50:46 +00:00
parent ab2cec8b85
commit 4a5df7312e
2 changed files with 30 additions and 9 deletions

View File

@@ -2034,8 +2034,6 @@ bool bugreporter::trackExpressionValue(const ExplodedNode *InputNode,
// Is it a symbolic value?
if (auto L = V.getAs<loc::MemRegionVal>()) {
report.addVisitor(std::make_unique<UndefOrNullArgVisitor>(L->getRegion()));
// FIXME: this is a hack for fixing a later crash when attempting to
// dereference a void* pointer.
// We should not try to dereference pointers at all when we don't care
@@ -2056,10 +2054,14 @@ bool bugreporter::trackExpressionValue(const ExplodedNode *InputNode,
else if (CanDereference)
RVal = LVState->getSVal(L->getRegion());
if (CanDereference)
if (CanDereference) {
report.addVisitor(
std::make_unique<UndefOrNullArgVisitor>(L->getRegion()));
if (auto KV = RVal.getAs<KnownSVal>())
report.addVisitor(std::make_unique<FindLastStoreBRVisitor>(
*KV, L->getRegion(), EnableNullFPSuppression, TKind, SFC));
}
const MemRegion *RegionRVal = RVal.getAsRegion();
if (RegionRVal && isa<SymbolicRegion>(RegionRVal)) {

View File

@@ -1,8 +1,27 @@
// RUN: %clang_analyze_cc1 -analyzer-checker=core %s
a;
b(void **c) { // no-crash
*c = a;
int *d;
b(&d);
*d;
x;
y(void **z) { // no-crash
*z = x;
int *w;
y(&w);
*w;
}
a;
b(*c) {}
e(*c) {
void *d = f();
b(d);
*c = d;
}
void *g() {
e(&a);
return a;
}
j() {
int h;
char i = g();
if (i)
for (; h;)
;
}