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/DataflowAnalysis.h
"
21
#include "
clang/Analysis/FlowSensitive/DataflowEnvironment.h
"
22
#include "
clang/Analysis/FlowSensitive/NoopLattice.h
"
23
#include "
clang/Basic/SourceLocation.h
"
24
#include "llvm/ADT/SmallVector.h"
25
26
namespace
clang
{
27
namespace
dataflow {
28
29
// FIXME: Explore using an allowlist-approach, where constructs supported by the
30
// analysis are always enabled and additional constructs are enabled through the
31
// `Options`.
32
struct
UncheckedOptionalAccessModelOptions
{
33
/// In generating diagnostics, ignore optionals reachable through overloaded
34
/// `operator*` or `operator->` (other than those of the optional type
35
/// itself). The analysis does not equate the results of such calls, so it
36
/// can't identify when their results are used safely (across calls),
37
/// resulting in false positives in all such cases. Note: this option does not
38
/// cover access through `operator[]`.
39
bool
IgnoreSmartPointerDereference
=
false
;
40
};
41
42
/// Dataflow analysis that models whether optionals hold values or not.
43
///
44
/// Models the `std::optional`, `absl::optional`, and `base::Optional` types.
45
class
UncheckedOptionalAccessModel
46
:
public
DataflowAnalysis
<UncheckedOptionalAccessModel, NoopLattice> {
47
public
:
48
UncheckedOptionalAccessModel
(
ASTContext
&Ctx,
dataflow::Environment
&
Env
);
49
50
/// Returns a matcher for the optional classes covered by this model.
51
static
ast_matchers::DeclarationMatcher
optionalClassDecl
();
52
53
static
NoopLattice
initialElement
() {
return
{}; }
54
55
void
transfer
(
const
CFGElement
&Elt,
NoopLattice
&L,
Environment
&
Env
);
56
57
private
:
58
CFGMatchSwitch<TransferState<NoopLattice>
> TransferMatchSwitch;
59
};
60
61
class
UncheckedOptionalAccessDiagnoser
{
62
public
:
63
UncheckedOptionalAccessDiagnoser
(
64
UncheckedOptionalAccessModelOptions
Options = {});
65
66
llvm::SmallVector<SourceLocation>
67
operator()
(
const
CFGElement
&Elt,
ASTContext
&Ctx,
68
const
TransferStateForDiagnostics<NoopLattice>
&State) {
69
return
DiagnoseMatchSwitch(Elt, Ctx, State.Env);
70
}
71
72
private
:
73
CFGMatchSwitch<const Environment, llvm::SmallVector<SourceLocation>
>
74
DiagnoseMatchSwitch;
75
};
76
77
}
// namespace dataflow
78
}
// namespace clang
79
80
#endif
// CLANG_ANALYSIS_FLOWSENSITIVE_MODELS_UNCHECKEDOPTIONALACCESSMODEL_H
ASTContext.h
Defines the clang::ASTContext interface.
CFGMatchSwitch.h
CFG.h
DataflowAnalysis.h
DataflowEnvironment.h
Env
const Environment & Env
Definition:
HTMLLogger.cpp:148
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:187
clang::CFGElement
Represents a top-level expression in a basic block.
Definition:
CFG.h:55
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::NoopLattice
Trivial lattice for dataflow analysis with exactly one element.
Definition:
NoopLattice.h:25
clang::dataflow::UncheckedOptionalAccessDiagnoser
Definition:
UncheckedOptionalAccessModel.h:61
clang::dataflow::UncheckedOptionalAccessDiagnoser::operator()
llvm::SmallVector< SourceLocation > operator()(const CFGElement &Elt, ASTContext &Ctx, const TransferStateForDiagnostics< NoopLattice > &State)
Definition:
UncheckedOptionalAccessModel.h:67
clang::dataflow::UncheckedOptionalAccessModel
Dataflow analysis that models whether optionals hold values or not.
Definition:
UncheckedOptionalAccessModel.h:46
clang::dataflow::UncheckedOptionalAccessModel::transfer
void transfer(const CFGElement &Elt, NoopLattice &L, Environment &Env)
Definition:
UncheckedOptionalAccessModel.cpp:933
clang::dataflow::UncheckedOptionalAccessModel::initialElement
static NoopLattice initialElement()
Definition:
UncheckedOptionalAccessModel.h:53
clang::dataflow::UncheckedOptionalAccessModel::optionalClassDecl
static ast_matchers::DeclarationMatcher optionalClassDecl()
Returns a matcher for the optional classes covered by this model.
Definition:
UncheckedOptionalAccessModel.cpp:914
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:32
clang::dataflow::UncheckedOptionalAccessModelOptions::IgnoreSmartPointerDereference
bool IgnoreSmartPointerDereference
In generating diagnostics, ignore optionals reachable through overloaded operator* or operator-> (oth...
Definition:
UncheckedOptionalAccessModel.h:39
Generated on Fri Nov 22 2024 09:46:58 for clang by
1.9.6