clang 22.0.0git
UninitializedValues.h
Go to the documentation of this file.
1//=- UninitializedValues.h - Finding uses of uninitialized values -*- 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 APIs for invoking and reported uninitialized values
10// warnings.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_ANALYSIS_ANALYSES_UNINITIALIZEDVALUES_H
15#define LLVM_CLANG_ANALYSIS_ANALYSES_UNINITIALIZEDVALUES_H
16
17#include "clang/Basic/LLVM.h"
18#include "llvm/ADT/SmallVector.h"
19
20namespace clang {
21
22class AnalysisDeclContext;
23class CFG;
24class DeclContext;
25class Expr;
26class Stmt;
27class VarDecl;
28
29/// A use of a variable, which might be uninitialized.
30class UninitUse {
31public:
32 struct Branch {
34 unsigned Output;
35 };
36
37private:
38 /// The expression which uses this variable.
39 const Expr *User;
40
41 /// Is this use uninitialized whenever the function is called?
42 bool UninitAfterCall = false;
43
44 /// Is this use uninitialized whenever the variable declaration is reached?
45 bool UninitAfterDecl = false;
46
47 /// Does this use always see an uninitialized value?
48 bool AlwaysUninit;
49
50 /// Is this use a const reference to this variable?
51 bool ConstRefUse = false;
52
53 /// Is this use a const pointer to this variable?
54 bool ConstPtrUse = false;
55
56 /// This use is always uninitialized if it occurs after any of these branches
57 /// is taken.
58 SmallVector<Branch, 2> UninitBranches;
59
60public:
61 UninitUse(const Expr *User, bool AlwaysUninit)
62 : User(User), AlwaysUninit(AlwaysUninit) {}
63
65 UninitBranches.push_back(B);
66 }
67
68 void setUninitAfterCall() { UninitAfterCall = true; }
69 void setUninitAfterDecl() { UninitAfterDecl = true; }
70 void setConstRefUse() { ConstRefUse = true; }
71 void setConstPtrUse() { ConstPtrUse = true; }
72
73 /// Get the expression containing the uninitialized use.
74 const Expr *getUser() const { return User; }
75
76 bool isConstRefUse() const { return ConstRefUse; }
77 bool isConstPtrUse() const { return ConstPtrUse; }
78 bool isConstRefOrPtrUse() const { return ConstRefUse || ConstPtrUse; }
79
80 /// The kind of uninitialized use.
81 enum Kind {
82 /// The use might be uninitialized.
84
85 /// The use is uninitialized whenever a certain branch is taken.
87
88 /// The use is uninitialized the first time it is reached after we reach
89 /// the variable's declaration.
91
92 /// The use is uninitialized the first time it is reached after the function
93 /// is called.
95
96 /// The use is always uninitialized.
97 Always
98 };
99
100 /// Get the kind of uninitialized use.
101 Kind getKind() const {
102 return AlwaysUninit ? Always :
103 UninitAfterCall ? AfterCall :
104 UninitAfterDecl ? AfterDecl :
106 }
107
109
110 /// Branches which inevitably result in the variable being used uninitialized.
111 branch_iterator branch_begin() const { return UninitBranches.begin(); }
112 branch_iterator branch_end() const { return UninitBranches.end(); }
113 bool branch_empty() const { return UninitBranches.empty(); }
114};
115
117public:
120
121 /// Called when the uninitialized variable is used at the given expression.
122 virtual void handleUseOfUninitVariable(const VarDecl *vd,
123 const UninitUse &use) {}
124
125 /// Called when the uninitialized variable analysis detects the
126 /// idiom 'int x = x'. All other uses of 'x' within the initializer
127 /// are handled by handleUseOfUninitVariable.
128 virtual void handleSelfInit(const VarDecl *vd) {}
129};
130
134};
135
136void runUninitializedVariablesAnalysis(const DeclContext &dc, const CFG &cfg,
138 UninitVariablesHandler &handler,
140
141} // namespace clang
142
143#endif // LLVM_CLANG_ANALYSIS_ANALYSES_UNINITIALIZEDVALUES_H
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
AnalysisDeclContext contains the context data for the function, method or block under analysis.
Represents a source-level, intra-procedural CFG that represents the control-flow of a Stmt.
Definition: CFG.h:1222
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1449
This represents one expression.
Definition: Expr.h:112
Stmt - This represents one statement.
Definition: Stmt.h:85
A use of a variable, which might be uninitialized.
const Expr * getUser() const
Get the expression containing the uninitialized use.
UninitUse(const Expr *User, bool AlwaysUninit)
SmallVectorImpl< Branch >::const_iterator branch_iterator
bool branch_empty() const
branch_iterator branch_end() const
bool isConstPtrUse() const
bool isConstRefOrPtrUse() const
bool isConstRefUse() const
void addUninitBranch(Branch B)
branch_iterator branch_begin() const
Branches which inevitably result in the variable being used uninitialized.
Kind
The kind of uninitialized use.
@ Always
The use is always uninitialized.
@ AfterDecl
The use is uninitialized the first time it is reached after we reach the variable's declaration.
@ Maybe
The use might be uninitialized.
@ AfterCall
The use is uninitialized the first time it is reached after the function is called.
@ Sometimes
The use is uninitialized whenever a certain branch is taken.
Kind getKind() const
Get the kind of uninitialized use.
virtual void handleUseOfUninitVariable(const VarDecl *vd, const UninitUse &use)
Called when the uninitialized variable is used at the given expression.
virtual void handleSelfInit(const VarDecl *vd)
Called when the uninitialized variable analysis detects the idiom 'int x = x'.
Represents a variable declaration or definition.
Definition: Decl.h:925
The JSON file list parser is used to communicate input to InstallAPI.
void runUninitializedVariablesAnalysis(const DeclContext &dc, const CFG &cfg, AnalysisDeclContext &ac, UninitVariablesHandler &handler, UninitVariablesAnalysisStats &stats)