xazax.hun updated this revision to Diff 88333. xazax.hun marked 9 inline comments as done. xazax.hun added a comment.
- Updated to latest trunk. - The cert rule was renamed, the patch is updated accordingly. - Fixes as per review comments. https://reviews.llvm.org/D23421 Files: clang-tidy/cert/CERTTidyModule.cpp clang-tidy/cert/CMakeLists.txt clang-tidy/cert/DontModifyStdNamespaceCheck.cpp clang-tidy/cert/DontModifyStdNamespaceCheck.h docs/ReleaseNotes.rst docs/clang-tidy/checks/cert-dcl58-cpp.rst docs/clang-tidy/checks/list.rst test/clang-tidy/cert-dcl58-cpp.cpp
Index: test/clang-tidy/cert-dcl58-cpp.cpp =================================================================== --- /dev/null +++ test/clang-tidy/cert-dcl58-cpp.cpp @@ -0,0 +1,37 @@ +// RUN: %check_clang_tidy %s cert-dcl58-cpp %t -- -- -std=c++1z + +namespace A { + namespace B { + int b; + } +} + +namespace A { + namespace B { + int c; + } +} + +namespace posix { +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: modification of 'posix' namespace can result in undefined behavior [cert-dcl58-cpp] + namespace vmi { + } +} + +namespace std { +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: modification of 'std' namespace can + int stdInt; +} + +namespace foobar { + namespace std { +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: modification of 'std' namespace can + } +} + +namespace posix::a { +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: modification of 'posix' namespace +} + +using namespace std; + Index: docs/clang-tidy/checks/list.rst =================================================================== --- docs/clang-tidy/checks/list.rst +++ docs/clang-tidy/checks/list.rst @@ -8,6 +8,7 @@ cert-dcl03-c (redirects to misc-static-assert) <cert-dcl03-c> cert-dcl50-cpp cert-dcl54-cpp (redirects to misc-new-delete-overloads) <cert-dcl54-cpp> + cert-dcl58-cpp cert-dcl59-cpp (redirects to google-build-namespaces) <cert-dcl59-cpp> cert-env33-c cert-err09-cpp (redirects to misc-throw-by-value-catch-by-reference) <cert-err09-cpp> Index: docs/clang-tidy/checks/cert-dcl58-cpp.rst =================================================================== --- /dev/null +++ docs/clang-tidy/checks/cert-dcl58-cpp.rst @@ -0,0 +1,16 @@ +.. title:: clang-tidy - cert-dcl58-cpp + +cert-dcl58-cpp +============== + +Modification of the ``std`` or ``posix`` namespace can result in undefined +behavior. +This check warns for such modifications. + +Examples: + +.. code-block:: c++ + + namespace std { + int x; // May cause undefined behavior. + } Index: docs/ReleaseNotes.rst =================================================================== --- docs/ReleaseNotes.rst +++ docs/ReleaseNotes.rst @@ -57,6 +57,11 @@ Improvements to clang-tidy -------------------------- +- New `cert-dcl58-cpp + <http://clang.llvm.org/extra/clang-tidy/checks/cert-dcl58-cpp.html>`_ check + + Finds modification of the ``std`` or ``posix`` namespace. + - New `safety-no-assembler <http://clang.llvm.org/extra/clang-tidy/checks/safety-no-assembler.html>`_ check Index: clang-tidy/cert/DontModifyStdNamespaceCheck.h =================================================================== --- /dev/null +++ clang-tidy/cert/DontModifyStdNamespaceCheck.h @@ -0,0 +1,36 @@ +//===--- DontModifyStdNamespaceCheck.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_CERT_DONT_MODIFY_STD_NAMESPACE_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DONT_MODIFY_STD_NAMESPACE_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace cert { + +/// Modification of the std or posix namespace can result in undefined behavior. +/// This check warns for such modifications. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/cert-msc53-cpp.html +class DontModifyStdNamespaceCheck : public ClangTidyCheck { +public: + DontModifyStdNamespaceCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace cert +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DONT_MODIFY_STD_NAMESPACE_H Index: clang-tidy/cert/DontModifyStdNamespaceCheck.cpp =================================================================== --- /dev/null +++ clang-tidy/cert/DontModifyStdNamespaceCheck.cpp @@ -0,0 +1,41 @@ +//===--- DontModifyStdNamespaceCheck.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 "DontModifyStdNamespaceCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace cert { + +void DontModifyStdNamespaceCheck::registerMatchers(MatchFinder *Finder) { + if (!getLangOpts().CPlusPlus) + return; + + Finder->addMatcher(namespaceDecl(unless(isExpansionInSystemHeader()), + anyOf(hasName("std"), hasName("posix"))) + .bind("nmspc"), + this); +} + +void DontModifyStdNamespaceCheck::check( + const MatchFinder::MatchResult &Result) { + const auto *N = Result.Nodes.getNodeAs<NamespaceDecl>("nmspc"); + + diag(N->getLocation(), + "modification of '%0' namespace can result in undefined behavior") + << N->getName(); +} + +} // namespace cert +} // namespace tidy +} // namespace clang Index: clang-tidy/cert/CMakeLists.txt =================================================================== --- clang-tidy/cert/CMakeLists.txt +++ clang-tidy/cert/CMakeLists.txt @@ -3,6 +3,7 @@ add_clang_library(clangTidyCERTModule CERTTidyModule.cpp CommandProcessorCheck.cpp + DontModifyStdNamespaceCheck.cpp FloatLoopCounter.cpp LimitedRandomnessCheck.cpp SetLongJmpCheck.cpp Index: clang-tidy/cert/CERTTidyModule.cpp =================================================================== --- clang-tidy/cert/CERTTidyModule.cpp +++ clang-tidy/cert/CERTTidyModule.cpp @@ -17,6 +17,7 @@ #include "../misc/StaticAssertCheck.h" #include "../misc/ThrowByValueCatchByReferenceCheck.h" #include "CommandProcessorCheck.h" +#include "DontModifyStdNamespaceCheck.h" #include "FloatLoopCounter.h" #include "LimitedRandomnessCheck.h" #include "SetLongJmpCheck.h" @@ -37,6 +38,8 @@ CheckFactories.registerCheck<VariadicFunctionDefCheck>("cert-dcl50-cpp"); CheckFactories.registerCheck<misc::NewDeleteOverloadsCheck>( "cert-dcl54-cpp"); + CheckFactories.registerCheck<DontModifyStdNamespaceCheck>( + "cert-dcl58-cpp"); CheckFactories.registerCheck<google::build::UnnamedNamespaceInHeaderCheck>( "cert-dcl59-cpp"); // OOP
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits