clang: lib/StaticAnalyzer/Checkers/NoOwnershipChangeVisitor.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

15#include "llvm/ADT/SetOperations.h"

16

17using namespace clang;

18using namespace ento;

20

21namespace {

22

23

27

28public:

30 : Sym(Sym), Owners(Owners) {}

31

33 SVal Val) override {

35 Owners.insert(Region);

36 return true;

37 }

38

39 LLVM_DUMP_METHOD void dump() const { dumpToStream(llvm::errs()); }

40 LLVM_DUMP_METHOD void dumpToStream(llvm::raw_ostream &out) const {

41 out << "Owners: {\n";

42 for (const MemRegion *Owner : Owners) {

43 out << " ";

44 Owner->dumpToStream(out);

45 out << ",\n";

46 }

47 out << "}\n";

48 }

49};

50}

51

54

56 OwnershipBindingsHandler Handler{Sym, Ret};

57 State->getStateManager().getStoreManager().iterBindings(State->getStore(),

58 Handler);

59 return Ret;

60}

61

62LLVM_DUMP_METHOD std::string

64 if (const CallExpr *CE = llvm::dyn_cast_or_null(

66 if (const FunctionDecl *FD = CE->getDirectCallee())

67 return FD->getQualifiedNameAsString();

68 return "";

69}

70

73 const Decl *Callee =

76 Callee,

77 CallExitEndN->getState()->getAnalysisManager().getASTContext()))

78 return true;

79

81 return true;

82

83 OwnerSet CurrOwners = getOwnersAtNode(CallEnterN);

84 OwnerSet ExitOwners = getOwnersAtNode(CallExitEndN);

85

86

87

88

89

90

91

92 return !llvm::set_is_subset(ExitOwners, CurrOwners);

93}

94

97

98

99

100

102 for (unsigned I = 0; I < Call.getNumArgs() && I < Parameters.size(); ++I) {

104 if (V.getAsSymbol() == Sym)

106 }

107 return nullptr;

108}

static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)

Represents a point when we begin processing an inlined call.

const Stmt * getCallExpr() const

CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).

Decl - This represents one declaration (or definition), e.g.

Represents a function declaration or definition.

const Decl * getDecl() const

Represents an abstract call to a function or method along a particular path.

const ProgramStateRef & getState() const

const LocationContext * getLocationContext() const

std::optional< T > getLocationAs() const &

ExplodedNode * getFirstPred()

MemRegion - The root abstract class for all memory regions.

static LLVM_DUMP_METHOD std::string getFunctionName(const ExplodedNode *CallEnterN)

virtual bool doesFnIntendToHandleOwnership(const Decl *Callee, ASTContext &ACtx)=0

Heuristically guess whether the callee intended to free the resource.

llvm::SmallPtrSet< const MemRegion *, 8 > OwnerSet

bool wasModifiedInFunction(const ExplodedNode *CallEnterN, const ExplodedNode *CallExitEndN) final

PathDiagnosticPieceRef maybeEmitNoteForParameters(PathSensitiveBugReport &R, const CallEvent &Call, const ExplodedNode *N) final

Consume the information on the non-modifying stack frame in order to either emit a note or not.

virtual PathDiagnosticPieceRef emitNote(const ExplodedNode *N)=0

virtual bool hasResourceStateChanged(ProgramStateRef CallEnterState, ProgramStateRef CallExitEndState)=0

SVal - This represents a symbolic expression, which can be either an L-value or an R-value.

SymbolRef getAsSymbol(bool IncludeBaseRegions=false) const

If this SVal wraps a symbol return that SymbolRef.

virtual bool HandleBinding(StoreManager &SMgr, Store store, const MemRegion *region, SVal val)=0

const void * Store

Store - This opaque type encapsulates an immutable mapping from locations to values.

std::shared_ptr< PathDiagnosticPiece > PathDiagnosticPieceRef

bool Ret(InterpState &S, CodePtr &PC)

The JSON file list parser is used to communicate input to InstallAPI.