clang 24.0.0git
CheckerContext.h
Go to the documentation of this file.
1//== CheckerContext.h - Context info for path-sensitive checkers--*- 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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines CheckerContext that provides contextual info for
10// path-sensitive checkers.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CHECKERCONTEXT_H
15#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CHECKERCONTEXT_H
16
19#include <optional>
20
21namespace clang {
22namespace ento {
23
25 ExprEngine &Eng;
26 /// The current exploded(symbolic execution) graph node.
27 ExplodedNode *Pred;
28 /// The flag is true if the (state of the execution) has been modified
29 /// by the checker using this context. For example, a new transition has been
30 /// added or a bug report issued.
31 bool Changed;
32 /// The tagged location, which is used to generate all new nodes.
33 const ProgramPoint Location;
34 /// At the end of the checker evaluation, the analysis will continue from the
35 /// nodes in this set. When the checker adds a transition, freshly created
36 /// non-sink nodes are added to the `Frontier` and the node that was the
37 /// source of the transition is unconditionally removed from the `Frontier`
38 /// (it is superseded, even if the node creation fails or produces a sink).
39 /// At the beginning, the `Frontier` usually contains `Pred`.
40 ExplodedNodeSet &Frontier;
41
42public:
43 /// If we are post visiting a call, this flag will be set if the
44 /// call was inlined. In all other cases it will be false.
45 const bool wasInlined;
46
48 const ProgramPoint &Loc, bool WasInlined = false)
49 : Eng(Eng), Pred(Pred), Changed(false), Location(Loc), Frontier(Dst),
50 wasInlined(WasInlined) {
51 assert(Pred->getState() &&
52 "We should not call the checkers on an empty state.");
53 assert(Loc.getTag() && "The ProgramPoint associated with CheckerContext "
54 "must be tagged with the active checker.");
55 }
56
58 return Eng.getAnalysisManager();
59 }
61 return Eng.getAnalysisManager();
62 }
63
65 return Eng.getConstraintManager();
66 }
68 return Eng.getConstraintManager();
69 }
70
72 return Eng.getStoreManager();
73 }
74 const StoreManager &getStoreManager() const { return Eng.getStoreManager(); }
75
76 /// Returns the previous node in the exploded graph, which includes
77 /// the state of the program before the checker ran. Note, checkers should
78 /// not retain the node in their state since the nodes might get invalidated.
79 ExplodedNode *getPredecessor() const { return Pred; }
80 const ProgramPoint getLocation() const { return Location; }
81 const ProgramStateRef &getState() const { return Pred->getState(); }
82
83 /// Check if the checker changed the state of the execution; ex: added
84 /// a new transition or a bug report.
85 bool isDifferent() const { return Changed; }
86
87 /// Returns the number of times the current block has been visited
88 /// along the analyzed path.
89 unsigned blockCount() const { return Eng.getNumVisitedCurrent(); }
90
92 return Eng.getContext();
93 }
94
95 const ASTContext &getASTContext() const { return Eng.getContext(); }
96
97 const LangOptions &getLangOpts() const {
98 return Eng.getContext().getLangOpts();
99 }
100
101 const StackFrame *getStackFrame() const { return Pred->getStackFrame(); }
102
103 /// Iterates over the current stack frame and all of its ancestors.
104 llvm::iterator_range<StackFrame::parent_iterator> stackframes() const {
106 }
107
108 /// Return true if the current StackFrame has no caller context.
109 bool inTopFrame() const { return getStackFrame()->inTopFrame(); }
110
112 return Eng.getBugReporter();
113 }
114 const BugReporter &getBugReporter() const { return Eng.getBugReporter(); }
115
121 }
122
126 }
127
129 return Eng.getSValBuilder();
130 }
131 const SValBuilder &getSValBuilder() const { return Eng.getSValBuilder(); }
132
138 }
139
141 return Eng.getStateManager();
142 }
144 return Eng.getStateManager();
145 }
146
150
151 /// Get the blockID.
152 unsigned getBlockID() const { return Eng.getCurrBlock()->getBlockID(); }
153
154 /// If the given node corresponds to a PostStore program point,
155 /// retrieve the location region as it was uttered in the code.
156 ///
157 /// This utility can be useful for generating extensive diagnostics, for
158 /// example, for finding variables that the given symbol was assigned to.
160 ProgramPoint L = N->getLocation();
161 if (std::optional<PostStore> PSL = L.getAs<PostStore>())
162 return reinterpret_cast<const MemRegion*>(PSL->getLocationValue());
163 return nullptr;
164 }
165
166 /// Get the value of arbitrary expressions at this point in the path.
167 SVal getSVal(const Expr *E) const { return Pred->getSVal(E); }
168
169 ConstCFGElementRef getCFGElementRef() const { return Eng.getCFGElementRef(); }
170
171 /// Returns true if the value of \p E is greater than or equal to \p
172 /// Val under unsigned comparison.
173 bool isGreaterOrEqual(const Expr *E, unsigned long long Val);
174
175 /// Returns true if the value of \p E is negative.
176 bool isNegative(const Expr *E);
177
178 /// Generates a new transition in the program state graph
179 /// (ExplodedGraph). Uses the default CheckerContext predecessor node.
180 ///
181 /// @param State The state of the generated node. If not specified, the state
182 /// will not be changed, but the new node will have the checker's tag.
183 /// @param Tag The tag is used to uniquely identify the creation site. If no
184 /// tag is specified, a default tag, unique to the given checker,
185 /// will be used. Tags are used to prevent states generated at
186 /// different sites from caching out.
187 /// NOTE: If the State is unchanged and the Tag is nullptr, this may return a
188 /// node which is not tagged (instead of using the default tag corresponding
189 /// to the active checker). This is arguably a bug and should be fixed.
191 const ProgramPointTag *Tag = nullptr) {
192 return addTransitionImpl(State ? State : getState(), false, nullptr, Tag);
193 }
194
195 /// Generates a new transition with the given predecessor.
196 /// Allows checkers to generate a chain of nodes.
197 ///
198 /// @param State The state of the generated node.
199 /// @param Pred The transition will be generated from the specified Pred node
200 /// to the newly generated node.
201 /// @param Tag The tag to uniquely identify the creation site.
202 /// NOTE: If the State is unchanged and the Tag is nullptr, this may return a
203 /// node which is not tagged (instead of using the default tag corresponding
204 /// to the active checker). This is arguably a bug and should be fixed.
206 const ProgramPointTag *Tag = nullptr) {
207 return addTransitionImpl(State, false, Pred, Tag);
208 }
209
210 /// Generate a sink node. Generating a sink stops exploration of the
211 /// given path. To create a sink node for the purpose of reporting an error,
212 /// checkers should use generateErrorNode() instead.
214 const ProgramPointTag *Tag = nullptr) {
215 return addTransitionImpl(State ? State : getState(), true, Pred, Tag);
216 }
217
218 /// Add a sink node to the current path of execution, halting analysis.
219 void addSink(ProgramStateRef State = nullptr,
220 const ProgramPointTag *Tag = nullptr) {
221 if (!State)
222 State = getState();
224 }
225
226 /// Generate a transition to a node that will be used to report
227 /// an error. This node will be a sink. That is, it will stop exploration of
228 /// the given path.
229 ///
230 /// @param State The state of the generated node.
231 /// @param Tag The tag to uniquely identify the creation site. If null,
232 /// the default tag for the checker will be used.
234 const ProgramPointTag *Tag = nullptr) {
235 return generateSink(State, Pred,
236 (Tag ? Tag : Location.getTag()));
237 }
238
239 /// Generate a transition to a node that will be used to report
240 /// an error. This node will be a sink. That is, it will stop exploration of
241 /// the given path.
242 ///
243 /// @param State The state of the generated node.
244 /// @param Pred The transition will be generated from the specified Pred node
245 /// to the newly generated node.
246 /// @param Tag The tag to uniquely identify the creation site. If null,
247 /// the default tag for the checker will be used.
249 ExplodedNode *Pred,
250 const ProgramPointTag *Tag = nullptr) {
251 return generateSink(State, Pred,
252 (Tag ? Tag : Location.getTag()));
253 }
254
255 /// Generate a transition to a node that will be used to report
256 /// an error. This node will not be a sink. That is, exploration will
257 /// continue along this path.
258 ///
259 /// @param State The state of the generated node.
260 /// @param Tag The tag to uniquely identify the creation site. If null,
261 /// the default tag for the checker will be used.
264 const ProgramPointTag *Tag = nullptr) {
265 return addTransition(State, (Tag ? Tag : Location.getTag()));
266 }
267
268 /// Generate a transition to a node that will be used to report
269 /// an error. This node will not be a sink. That is, exploration will
270 /// continue along this path.
271 ///
272 /// @param State The state of the generated node.
273 /// @param Pred The transition will be generated from the specified Pred node
274 /// to the newly generated node.
275 /// @param Tag The tag to uniquely identify the creation site. If null,
276 /// the default tag for the checker will be used.
279 ExplodedNode *Pred,
280 const ProgramPointTag *Tag = nullptr) {
281 return addTransition(State, Pred, (Tag ? Tag : Location.getTag()));
282 }
283
284 /// Emit the diagnostics report.
285 void emitReport(std::unique_ptr<BugReport> R) {
286 Changed = true;
287 Eng.getBugReporter().emitReport(std::move(R));
288 }
289
290 /// Produce a program point tag that displays an additional path note
291 /// to the user. This is a lightweight alternative to the
292 /// BugReporterVisitor mechanism: instead of visiting the bug report
293 /// node-by-node to restore the sequence of events that led to discovering
294 /// a bug, you can add notes as you add your transitions.
295 ///
296 /// @param Cb Callback with 'BugReporterContext &, BugReport &' parameters.
297 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
298 /// to omit the note from the report if it would make the displayed
299 /// bug path significantly shorter.
300 LLVM_ATTRIBUTE_RETURNS_NONNULL
301 const NoteTag *getNoteTag(NoteTag::Callback &&Cb, bool IsPrunable = false) {
302 return Eng.getDataTags().make<NoteTag>(std::move(Cb), IsPrunable);
303 }
304
305 /// A shorthand version of getNoteTag that doesn't require you to accept
306 /// the 'BugReporterContext' argument when you don't need it.
307 ///
308 /// @param Cb Callback only with 'BugReport &' parameter.
309 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
310 /// to omit the note from the report if it would make the displayed
311 /// bug path significantly shorter.
312 const NoteTag
314 bool IsPrunable = false) {
315 return getNoteTag(
316 [Cb](BugReporterContext &,
317 PathSensitiveBugReport &BR) { return Cb(BR); },
318 IsPrunable);
319 }
320
321 /// A shorthand version of getNoteTag that doesn't require you to accept
322 /// the arguments when you don't need it.
323 ///
324 /// @param Cb Callback without parameters.
325 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
326 /// to omit the note from the report if it would make the displayed
327 /// bug path significantly shorter.
328 const NoteTag *getNoteTag(std::function<std::string()> &&Cb,
329 bool IsPrunable = false) {
330 return getNoteTag([Cb](BugReporterContext &,
331 PathSensitiveBugReport &) { return Cb(); },
332 IsPrunable);
333 }
334
335 /// A shorthand version of getNoteTag that accepts a plain note.
336 ///
337 /// @param Note The note.
338 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
339 /// to omit the note from the report if it would make the displayed
340 /// bug path significantly shorter.
341 const NoteTag *getNoteTag(StringRef Note, bool IsPrunable = false) {
342 return getNoteTag(
343 [Note = std::string(Note)](BugReporterContext &,
344 PathSensitiveBugReport &) { return Note; },
345 IsPrunable);
346 }
347
348 /// A shorthand version of getNoteTag that accepts a lambda with stream for
349 /// note.
350 ///
351 /// @param Cb Callback with 'BugReport &' and 'llvm::raw_ostream &'.
352 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
353 /// to omit the note from the report if it would make the displayed
354 /// bug path significantly shorter.
356 std::function<void(PathSensitiveBugReport &BR, llvm::raw_ostream &OS)> &&Cb,
357 bool IsPrunable = false) {
358 return getNoteTag(
359 [Cb](PathSensitiveBugReport &BR) -> std::string {
361 llvm::raw_svector_ostream OS(Str);
362 Cb(BR, OS);
363 return std::string(OS.str());
364 },
365 IsPrunable);
366 }
367
368 /// Returns the word that should be used to refer to the declaration
369 /// in the report.
370 StringRef getDeclDescription(const Decl *D);
371
372 /// Get the declaration of the called function (path-sensitive).
373 const FunctionDecl *getCalleeDecl(const CallExpr *CE) const;
374
375 /// Get the name of the called function (path-sensitive).
376 StringRef getCalleeName(const FunctionDecl *FunDecl) const;
377
378 /// Get the identifier of the called function (path-sensitive).
380 const FunctionDecl *FunDecl = getCalleeDecl(CE);
381 if (FunDecl)
382 return FunDecl->getIdentifier();
383 else
384 return nullptr;
385 }
386
387 /// Get the name of the called function (path-sensitive).
388 StringRef getCalleeName(const CallExpr *CE) const {
389 const FunctionDecl *FunDecl = getCalleeDecl(CE);
390 return getCalleeName(FunDecl);
391 }
392
393 /// Returns true if the given function is an externally-visible function in
394 /// the top-level namespace, such as \c malloc.
395 ///
396 /// If a name is provided, the function must additionally match the given
397 /// name.
398 ///
399 /// Note that this also accepts functions from the \c std namespace (because
400 /// headers like <cstdlib> declare them there) and does not check if the
401 /// function is declared as 'extern "C"' or if it uses C++ name mangling.
402 static bool isCLibraryFunction(const FunctionDecl *FD,
403 StringRef Name = StringRef());
404
405 /// In builds that use source hardening (-D_FORTIFY_SOURCE), many standard
406 /// functions are implemented as macros that expand to calls of hardened
407 /// functions that take additional arguments compared to the "usual"
408 /// variant and perform additional input validation. For example, a `memcpy`
409 /// call may expand to `__memcpy_chk()` or `__builtin___memcpy_chk()`.
410 ///
411 /// This method returns true if `FD` declares a fortified variant of the
412 /// standard library function `Name`.
413 ///
414 /// NOTE: This method relies on heuristics; extend it if you need to handle a
415 /// hardened variant that's not yet covered by it.
416 static bool isHardenedVariantOf(const FunctionDecl *FD, StringRef Name);
417
418 /// Depending on whether the location corresponds to a macro, return
419 /// either the macro name or the token spelling.
420 ///
421 /// This could be useful when checkers' logic depends on whether a function
422 /// is called with a given macro argument. For example:
423 /// s = socket(AF_INET,..)
424 /// If AF_INET is a macro, the result should be treated as a source of taint.
425 ///
426 /// \sa clang::Lexer::getSpelling(), clang::Lexer::getImmediateMacroName().
428
429private:
430 ExplodedNode *addTransitionImpl(ProgramStateRef State,
431 bool MarkAsSink,
432 ExplodedNode *P = nullptr,
433 const ProgramPointTag *Tag = nullptr) {
434 // The analyzer may stop exploring if it sees a state it has previously
435 // visited ("cache out"). The early return here is a defensive check to
436 // prevent accidental caching out by checker API clients. Unless there is a
437 // tag or the client checker has requested that the generated node be
438 // marked as a sink, we assume that a client requesting a transition to a
439 // state that is the same as the predecessor state has made a mistake. We
440 // return the predecessor rather than cache out.
441 //
442 // TODO: We could potentially change the return to an assertion to alert
443 // clients to their mistake, but several checkers (including
444 // DereferenceChecker, CallAndMessageChecker, and DynamicTypePropagation)
445 // rely upon the defensive behavior and would need to be updated.
446 if (!State || (State == Pred->getState() && !Tag && !MarkAsSink))
447 return Pred;
448
449 Changed = true;
450 const ProgramPoint &LocalLoc = (Tag ? Location.withTag(Tag) : Location);
451 if (!P)
452 P = Pred;
453
454 Frontier.erase(P);
455 ExplodedNode *N =
456 Eng.getCoreEngine().makeNode(LocalLoc, State, P, MarkAsSink);
457
458 Frontier.insert(N);
459
460 return N;
461 }
462};
463
464} // end GR namespace
465
466} // end clang namespace
467
468#endif
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
AnalysisDeclContext contains the context data for the function, method or block under analysis.
const StackFrame * getStackFrame(const StackFrame *ParentSF, const void *Data, const Expr *E, const CFGBlock *Blk, unsigned BlockCount, unsigned Index)
Obtain a context of the call stack using its parent context.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2987
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
This represents one expression.
Definition Expr.h:113
Represents a function declaration or definition.
Definition Decl.h:2059
One of these records is kept for each identifier that is lexed.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:296
Represents a program point after a store evaluation.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
ProgramPoints can be "tagged" as representing points specific to a given analysis entity.
std::optional< T > getAs() const
Convert to the specified ProgramPoint type, returning std::nullopt if this ProgramPoint is not of the...
Encodes a location in the source.
This class handles loading and caching of source files into memory.
It represents a stack frame of the call stack.
LLVM_ATTRIBUTE_RETURNS_NONNULL AnalysisDeclContext * getAnalysisDeclContext() const
llvm::iterator_range< parent_iterator > parentsIncludingSelf() const
Iterates over this frame followed by all of its ancestors.
BugReporter is a utility class for generating PathDiagnostics for analysis.
Preprocessor & getPreprocessor()
const SourceManager & getSourceManager()
ExplodedNode * generateErrorNode(ProgramStateRef State, ExplodedNode *Pred, const ProgramPointTag *Tag=nullptr)
Generate a transition to a node that will be used to report an error.
const IdentifierInfo * getCalleeIdentifier(const CallExpr *CE) const
Get the identifier of the called function (path-sensitive).
CheckerContext(ExprEngine &Eng, ExplodedNode *Pred, ExplodedNodeSet &Dst, const ProgramPoint &Loc, bool WasInlined=false)
static const MemRegion * getLocationRegionIfPostStore(const ExplodedNode *N)
If the given node corresponds to a PostStore program point, retrieve the location region as it was ut...
SymbolManager & getSymbolManager()
StringRef getDeclDescription(const Decl *D)
Returns the word that should be used to refer to the declaration in the report.
Preprocessor & getPreprocessor()
SVal getSVal(const Expr *E) const
Get the value of arbitrary expressions at this point in the path.
unsigned blockCount() const
Returns the number of times the current block has been visited along the analyzed path.
ExplodedNode * generateSink(ProgramStateRef State, ExplodedNode *Pred, const ProgramPointTag *Tag=nullptr)
Generate a sink node.
const SourceManager & getSourceManager()
const NoteTag * getNoteTag(std::function< std::string()> &&Cb, bool IsPrunable=false)
A shorthand version of getNoteTag that doesn't require you to accept the arguments when you don't nee...
llvm::iterator_range< StackFrame::parent_iterator > stackframes() const
Iterates over the current stack frame and all of its ancestors.
StringRef getCalleeName(const FunctionDecl *FunDecl) const
Get the name of the called function (path-sensitive).
const NoteTag * getNoteTag(StringRef Note, bool IsPrunable=false)
A shorthand version of getNoteTag that accepts a plain note.
const SourceManager & getSourceManager() const
std::string getMacroNameOrSpelling(SourceLocation &Loc)
Depending on whether the location corresponds to a macro, return either the macro name or the token s...
StringRef getCalleeName(const CallExpr *CE) const
Get the name of the called function (path-sensitive).
const ProgramStateRef & getState() const
ExplodedNode * addTransition(ProgramStateRef State=nullptr, const ProgramPointTag *Tag=nullptr)
Generates a new transition in the program state graph (ExplodedGraph).
ConstraintManager & getConstraintManager()
ExplodedNode * addTransition(ProgramStateRef State, ExplodedNode *Pred, const ProgramPointTag *Tag=nullptr)
Generates a new transition with the given predecessor.
bool isNegative(const Expr *E)
Returns true if the value of E is negative.
const Preprocessor & getPreprocessor() const
const SValBuilder & getSValBuilder() const
AnalysisDeclContext * getCurrentAnalysisDeclContext() const
ExplodedNode * getPredecessor() const
Returns the previous node in the exploded graph, which includes the state of the program before the c...
bool isGreaterOrEqual(const Expr *E, unsigned long long Val)
Returns true if the value of E is greater than or equal to Val under unsigned comparison.
const ProgramPoint getLocation() const
static bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name=StringRef())
Returns true if the given function is an externally-visible function in the top-level namespace,...
ExplodedNode * generateNonFatalErrorNode(ProgramStateRef State=nullptr, const ProgramPointTag *Tag=nullptr)
Generate a transition to a node that will be used to report an error.
LLVM_ATTRIBUTE_RETURNS_NONNULL const NoteTag * getNoteTag(NoteTag::Callback &&Cb, bool IsPrunable=false)
Produce a program point tag that displays an additional path note to the user.
const ASTContext & getASTContext() const
ConstCFGElementRef getCFGElementRef() const
AnalysisManager & getAnalysisManager()
ExplodedNode * generateErrorNode(ProgramStateRef State=nullptr, const ProgramPointTag *Tag=nullptr)
Generate a transition to a node that will be used to report an error.
const FunctionDecl * getCalleeDecl(const CallExpr *CE) const
Get the declaration of the called function (path-sensitive).
void addSink(ProgramStateRef State=nullptr, const ProgramPointTag *Tag=nullptr)
Add a sink node to the current path of execution, halting analysis.
const SymbolManager & getSymbolManager() const
const NoteTag * getNoteTag(std::function< void(PathSensitiveBugReport &BR, llvm::raw_ostream &OS)> &&Cb, bool IsPrunable=false)
A shorthand version of getNoteTag that accepts a lambda with stream for note.
ProgramStateManager & getStateManager()
const ProgramStateManager & getStateManager() const
const StoreManager & getStoreManager() const
const LangOptions & getLangOpts() const
const BugReporter & getBugReporter() const
bool inTopFrame() const
Return true if the current StackFrame has no caller context.
const ConstraintManager & getConstraintManager() const
const bool wasInlined
If we are post visiting a call, this flag will be set if the call was inlined.
ExplodedNode * generateNonFatalErrorNode(ProgramStateRef State, ExplodedNode *Pred, const ProgramPointTag *Tag=nullptr)
Generate a transition to a node that will be used to report an error.
StoreManager & getStoreManager()
const NoteTag * getNoteTag(std::function< std::string(PathSensitiveBugReport &)> &&Cb, bool IsPrunable=false)
A shorthand version of getNoteTag that doesn't require you to accept the 'BugReporterContext' argumen...
const AnalysisManager & getAnalysisManager() const
static bool isHardenedVariantOf(const FunctionDecl *FD, StringRef Name)
In builds that use source hardening (-D_FORTIFY_SOURCE), many standard functions are implemented as m...
void emitReport(std::unique_ptr< BugReport > R)
Emit the diagnostics report.
bool isDifferent() const
Check if the checker changed the state of the execution; ex: added a new transition or a bug report.
const StackFrame * getStackFrame() const
unsigned getBlockID() const
Get the blockID.
ExplodedNode * makeNode(const ProgramPoint &Loc, ProgramStateRef State, ExplodedNode *Pred, bool MarkAsSink=false) const
ExplodedNodeSet is a set of ExplodedNode * elements with the invariant that its elements cannot be nu...
void insert(ExplodedNode *N)
bool erase(ExplodedNode *N)
const ProgramStateRef & getState() const
ProgramPoint getLocation() const
getLocation - Returns the edge associated with the given node.
const CoreEngine & getCoreEngine() const
Definition ExprEngine.h:472
MemRegion - The root abstract class for all memory regions.
Definition MemRegion.h:97
The tag upon which the TagVisitor reacts.
std::function< std::string(BugReporterContext &, PathSensitiveBugReport &)> Callback
SymbolManager & getSymbolManager()
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
Definition SVals.h:57
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
Top level wrappers for InstallAPI frontend operations.
CFGBlock::ConstCFGElementRef ConstCFGElementRef
Definition CFG.h:1248
int const char * function
Definition c++config.h:31
#define false
Definition stdbool.h:26