25 using namespace clang;
30 class CXXSelfAssignmentChecker :
public Checker<check::BeginFunction> {
32 CXXSelfAssignmentChecker();
33 void checkBeginFunction(CheckerContext &C)
const;
37 CXXSelfAssignmentChecker::CXXSelfAssignmentChecker() {}
39 void CXXSelfAssignmentChecker::checkBeginFunction(CheckerContext &C)
const {
42 const auto *LCtx = C.getLocationContext();
46 if (!MD->isCopyAssignmentOperator() && !MD->isMoveAssignmentOperator())
48 auto &
State = C.getState();
49 auto &SVB = C.getSValBuilder();
51 State->getSVal(SVB.getCXXThis(MD, LCtx->getStackFrame()));
52 auto Param = SVB.makeLoc(
State->getRegion(MD->getParamDecl(0), LCtx));
53 auto ParamVal =
State->getSVal(Param);
55 C.addTransition(SelfAssignState);
57 C.addTransition(NonSelfAssignState);
60 void ento::registerCXXSelfAssignmentChecker(CheckerManager &Mgr) {
61 Mgr.registerChecker<CXXSelfAssignmentChecker>();
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
Represents a static or instance method of a struct/union/class.
Dataflow Directional Tag Classes.