forked from OSchip/llvm-project
[analyzer] Fix logical not for pointers with different bit width
Differential Revision: https://reviews.llvm.org/D31029 llvm-svn: 305669
This commit is contained in:
parent
3f1e89380b
commit
9c6e848989
|
@ -180,6 +180,11 @@ public:
|
|||
return getValue(X);
|
||||
}
|
||||
|
||||
inline const llvm::APSInt& getZeroWithTypeSize(QualType T) {
|
||||
assert(T->isScalarType());
|
||||
return getValue(0, Ctx.getTypeSize(T), true);
|
||||
}
|
||||
|
||||
inline const llvm::APSInt& getZeroWithPtrWidth(bool isUnsigned = true) {
|
||||
return getValue(0, Ctx.getTypeSize(Ctx.VoidPtrTy), isUnsigned);
|
||||
}
|
||||
|
|
|
@ -315,6 +315,13 @@ public:
|
|||
return nonloc::ConcreteInt(BasicVals.getTruthValue(b));
|
||||
}
|
||||
|
||||
/// Create NULL pointer, with proper pointer bit-width for given address
|
||||
/// space.
|
||||
/// \param type pointer type.
|
||||
Loc makeNullWithType(QualType type) {
|
||||
return loc::ConcreteInt(BasicVals.getZeroWithTypeSize(type));
|
||||
}
|
||||
|
||||
Loc makeNull() {
|
||||
return loc::ConcreteInt(BasicVals.getZeroWithPtrWidth());
|
||||
}
|
||||
|
|
|
@ -980,10 +980,9 @@ void ExprEngine::VisitUnaryOperator(const UnaryOperator* U, ExplodedNode *Pred,
|
|||
// transfer functions as "0 == E".
|
||||
SVal Result;
|
||||
if (Optional<Loc> LV = V.getAs<Loc>()) {
|
||||
Loc X = svalBuilder.makeNull();
|
||||
Loc X = svalBuilder.makeNullWithType(Ex->getType());
|
||||
Result = evalBinOp(state, BO_EQ, *LV, X, U->getType());
|
||||
}
|
||||
else if (Ex->getType()->isFloatingType()) {
|
||||
} else if (Ex->getType()->isFloatingType()) {
|
||||
// FIXME: handle floating point types.
|
||||
Result = UnknownVal();
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue