78 lines · c
1//===--------------------------------------------------------------*- C++ -*--//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h"10#include "clang/StaticAnalyzer/Core/Checker.h"11#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h"12 13namespace clang {14namespace ento {15 16class NoOwnershipChangeVisitor : public NoStateChangeFuncVisitor {17protected:18 // The symbol whose (lack of) ownership change we are interested in.19 SymbolRef Sym;20 const CheckerBackend &Checker;21 22 LLVM_DUMP_METHOD static std::string23 getFunctionName(const ExplodedNode *CallEnterN);24 25 /// Heuristically guess whether the callee intended to free the resource. This26 /// is done syntactically, because we are trying to argue about alternative27 /// paths of execution, and as a consequence we don't have path-sensitive28 /// information.29 virtual bool doesFnIntendToHandleOwnership(const Decl *Callee,30 ASTContext &ACtx) = 0;31 32 virtual bool hasResourceStateChanged(ProgramStateRef CallEnterState,33 ProgramStateRef CallExitEndState) = 0;34 35 bool wasModifiedInFunction(const ExplodedNode *CallEnterN,36 const ExplodedNode *CallExitEndN) final;37 38 virtual PathDiagnosticPieceRef emitNote(const ExplodedNode *N) = 0;39 40 PathDiagnosticPieceRef maybeEmitNoteForObjCSelf(PathSensitiveBugReport &R,41 const ObjCMethodCall &Call,42 const ExplodedNode *N) final {43 // TODO: Implement.44 return nullptr;45 }46 47 PathDiagnosticPieceRef maybeEmitNoteForCXXThis(PathSensitiveBugReport &R,48 const CXXConstructorCall &Call,49 const ExplodedNode *N) final {50 // TODO: Implement.51 return nullptr;52 }53 54 // Set this to final, effectively dispatch to emitNote.55 PathDiagnosticPieceRef56 maybeEmitNoteForParameters(PathSensitiveBugReport &R, const CallEvent &Call,57 const ExplodedNode *N) final;58 59public:60 using OwnerSet = llvm::SmallPtrSet<const MemRegion *, 8>;61 62private:63 OwnerSet getOwnersAtNode(const ExplodedNode *N);64 65public:66 NoOwnershipChangeVisitor(SymbolRef Sym, const CheckerBackend *Checker)67 : NoStateChangeFuncVisitor(bugreporter::TrackingKind::Thorough), Sym(Sym),68 Checker(*Checker) {}69 70 void Profile(llvm::FoldingSetNodeID &ID) const override {71 static int Tag = 0;72 ID.AddPointer(&Tag);73 ID.AddPointer(Sym);74 }75};76} // namespace ento77} // namespace clang78