mirror of
https://github.com/intel/llvm.git
synced 2026-01-13 19:08:21 +08:00
[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:
@@ -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)) {
|
||||
|
||||
@@ -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;)
|
||||
;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user