24 using namespace clang;
28 class SmartPtrModeling :
public Checker<eval::Call> {
29 bool isNullAfterMoveMethod(
const CallEvent &Call)
const;
32 bool evalCall(
const CallEvent &Call, CheckerContext &C)
const;
36 bool SmartPtrModeling::isNullAfterMoveMethod(
const CallEvent &Call)
const {
41 const auto *CD = dyn_cast_or_null<CXXConversionDecl>(Call.getDecl());
42 return CD && CD->getConversionType()->isBooleanType();
45 bool SmartPtrModeling::evalCall(
const CallEvent &Call,
46 CheckerContext &C)
const {
47 if (!isNullAfterMoveMethod(Call))
51 const MemRegion *ThisR =
52 cast<CXXInstanceCall>(&Call)->getCXXThisVal().getAsRegion();
61 State->BindExpr(Call.getOriginExpr(), C.getLocationContext(),
62 C.getSValBuilder().makeZeroVal(Call.getResultType())));
66 void ento::registerSmartPtrModeling(CheckerManager &Mgr) {
67 Mgr.registerChecker<SmartPtrModeling>();
70 bool ento::shouldRegisterSmartPtrModeling(
const LangOptions &LO) {
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
Defines the clang::Expr interface and subclasses for C++ expressions.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isMovedFrom(ProgramStateRef State, const MemRegion *Region)
Returns true if the object is known to have been recently std::moved.
Dataflow Directional Tag Classes.