llvm-project

Форк
0
/
DynamicStaticInitializersCheck.cpp 
51 строка · 1.8 Кб
1
//===--- DynamicStaticInitializersCheck.cpp - clang-tidy ------------------===//
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
AST_MATCHER(clang::VarDecl, hasConstantDeclaration) {
19
  const Expr *Init = Node.getInit();
20
  if (Init && !Init->isValueDependent()) {
21
    if (Node.isConstexpr())
22
      return true;
23
    return Node.evaluateValue();
24
  }
25
  return false;
26
}
27

28
DynamicStaticInitializersCheck::DynamicStaticInitializersCheck(
29
    StringRef Name, ClangTidyContext *Context)
30
    : ClangTidyCheck(Name, Context),
31
      HeaderFileExtensions(Context->getHeaderFileExtensions()) {}
32

33
void DynamicStaticInitializersCheck::registerMatchers(MatchFinder *Finder) {
34
  Finder->addMatcher(
35
      varDecl(hasGlobalStorage(), unless(hasConstantDeclaration())).bind("var"),
36
      this);
37
}
38

39
void DynamicStaticInitializersCheck::check(const MatchFinder::MatchResult &Result) {
40
  const auto *Var = Result.Nodes.getNodeAs<VarDecl>("var");
41
  SourceLocation Loc = Var->getLocation();
42
  if (!Loc.isValid() || !utils::isPresumedLocInHeaderFile(Loc, *Result.SourceManager,
43
                                                          HeaderFileExtensions))
44
    return;
45
  // If the initializer is a constant expression, then the compiler
46
  // doesn't have to dynamically initialize it.
47
  diag(Loc, "static variable %0 may be dynamically initialized in this header file")
48
    << Var;
49
}
50

51
} // namespace clang::tidy::bugprone
52

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.