clang
22.0.0git
include
clang
Analysis
FlowSensitive
Models
UncheckedOptionalAccessModel.h
Go to the documentation of this file.
1
//===-- UncheckedOptionalAccessModel.h --------------------------*- 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 a dataflow analysis that detects unsafe uses of optional
10
// values.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#ifndef CLANG_ANALYSIS_FLOWSENSITIVE_MODELS_UNCHECKEDOPTIONALACCESSMODEL_H
15
#define CLANG_ANALYSIS_FLOWSENSITIVE_MODELS_UNCHECKEDOPTIONALACCESSMODEL_H
16
17
#include "
clang/AST/ASTContext.h
"
18
#include "
clang/Analysis/CFG.h
"
19
#include "
clang/Analysis/FlowSensitive/CFGMatchSwitch.h
"
20
#include "
clang/Analysis/FlowSensitive/CachedConstAccessorsLattice.h
"
21
#include "
clang/Analysis/FlowSensitive/DataflowAnalysis.h
"
22
#include "
clang/Analysis/FlowSensitive/DataflowEnvironment.h
"
23
#include "
clang/Analysis/FlowSensitive/MatchSwitch.h
"
24
#include "
clang/Analysis/FlowSensitive/NoopLattice.h
"
25
#include "
clang/Basic/SourceLocation.h
"
26
#include "llvm/ADT/SmallVector.h"
27
28
namespace
clang
{
29
namespace
dataflow
{
30
31
// FIXME: Explore using an allowlist-approach, where constructs supported by the
32
// analysis are always enabled and additional constructs are enabled through the
33
// `Options`.
34
struct
UncheckedOptionalAccessModelOptions
{
35
/// In generating diagnostics, ignore optionals reachable through overloaded
36
/// `operator*` or `operator->` (other than those of the optional type
37
/// itself). The analysis does not equate the results of such calls, so it
38
/// can't identify when their results are used safely (across calls),
39
/// resulting in false positives in all such cases. Note: this option does not
40
/// cover access through `operator[]`.
41
///
42
/// FIXME: we now cache and equate the result of const accessors
43
/// that look like unique_ptr, have both `->` (returning a pointer type) and
44
/// `*` (returning a reference type). This includes mixing `->` and
45
/// `*` in a sequence of calls as long as the object is not modified. Once we
46
/// are confident in this const accessor caching, we shouldn't need the
47
/// IgnoreSmartPointerDereference option anymore.
48
bool
IgnoreSmartPointerDereference
=
false
;
49
};
50
51
using
UncheckedOptionalAccessLattice
=
CachedConstAccessorsLattice<NoopLattice>
;
52
53
/// Dataflow analysis that models whether optionals hold values or not.
54
///
55
/// Models the `std::optional`, `absl::optional`, and `base::Optional` types.
56
class
UncheckedOptionalAccessModel
57
:
public
DataflowAnalysis
<UncheckedOptionalAccessModel,
58
UncheckedOptionalAccessLattice> {
59
public
:
60
UncheckedOptionalAccessModel
(
ASTContext
&Ctx,
dataflow::Environment
&Env);
61
62
/// Returns a matcher for the optional classes covered by this model.
63
static
ast_matchers::DeclarationMatcher
optionalClassDecl
();
64
65
static
UncheckedOptionalAccessLattice
initialElement
() {
return
{}; }
66
67
void
transfer
(
const
CFGElement
&Elt,
UncheckedOptionalAccessLattice
&L,
68
Environment
&Env);
69
70
private
:
71
CFGMatchSwitch<TransferState<UncheckedOptionalAccessLattice>
>
72
TransferMatchSwitch;
73
};
74
75
/// Diagnostic information for an unchecked optional access.
76
struct
UncheckedOptionalAccessDiagnostic
{
77
CharSourceRange
Range
;
78
};
79
80
class
UncheckedOptionalAccessDiagnoser
{
81
public
:
82
UncheckedOptionalAccessDiagnoser
(
83
UncheckedOptionalAccessModelOptions
Options = {});
84
85
llvm::SmallVector<UncheckedOptionalAccessDiagnostic>
86
operator()
(
const
CFGElement
&Elt,
ASTContext
&Ctx,
87
const
TransferStateForDiagnostics<UncheckedOptionalAccessLattice>
88
&State) {
89
return
DiagnoseMatchSwitch(Elt, Ctx, State.Env);
90
}
91
92
private
:
93
CFGMatchSwitch
<
const
Environment
,
94
llvm::SmallVector<UncheckedOptionalAccessDiagnostic>
>
95
DiagnoseMatchSwitch;
96
};
97
98
}
// namespace dataflow
99
}
// namespace clang
100
101
#endif
// CLANG_ANALYSIS_FLOWSENSITIVE_MODELS_UNCHECKEDOPTIONALACCESSMODEL_H
ASTContext.h
Defines the clang::ASTContext interface.
CFGMatchSwitch.h
CFG.h
CachedConstAccessorsLattice.h
DataflowAnalysis.h
DataflowEnvironment.h
MatchSwitch.h
NoopLattice.h
SourceLocation.h
Defines the clang::SourceLocation class and associated facilities.
clang::ASTContext
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition
ASTContext.h:188
clang::CFGElement
Represents a top-level expression in a basic block.
Definition
CFG.h:55
clang::CharSourceRange
Represents a character-granular source range.
Definition
SourceLocation.h:258
clang::dataflow::CachedConstAccessorsLattice
A mixin for a lattice that additionally maintains a cache of stable method call return values to mode...
Definition
CachedConstAccessorsLattice.h:50
clang::dataflow::DataflowAnalysis< UncheckedOptionalAccessModel, UncheckedOptionalAccessLattice >::DataflowAnalysis
DataflowAnalysis(ASTContext &Context)
Definition
DataflowAnalysis.h:85
clang::dataflow::Environment
Holds the state of the program (store and heap) at a given program point.
Definition
DataflowEnvironment.h:65
clang::dataflow::UncheckedOptionalAccessDiagnoser::UncheckedOptionalAccessDiagnoser
UncheckedOptionalAccessDiagnoser(UncheckedOptionalAccessModelOptions Options={})
Definition
UncheckedOptionalAccessModel.cpp:1208
clang::dataflow::UncheckedOptionalAccessDiagnoser::operator()
llvm::SmallVector< UncheckedOptionalAccessDiagnostic > operator()(const CFGElement &Elt, ASTContext &Ctx, const TransferStateForDiagnostics< UncheckedOptionalAccessLattice > &State)
Definition
UncheckedOptionalAccessModel.h:86
clang::dataflow::UncheckedOptionalAccessModel::UncheckedOptionalAccessModel
UncheckedOptionalAccessModel(ASTContext &Ctx, dataflow::Environment &Env)
Definition
UncheckedOptionalAccessModel.cpp:1185
clang::dataflow::UncheckedOptionalAccessModel::transfer
void transfer(const CFGElement &Elt, UncheckedOptionalAccessLattice &L, Environment &Env)
Definition
UncheckedOptionalAccessModel.cpp:1201
clang::dataflow::UncheckedOptionalAccessModel::initialElement
static UncheckedOptionalAccessLattice initialElement()
Definition
UncheckedOptionalAccessModel.h:65
clang::dataflow::UncheckedOptionalAccessModel::optionalClassDecl
static ast_matchers::DeclarationMatcher optionalClassDecl()
Returns a matcher for the optional classes covered by this model.
Definition
UncheckedOptionalAccessModel.cpp:1181
llvm::SmallVector
Definition
LLVM.h:35
clang::ast_matchers::DeclarationMatcher
internal::Matcher< Decl > DeclarationMatcher
Types of matchers for the top-level classes in the AST class hierarchy.
Definition
ASTMatchers.h:145
clang::dataflow
Dataflow Directional Tag Classes.
Definition
AdornedCFG.h:29
clang::dataflow::UncheckedOptionalAccessLattice
CachedConstAccessorsLattice< NoopLattice > UncheckedOptionalAccessLattice
Definition
UncheckedOptionalAccessModel.h:51
clang::dataflow::CFGMatchSwitch
std::function< Result(const CFGElement &, ASTContext &, State &)> CFGMatchSwitch
Definition
CFGMatchSwitch.h:33
clang
The JSON file list parser is used to communicate input to InstallAPI.
Definition
CalledOnceCheck.h:17
clang::dataflow::TransferStateForDiagnostics
A read-only version of TransferState.
Definition
MatchSwitch.h:55
clang::dataflow::UncheckedOptionalAccessDiagnostic
Diagnostic information for an unchecked optional access.
Definition
UncheckedOptionalAccessModel.h:76
clang::dataflow::UncheckedOptionalAccessDiagnostic::Range
CharSourceRange Range
Definition
UncheckedOptionalAccessModel.h:77
clang::dataflow::UncheckedOptionalAccessModelOptions
Definition
UncheckedOptionalAccessModel.h:34
clang::dataflow::UncheckedOptionalAccessModelOptions::IgnoreSmartPointerDereference
bool IgnoreSmartPointerDereference
In generating diagnostics, ignore optionals reachable through overloaded operator* or operator-> (oth...
Definition
UncheckedOptionalAccessModel.h:48
Generated on
for clang by
1.14.0