29class CXXSelfAssignmentChecker :
public Checker<check::BeginFunction> {
31 CXXSelfAssignmentChecker();
32 void checkBeginFunction(CheckerContext &
C)
const;
36CXXSelfAssignmentChecker::CXXSelfAssignmentChecker() {}
38void CXXSelfAssignmentChecker::checkBeginFunction(CheckerContext &
C)
const {
41 const auto *SF =
C.getStackFrame();
42 const auto *MD = dyn_cast<CXXMethodDecl>(SF->getDecl());
45 if (!MD->isCopyAssignmentOperator() && !MD->isMoveAssignmentOperator())
47 auto &State =
C.getState();
48 auto &SVB =
C.getSValBuilder();
49 auto ThisVal = State->getSVal(SVB.getCXXThis(MD, SF));
50 auto Param = SVB.makeLoc(State->getRegion(MD->getParamDecl(0), SF));
51 auto ParamVal = State->getSVal(Param);
54 const NoteTag *SelfAssignTag =
55 C.getNoteTag([MD](PathSensitiveBugReport &BR) -> std::string {
57 llvm::raw_svector_ostream
Out(Msg);
58 Out <<
"Assuming " << MD->getParamDecl(0)->getName() <<
" == *this";
59 return std::string(
Out.str());
61 C.addTransition(SelfAssignState, SelfAssignTag);
63 ProgramStateRef NonSelfAssignState = State->bindLoc(Param, ParamVal, SF);
64 const NoteTag *NonSelfAssignTag =
65 C.getNoteTag([MD](PathSensitiveBugReport &BR) -> std::string {
67 llvm::raw_svector_ostream
Out(Msg);
68 Out <<
"Assuming " << MD->getParamDecl(0)->getName() <<
" != *this";
69 return std::string(
Out.str());
71 C.addTransition(NonSelfAssignState, NonSelfAssignTag);
74void ento::registerCXXSelfAssignmentChecker(CheckerManager &Mgr) {
78bool ento::shouldRegisterCXXSelfAssignmentChecker(
const CheckerManager &mgr) {
CHECKER * registerChecker(AT &&...Args)
Register a single-part checker (derived from Checker): construct its singleton instance,...
Simple checker classes that implement one frontend (i.e.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
The JSON file list parser is used to communicate input to InstallAPI.