clang
20.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/NoopLattice.h
"
24
#include "
clang/Basic/SourceLocation.h
"
25
#include "llvm/ADT/SmallVector.h"
26
27
namespace
clang
{
28
namespace
dataflow {
29
30
// FIXME: Explore using an allowlist-approach, where constructs supported by the
31
// analysis are always enabled and additional constructs are enabled through the
32
// `Options`.
33
struct
UncheckedOptionalAccessModelOptions
{
34
/// In generating diagnostics, ignore optionals reachable through overloaded
35
/// `operator*` or `operator->` (other than those of the optional type
36
/// itself). The analysis does not equate the results of such calls, so it
37
/// can't identify when their results are used safely (across calls),
38
/// resulting in false positives in all such cases. Note: this option does not
39
/// cover access through `operator[]`.
40
/// FIXME: we currently cache and equate the result of const accessors
41
/// returning pointers, so cover the case of operator-> followed by
42
/// operator->, which covers the common case of smart pointers. We also cover
43
/// some limited cases of returning references (if return type is an optional
44
/// type), so cover some cases of operator* followed by operator*. We don't
45
/// cover mixing operator-> and operator*. Once we are confident in this const
46
/// accessor caching, we shouldn't need the IgnoreSmartPointerDereference
47
/// 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
class
UncheckedOptionalAccessDiagnoser
{
76
public
:
77
UncheckedOptionalAccessDiagnoser
(
78
UncheckedOptionalAccessModelOptions
Options = {});
79
80
llvm::SmallVector<SourceLocation>
81
operator()
(
const
CFGElement
&Elt,
ASTContext
&Ctx,
82
const
TransferStateForDiagnostics<UncheckedOptionalAccessLattice>
83
&State) {
84
return
DiagnoseMatchSwitch(Elt, Ctx, State.Env);
85
}
86
87
private
:
88
CFGMatchSwitch<const Environment, llvm::SmallVector<SourceLocation>
>
89
DiagnoseMatchSwitch;
90
};
91
92
}
// namespace dataflow
93
}
// namespace clang
94
95
#endif
// CLANG_ANALYSIS_FLOWSENSITIVE_MODELS_UNCHECKEDOPTIONALACCESSMODEL_H
ASTContext.h
Defines the clang::ASTContext interface.
CFGMatchSwitch.h
CFG.h
CachedConstAccessorsLattice.h
DataflowAnalysis.h
DataflowEnvironment.h
Env
const Environment & Env
Definition:
HTMLLogger.cpp:147
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::dataflow::CachedConstAccessorsLattice
A mixin for a lattice that additionally maintains a cache of stable method call return values to mode...
Definition:
CachedConstAccessorsLattice.h:48
clang::dataflow::DataflowAnalysis
Base class template for dataflow analyses built on a single lattice type.
Definition:
DataflowAnalysis.h:80
clang::dataflow::Environment
Holds the state of the program (store and heap) at a given program point.
Definition:
DataflowEnvironment.h:65
clang::dataflow::UncheckedOptionalAccessDiagnoser
Definition:
UncheckedOptionalAccessModel.h:75
clang::dataflow::UncheckedOptionalAccessDiagnoser::operator()
llvm::SmallVector< SourceLocation > operator()(const CFGElement &Elt, ASTContext &Ctx, const TransferStateForDiagnostics< UncheckedOptionalAccessLattice > &State)
Definition:
UncheckedOptionalAccessModel.h:81
clang::dataflow::UncheckedOptionalAccessModel
Dataflow analysis that models whether optionals hold values or not.
Definition:
UncheckedOptionalAccessModel.h:58
clang::dataflow::UncheckedOptionalAccessModel::transfer
void transfer(const CFGElement &Elt, UncheckedOptionalAccessLattice &L, Environment &Env)
Definition:
UncheckedOptionalAccessModel.cpp:1119
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:1099
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:143
clang::dataflow::CFGMatchSwitch
std::function< Result(const CFGElement &, ASTContext &, State &)> CFGMatchSwitch
Definition:
CFGMatchSwitch.h:34
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::UncheckedOptionalAccessModelOptions
Definition:
UncheckedOptionalAccessModel.h:33
clang::dataflow::UncheckedOptionalAccessModelOptions::IgnoreSmartPointerDereference
bool IgnoreSmartPointerDereference
In generating diagnostics, ignore optionals reachable through overloaded operator* or operator-> (oth...
Definition:
UncheckedOptionalAccessModel.h:48
Generated on Thu Dec 19 2024 18:44:00 for clang by
1.9.6