clang-tools
23.0.0git
llvm-project
clang-tools-extra
clang-tidy
bugprone
DynamicStaticInitializersCheck.cpp
Go to the documentation of this file.
1
//===----------------------------------------------------------------------===//
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
#include "
DynamicStaticInitializersCheck.h
"
10
#include "
../utils/FileExtensionsUtils.h
"
11
#include "clang/AST/ASTContext.h"
12
#include "clang/ASTMatchers/ASTMatchFinder.h"
13
14
using namespace
clang::ast_matchers
;
15
16
namespace
clang::tidy::bugprone
{
17
18
namespace
{
19
20
AST_MATCHER
(clang::VarDecl, hasConstantDeclaration) {
21
if
(Node.isConstexpr() || Node.hasAttr<ConstInitAttr>())
22
return
true
;
23
if
(
const
VarDecl *Def = Node.getDefinition();
24
Def && (Def->isConstexpr() || Def->hasAttr<ConstInitAttr>()))
25
return
true
;
26
const
Expr *Init = Node.getInit();
27
if
(Init && !Init->isValueDependent())
28
return
Node.evaluateValue();
29
return
false
;
30
}
31
32
}
// namespace
33
34
DynamicStaticInitializersCheck::DynamicStaticInitializersCheck
(
35
StringRef Name,
ClangTidyContext
*Context)
36
:
ClangTidyCheck
(Name, Context),
37
HeaderFileExtensions(Context->getHeaderFileExtensions()) {}
38
39
void
DynamicStaticInitializersCheck::registerMatchers
(MatchFinder *Finder) {
40
Finder->addMatcher(
41
varDecl(hasGlobalStorage(), unless(hasConstantDeclaration())).bind(
"var"
),
42
this
);
43
}
44
45
void
DynamicStaticInitializersCheck::check
(
46
const
MatchFinder::MatchResult &Result) {
47
const
auto
*Var = Result.Nodes.getNodeAs<VarDecl>(
"var"
);
48
const
SourceLocation Loc = Var->getLocation();
49
if
(!Loc.isValid() || !
utils::isPresumedLocInHeaderFile
(
50
Loc, *Result.SourceManager, HeaderFileExtensions))
51
return
;
52
// If the initializer is a constant expression, then the compiler
53
// doesn't have to dynamically initialize it.
54
diag(Loc,
55
"static variable %0 may be dynamically initialized in this header file"
)
56
<< Var;
57
}
58
59
}
// namespace clang::tidy::bugprone
DynamicStaticInitializersCheck.h
FileExtensionsUtils.h
ClangTidyCheck
clang::tidy::ClangTidyContext
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.
Definition
ClangTidyDiagnosticConsumer.h:70
clang::tidy::bugprone::DynamicStaticInitializersCheck::DynamicStaticInitializersCheck
DynamicStaticInitializersCheck(StringRef Name, ClangTidyContext *Context)
Definition
DynamicStaticInitializersCheck.cpp:34
clang::tidy::bugprone::DynamicStaticInitializersCheck::check
void check(const ast_matchers::MatchFinder::MatchResult &Result) override
Definition
DynamicStaticInitializersCheck.cpp:45
clang::tidy::bugprone::DynamicStaticInitializersCheck::registerMatchers
void registerMatchers(ast_matchers::MatchFinder *Finder) override
Definition
DynamicStaticInitializersCheck.cpp:39
clang::ast_matchers
Definition
AbseilMatcher.h:16
clang::tidy::bugprone
Definition
ArgumentCommentCheck.cpp:19
clang::tidy::matchers::AST_MATCHER
AST_MATCHER(BinaryOperator, isRelationalOperator)
Definition
clang-tidy/utils/Matchers.h:19
clang::tidy::utils::isPresumedLocInHeaderFile
bool isPresumedLocInHeaderFile(SourceLocation Loc, SourceManager &SM, const FileExtensionsSet &HeaderFileExtensions)
Checks whether presumed location of Loc is in header file.
Definition
FileExtensionsUtils.cpp:22
Generated on
for clang-tools by
1.14.0