diff options
author | Julie Hockett <juliehockett@google.com> | 2018-01-11 21:17:43 +0000 |
---|---|---|
committer | Julie Hockett <juliehockett@google.com> | 2018-01-11 21:17:43 +0000 |
commit | 76612e5e3af2f45413fa0347fa79fdfc8cb18973 (patch) | |
tree | 3eec65250282c7be8e8fc0bab880e3a76095da0a /clang-tidy/fuchsia | |
parent | b958885f42c75678a1eb8021301612935caf4fa1 (diff) |
[clang-tidy] Adding Fuchsia checker for statically constructed objects
Adds a check to the Fuchsia module to warn if statically-stored objects
are created, unless constructed with `constexpr`.
See https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md for
reference.
Differential Revision: https://reviews.llvm.org/D41546
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@322310 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clang-tidy/fuchsia')
-rw-r--r-- | clang-tidy/fuchsia/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang-tidy/fuchsia/FuchsiaTidyModule.cpp | 3 | ||||
-rw-r--r-- | clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.cpp | 58 | ||||
-rw-r--r-- | clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.h | 37 |
4 files changed, 99 insertions, 0 deletions
diff --git a/clang-tidy/fuchsia/CMakeLists.txt b/clang-tidy/fuchsia/CMakeLists.txt index 3b223ba7..28e4b0e7 100644 --- a/clang-tidy/fuchsia/CMakeLists.txt +++ b/clang-tidy/fuchsia/CMakeLists.txt @@ -4,6 +4,7 @@ add_clang_library(clangTidyFuchsiaModule DefaultArgumentsCheck.cpp FuchsiaTidyModule.cpp OverloadedOperatorCheck.cpp + StaticallyConstructedObjectsCheck.cpp VirtualInheritanceCheck.cpp LINK_LIBS diff --git a/clang-tidy/fuchsia/FuchsiaTidyModule.cpp b/clang-tidy/fuchsia/FuchsiaTidyModule.cpp index 1860115a..ab4aaff9 100644 --- a/clang-tidy/fuchsia/FuchsiaTidyModule.cpp +++ b/clang-tidy/fuchsia/FuchsiaTidyModule.cpp @@ -12,6 +12,7 @@ #include "../ClangTidyModuleRegistry.h" #include "DefaultArgumentsCheck.h" #include "OverloadedOperatorCheck.h" +#include "StaticallyConstructedObjectsCheck.h" #include "VirtualInheritanceCheck.h" using namespace clang::ast_matchers; @@ -28,6 +29,8 @@ public: "fuchsia-default-arguments"); CheckFactories.registerCheck<OverloadedOperatorCheck>( "fuchsia-overloaded-operator"); + CheckFactories.registerCheck<StaticallyConstructedObjectsCheck>( + "fuchsia-statically-constructed-objects"); CheckFactories.registerCheck<VirtualInheritanceCheck>( "fuchsia-virtual-inheritance"); } diff --git a/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.cpp b/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.cpp new file mode 100644 index 00000000..8291f988 --- /dev/null +++ b/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.cpp @@ -0,0 +1,58 @@ +//===--- StaticallyConstructedObjectsCheck.cpp - clang-tidy----------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "StaticallyConstructedObjectsCheck.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace fuchsia { + +AST_MATCHER(Expr, isConstantInitializer) { + return Node.isConstantInitializer(Finder->getASTContext(), false); +} + +AST_MATCHER(VarDecl, isGlobalStatic) { + return Node.getStorageDuration() == SD_Static && !Node.isLocalVarDecl(); +} + +void StaticallyConstructedObjectsCheck::registerMatchers(MatchFinder *Finder) { + // Constructing global, non-trivial objects with static storage is + // disallowed, unless the object is statically initialized with a constexpr + // constructor or has no explicit constructor. + + // Constexpr requires C++11 or later. + if (!getLangOpts().CPlusPlus11) + return; + + Finder->addMatcher( + varDecl(allOf( + // Match global, statically stored objects... + isGlobalStatic(), + // ... that have C++ constructors... + hasDescendant(cxxConstructExpr(unless(allOf( + // ... unless it is constexpr ... + hasDeclaration(cxxConstructorDecl(isConstexpr())), + // ... and is statically initialized. + isConstantInitializer())))))) + .bind("decl"), + this); +} + +void StaticallyConstructedObjectsCheck::check( + const MatchFinder::MatchResult &Result) { + if (const auto *D = Result.Nodes.getNodeAs<VarDecl>("decl")) + diag(D->getLocStart(), "static objects are disallowed; if possible, use a " + "constexpr constructor instead"); +} + +} // namespace fuchsia +} // namespace tidy +} // namespace clang diff --git a/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.h b/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.h new file mode 100644 index 00000000..6df9b1c2 --- /dev/null +++ b/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.h @@ -0,0 +1,37 @@ +//===--- StaticallyConstructedObjectsCheck.h - clang-tidy--------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_STATICALLY_CONSTRUCTED_OBJECTS_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_STATICALLY_CONSTRUCTED_OBJECTS_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace fuchsia { + +/// Constructing global, non-trivial objects with static storage is +/// disallowed, unless the object is statically initialized with a constexpr +/// constructor or has no explicit constructor. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-statically-constructed-objects.html +class StaticallyConstructedObjectsCheck : public ClangTidyCheck { +public: + StaticallyConstructedObjectsCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace fuchsia +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_STATICALLY_CONSTRUCTED_OBJECTS_H |