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 NodeBuilder &NB;
35
36public:
37 /// If we are post visiting a call, this flag will be set if the
38 /// call was inlined. In all other cases it will be false.
39 const bool wasInlined;
40
42 ExprEngine &eng,
43 ExplodedNode *pred,
44 const ProgramPoint &loc,
45 bool wasInlined = false)
46 : Eng(eng),
47 Pred(pred),
48 Changed(false),
49 Location(loc),
50 NB(builder),
52 assert(Pred->getState() &&
53 "We should not call the checkers on an empty state.");
54 assert(loc.getTag() && "The ProgramPoint associated with CheckerContext "
55 "must be tagged with the active checker.");
56 }
57
59 return Eng.getAnalysisManager();
60 }
62 return Eng.getAnalysisManager();
63 }
64
66 return Eng.getConstraintManager();
67 }
69 return Eng.getConstraintManager();
70 }
71
73 return Eng.getStoreManager();
74 }
75 const StoreManager &getStoreManager() const { return Eng.getStoreManager(); }
76
77 /// Returns the previous node in the exploded graph, which includes
78 /// the state of the program before the checker ran. Note, checkers should
79 /// not retain the node in their state since the nodes might get invalidated.
80 ExplodedNode *getPredecessor() { return Pred; }
81 const ExplodedNode *getPredecessor() const { return Pred; }
82 const ProgramPoint getLocation() const { return Location; }
83 const ProgramStateRef &getState() const { return Pred->getState(); }
84
85 /// Check if the checker changed the state of the execution; ex: added
86 /// a new transition or a bug report.
87 bool isDifferent() { return Changed; }
88 bool isDifferent() const { return Changed; }
89
90 /// Returns the number of times the current block has been visited
91 /// along the analyzed path.
92 unsigned blockCount() const { return Eng.getNumVisitedCurrent(); }
93
95 return Eng.getContext();
96 }
97
98 const ASTContext &getASTContext() const { return Eng.getContext(); }
99
100 const LangOptions &getLangOpts() const {
101 return Eng.getContext().getLangOpts();
102 }
103
104 const StackFrame *getStackFrame() const { return Pred->getStackFrame(); }
105
106 /// Iterates over the current stack frame and all of its ancestors.
107 llvm::iterator_range<StackFrame::parent_iterator> stackframes() const {
109 }
110
111 /// Return true if the current StackFrame has no caller context.
112 bool inTopFrame() const { return getStackFrame()->inTopFrame(); }
113
115 return Eng.getBugReporter();
116 }
117 const BugReporter &getBugReporter() const { return Eng.getBugReporter(); }
118
124 }
125
129 }
130
132 return Eng.getSValBuilder();
133 }
134 const SValBuilder &getSValBuilder() const { return Eng.getSValBuilder(); }
135
141 }
142
144 return Eng.getStateManager();
145 }
147 return Eng.getStateManager();
148 }
149
153
154 /// Get the blockID.
155 unsigned getBlockID() const { return Eng.getCurrBlock()->getBlockID(); }
156
157 /// If the given node corresponds to a PostStore program point,
158 /// retrieve the location region as it was uttered in the code.
159 ///
160 /// This utility can be useful for generating extensive diagnostics, for
161 /// example, for finding variables that the given symbol was assigned to.
163 ProgramPoint L = N->getLocation();
164 if (std::optional<PostStore> PSL = L.getAs<PostStore>())
165 return reinterpret_cast<const MemRegion*>(PSL->getLocationValue());
166 return nullptr;
167 }
168
169 /// Get the value of arbitrary expressions at this point in the path.
170 SVal getSVal(const Expr *E) const { return Pred->getSVal(E); }
171
172 ConstCFGElementRef getCFGElementRef() const { return Eng.getCFGElementRef(); }
173
174 /// Returns true if the value of \p E is greater than or equal to \p
175 /// Val under unsigned comparison.
176 bool isGreaterOrEqual(const Expr *E, unsigned long long Val);
177
178 /// Returns true if the value of \p E is negative.
179 bool isNegative(const Expr *E);
180
181 /// Generates a new transition in the program state graph
182 /// (ExplodedGraph). Uses the default CheckerContext predecessor node.
183 ///
184 /// @param State The state of the generated node. If not specified, the state
185 /// will not be changed, but the new node will have the checker's tag.
186 /// @param Tag The tag is used to uniquely identify the creation site. If no
187 /// tag is specified, a default tag, unique to the given checker,
188 /// will be used. Tags are used to prevent states generated at
189 /// different sites from caching out.
190 /// NOTE: If the State is unchanged and the Tag is nullptr, this may return a
191 /// node which is not tagged (instead of using the default tag corresponding
192 /// to the active checker). This is arguably a bug and should be fixed.
194 const ProgramPointTag *Tag = nullptr) {
195 return addTransitionImpl(State ? State : getState(), false, nullptr, Tag);
196 }
197
198 /// Generates a new transition with the given predecessor.
199 /// Allows checkers to generate a chain of nodes.
200 ///
201 /// @param State The state of the generated node.
202 /// @param Pred The transition will be generated from the specified Pred node
203 /// to the newly generated node.
204 /// @param Tag The tag to uniquely identify the creation site.
205 /// NOTE: If the State is unchanged and the Tag is nullptr, this may return a
206 /// node which is not tagged (instead of using the default tag corresponding
207 /// to the active checker). This is arguably a bug and should be fixed.
209 const ProgramPointTag *Tag = nullptr) {
210 return addTransitionImpl(State, false, Pred, Tag);
211 }
212
213 /// Generate a sink node. Generating a sink stops exploration of the
214 /// given path. To create a sink node for the purpose of reporting an error,
215 /// checkers should use generateErrorNode() instead.
217 const ProgramPointTag *Tag = nullptr) {
218 return addTransitionImpl(State ? State : getState(), true, Pred, Tag);
219 }
220
221 /// Add a sink node to the current path of execution, halting analysis.
222 void addSink(ProgramStateRef State = nullptr,
223 const ProgramPointTag *Tag = nullptr) {
224 if (!State)
225 State = getState();
226 addTransition(State, generateSink(State, getPredecessor()));
227 }
228
229 /// Generate a transition to a node that will be used to report
230 /// an error. This node will be a sink. That is, it will stop exploration of
231 /// the given path.
232 ///
233 /// @param State The state of the generated node.
234 /// @param Tag The tag to uniquely identify the creation site. If null,
235 /// the default tag for the checker will be used.
237 const ProgramPointTag *Tag = nullptr) {
238 return generateSink(State, Pred,
239 (Tag ? Tag : Location.getTag()));
240 }
241
242 /// Generate a transition to a node that will be used to report
243 /// an error. This node will be a sink. That is, it will stop exploration of
244 /// the given path.
245 ///
246 /// @param State The state of the generated node.
247 /// @param Pred The transition will be generated from the specified Pred node
248 /// to the newly generated node.
249 /// @param Tag The tag to uniquely identify the creation site. If null,
250 /// the default tag for the checker will be used.
252 ExplodedNode *Pred,
253 const ProgramPointTag *Tag = nullptr) {
254 return generateSink(State, Pred,
255 (Tag ? Tag : Location.getTag()));
256 }
257
258 /// Generate a transition to a node that will be used to report
259 /// an error. This node will not be a sink. That is, exploration will
260 /// continue along this path.
261 ///
262 /// @param State The state of the generated node.
263 /// @param Tag The tag to uniquely identify the creation site. If null,
264 /// the default tag for the checker will be used.
267 const ProgramPointTag *Tag = nullptr) {
268 return addTransition(State, (Tag ? Tag : Location.getTag()));
269 }
270
271 /// Generate a transition to a node that will be used to report
272 /// an error. This node will not be a sink. That is, exploration will
273 /// continue along this path.
274 ///
275 /// @param State The state of the generated node.
276 /// @param Pred The transition will be generated from the specified Pred node
277 /// to the newly generated node.
278 /// @param Tag The tag to uniquely identify the creation site. If null,
279 /// the default tag for the checker will be used.
282 ExplodedNode *Pred,
283 const ProgramPointTag *Tag = nullptr) {
284 return addTransition(State, Pred, (Tag ? Tag : Location.getTag()));
285 }
286
287 /// Emit the diagnostics report.
288 void emitReport(std::unique_ptr<BugReport> R) {
289 Changed = true;
290 Eng.getBugReporter().emitReport(std::move(R));
291 }
292
293 /// Produce a program point tag that displays an additional path note
294 /// to the user. This is a lightweight alternative to the
295 /// BugReporterVisitor mechanism: instead of visiting the bug report
296 /// node-by-node to restore the sequence of events that led to discovering
297 /// a bug, you can add notes as you add your transitions.
298 ///
299 /// @param Cb Callback with 'BugReporterContext &, BugReport &' parameters.
300 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
301 /// to omit the note from the report if it would make the displayed
302 /// bug path significantly shorter.
303 LLVM_ATTRIBUTE_RETURNS_NONNULL
304 const NoteTag *getNoteTag(NoteTag::Callback &&Cb, bool IsPrunable = false) {
305 return Eng.getDataTags().make<NoteTag>(std::move(Cb), IsPrunable);
306 }
307
308 /// A shorthand version of getNoteTag that doesn't require you to accept
309 /// the 'BugReporterContext' argument when you don't need it.
310 ///
311 /// @param Cb Callback only with 'BugReport &' parameter.
312 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
313 /// to omit the note from the report if it would make the displayed
314 /// bug path significantly shorter.
315 const NoteTag
317 bool IsPrunable = false) {
318 return getNoteTag(
319 [Cb](BugReporterContext &,
320 PathSensitiveBugReport &BR) { return Cb(BR); },
321 IsPrunable);
322 }
323
324 /// A shorthand version of getNoteTag that doesn't require you to accept
325 /// the arguments when you don't need it.
326 ///
327 /// @param Cb Callback without parameters.
328 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
329 /// to omit the note from the report if it would make the displayed
330 /// bug path significantly shorter.
331 const NoteTag *getNoteTag(std::function<std::string()> &&Cb,
332 bool IsPrunable = false) {
333 return getNoteTag([Cb](BugReporterContext &,
334 PathSensitiveBugReport &) { return Cb(); },
335 IsPrunable);
336 }
337
338 /// A shorthand version of getNoteTag that accepts a plain note.
339 ///
340 /// @param Note The note.
341 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
342 /// to omit the note from the report if it would make the displayed
343 /// bug path significantly shorter.
344 const NoteTag *getNoteTag(StringRef Note, bool IsPrunable = false) {
345 return getNoteTag(
346 [Note = std::string(Note)](BugReporterContext &,
347 PathSensitiveBugReport &) { return Note; },
348 IsPrunable);
349 }
350
351 /// A shorthand version of getNoteTag that accepts a lambda with stream for
352 /// note.
353 ///
354 /// @param Cb Callback with 'BugReport &' and 'llvm::raw_ostream &'.
355 /// @param IsPrunable Whether the note is prunable. It allows BugReporter
356 /// to omit the note from the report if it would make the displayed
357 /// bug path significantly shorter.
359 std::function<void(PathSensitiveBugReport &BR, llvm::raw_ostream &OS)> &&Cb,
360 bool IsPrunable = false) {
361 return getNoteTag(
362 [Cb](PathSensitiveBugReport &BR) -> std::string {
364 llvm::raw_svector_ostream OS(Str);
365 Cb(BR, OS);
366 return std::string(OS.str());
367 },
368 IsPrunable);
369 }
370
371 /// Returns the word that should be used to refer to the declaration
372 /// in the report.
373 StringRef getDeclDescription(const Decl *D);
374
375 /// Get the declaration of the called function (path-sensitive).
376 const FunctionDecl *getCalleeDecl(const CallExpr *CE) const;
377
378 /// Get the name of the called function (path-sensitive).
379 StringRef getCalleeName(const FunctionDecl *FunDecl) const;
380
381 /// Get the identifier of the called function (path-sensitive).
383 const FunctionDecl *FunDecl = getCalleeDecl(CE);
384 if (FunDecl)
385 return FunDecl->getIdentifier();
386 else
387 return nullptr;
388 }
389
390 /// Get the name of the called function (path-sensitive).
391 StringRef getCalleeName(const CallExpr *CE) const {
392 const FunctionDecl *FunDecl = getCalleeDecl(CE);
393 return getCalleeName(FunDecl);
394 }
395
396 /// Returns true if the given function is an externally-visible function in
397 /// the top-level namespace, such as \c malloc.
398 ///
399 /// If a name is provided, the function must additionally match the given
400 /// name.
401 ///
402 /// Note that this also accepts functions from the \c std namespace (because
403 /// headers like <cstdlib> declare them there) and does not check if the
404 /// function is declared as 'extern "C"' or if it uses C++ name mangling.
405 static bool isCLibraryFunction(const FunctionDecl *FD,
406 StringRef Name = StringRef());
407
408 /// In builds that use source hardening (-D_FORTIFY_SOURCE), many standard
409 /// functions are implemented as macros that expand to calls of hardened
410 /// functions that take additional arguments compared to the "usual"
411 /// variant and perform additional input validation. For example, a `memcpy`
412 /// call may expand to `__memcpy_chk()` or `__builtin___memcpy_chk()`.
413 ///
414 /// This method returns true if `FD` declares a fortified variant of the
415 /// standard library function `Name`.
416 ///
417 /// NOTE: This method relies on heuristics; extend it if you need to handle a
418 /// hardened variant that's not yet covered by it.
419 static bool isHardenedVariantOf(const FunctionDecl *FD, StringRef Name);
420
421 /// Depending on whether the location corresponds to a macro, return
422 /// either the macro name or the token spelling.
423 ///
424 /// This could be useful when checkers' logic depends on whether a function
425 /// is called with a given macro argument. For example:
426 /// s = socket(AF_INET,..)
427 /// If AF_INET is a macro, the result should be treated as a source of taint.
428 ///
429 /// \sa clang::Lexer::getSpelling(), clang::Lexer::getImmediateMacroName().
431
432private:
433 ExplodedNode *addTransitionImpl(ProgramStateRef State,
434 bool MarkAsSink,
435 ExplodedNode *P = nullptr,
436 const ProgramPointTag *Tag = nullptr) {
437 // The analyzer may stop exploring if it sees a state it has previously
438 // visited ("cache out"). The early return here is a defensive check to
439 // prevent accidental caching out by checker API clients. Unless there is a
440 // tag or the client checker has requested that the generated node be
441 // marked as a sink, we assume that a client requesting a transition to a
442 // state that is the same as the predecessor state has made a mistake. We
443 // return the predecessor rather than cache out.
444 //
445 // TODO: We could potentially change the return to an assertion to alert
446 // clients to their mistake, but several checkers (including
447 // DereferenceChecker, CallAndMessageChecker, and DynamicTypePropagation)
448 // rely upon the defensive behavior and would need to be updated.
449 if (!State || (State == Pred->getState() && !Tag && !MarkAsSink))
450 return Pred;
451
452 Changed = true;
453 const ProgramPoint &LocalLoc = (Tag ? Location.withTag(Tag) : Location);
454 if (!P)
455 P = Pred;
456
457 ExplodedNode *node;
458 if (MarkAsSink)
459 node = NB.generateSink(LocalLoc, State, P);
460 else
461 node = NB.generateNode(LocalLoc, State, P);
462 return node;
463 }
464};
465
466} // end GR namespace
467
468} // end clang namespace
469
470#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:2949
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
This represents one expression.
Definition Expr.h:112
Represents a function declaration or definition.
Definition Decl.h:2029
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:295
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 * getPredecessor()
Returns the previous node in the exploded graph, which includes the state of the program before the c...
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).
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()
CheckerContext(NodeBuilder &builder, ExprEngine &eng, ExplodedNode *pred, const ProgramPoint &loc, bool wasInlined=false)
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 ExplodedNode * getPredecessor() const
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()
bool isDifferent()
Check if the checker changed the state of the execution; ex: added a new transition or a bug report.
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
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.
const StackFrame * getStackFrame() const
unsigned getBlockID() const
Get the blockID.
const ProgramStateRef & getState() const
ProgramPoint getLocation() const
getLocation - Returns the edge associated with the given node.
MemRegion - The root abstract class for all memory regions.
Definition MemRegion.h:97
This is the simplest builder which generates nodes in the ExplodedGraph.
Definition CoreEngine.h:265
ExplodedNode * generateNode(const ProgramPoint &PP, ProgramStateRef State, ExplodedNode *Pred, bool MarkAsSink=false)
Generates a node in the ExplodedGraph.
ExplodedNode * generateSink(const ProgramPoint &PP, ProgramStateRef State, ExplodedNode *Pred)
Generates a sink in the ExplodedGraph.
Definition CoreEngine.h:300
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,...
The JSON file list parser is used to communicate input to InstallAPI.
CFGBlock::ConstCFGElementRef ConstCFGElementRef
Definition CFG.h:1248
int const char * function
Definition c++config.h:31
#define false
Definition stdbool.h:26