PaulkaToast created this revision.
PaulkaToast added a reviewer: aaron.ballman.
PaulkaToast added a project: clang-tools-extra.
Herald added subscribers: cfe-commits, phosek, xazax.hun, mgorny.
Herald added a project: clang.

Created a general check for restrict-system-includes under portability as 
recommend in the comments under D75332 <https://reviews.llvm.org/D75332>. I 
also fleshed out the user facing documentation to show examples for common 
use-cases such as allow-list, block-list, and wild carding.

In the documentation I noted that this new check was moved out from fuchsia and 
an alias was created from the old name to the new name to keep everything 
working. I'm wondering if this is correctly formatted in the release notes.

Nothing should change on fuchsia's end, although feel free to add them if a 
check off is required. (:


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D75786

Files:
  clang-tools-extra/clang-tidy/fuchsia/CMakeLists.txt
  clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp
  clang-tools-extra/clang-tidy/fuchsia/RestrictSystemIncludesCheck.cpp
  clang-tools-extra/clang-tidy/fuchsia/RestrictSystemIncludesCheck.h
  clang-tools-extra/clang-tidy/portability/CMakeLists.txt
  clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
  clang-tools-extra/clang-tidy/portability/RestrictSystemIncludesCheck.cpp
  clang-tools-extra/clang-tidy/portability/RestrictSystemIncludesCheck.h
  clang-tools-extra/docs/ReleaseNotes.rst
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  
clang-tools-extra/docs/clang-tidy/checks/portability-restrict-system-includes.rst
  
clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-allow.cpp
  
clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-disallow.cpp
  
clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-glob.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-glob.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-glob.cpp
@@ -0,0 +1,10 @@
+// RUN: %check_clang_tidy %s portability-restrict-system-includes %t \
+// RUN:     -- -config="{CheckOptions: [{key: portability-restrict-system-includes.Includes, value: '-*,std*.h'}]}"
+
+// Test glob functionality: disallow all headers except those that match
+// pattern "std*.h".
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: system include string.h not allowed
Index: clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-disallow.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-disallow.cpp
@@ -0,0 +1,10 @@
+// RUN: %check_clang_tidy %s portability-restrict-system-includes %t \
+// RUN:     -- -config="{CheckOptions: [{key: portability-restrict-system-includes.Includes, value: '-*,stdio.h'}]}"
+
+// Test allow-list functionality: disallow all but stdio.h.
+
+#include <stdio.h>
+#include <stdlib.h>
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: system include stdlib.h not allowed
+#include <string.h>
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: system include string.h not allowed
Index: clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-allow.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/portability-restrict-system-includes-allow.cpp
@@ -0,0 +1,9 @@
+// RUN: %check_clang_tidy %s portability-restrict-system-includes %t \
+// RUN:     -- -config="{CheckOptions: [{key: portability-restrict-system-includes.Includes, value: '*,-stdio.h'}]}"
+
+// Test block-list functionality: allow all but stdio.h.
+
+#include <stdio.h>
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: system include stdio.h not allowed
+#include <stdlib.h>
+#include <string.h>
Index: clang-tools-extra/docs/clang-tidy/checks/portability-restrict-system-includes.rst
===================================================================
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/portability-restrict-system-includes.rst
@@ -0,0 +1,51 @@
+.. title:: clang-tidy - portability-restrict-system-includes
+
+portability-restrict-system-includes
+====================================
+
+Checks to selectively allow or disallow a configurable list of system headers.
+
+For example:
+
+In order to **only** allow zlib.h from the system you would set the options to
+`-*,zlib.h`.
+
+.. code-block:: c++
+
+  #include <curses.h>       // Bad: disallowed system header.
+  #include <openssl/ssl.h>  // Bad: disallowed system header.
+  #include <zlib.h>         // Good: allowed system header.
+  #include "src/myfile.h"   // Good: non-system header always allowed.
+
+In order to allow everything **except** zlib.h from the system you would set
+the options to `*,-zlib.h`.
+
+.. code-block:: c++
+
+  #include <curses.h>       // Good: allowed system header.
+  #include <openssl/ssl.h>  // Good: allowed system header.
+  #include <zlib.h>         // Bad: disallowed system header.
+  #include "src/myfile.h"   // Good: non-system header always allowed.
+
+Since the opions support globbing you can use wildcarding to allow groups of
+headers.
+
+`-*,openssl/*.h` will allow all openssl headers but disallow all others.
+
+.. code-block:: c++
+
+  #include <curses.h>       // Bad: disallowed system header.
+  #include <openssl/ssl.h>  // Good: allowed system header.
+  #include <openssl/rsa.h>  // Good: allowed system header.
+  #include <zlib.h>         // Bad: disallowed system header.
+  #include "src/myfile.h"   // Good: non-system header always allowed.
+
+Options
+-------
+
+.. option:: Includes
+
+   A string containing a comma separated glob list of allowed include
+   filenames. Similar to the -checks glob list for running clang-tidy itself,
+   the two wildcard characters are '*' and '-', to include and exclude globs,
+   respectively. The default is '*', which allows all includes.
Index: clang-tools-extra/docs/clang-tidy/checks/list.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -255,6 +255,7 @@
    `performance-type-promotion-in-math-fn <performance-type-promotion-in-math-fn.html>`_, "Yes"
    `performance-unnecessary-copy-initialization <performance-unnecessary-copy-initialization.html>`_,
    `performance-unnecessary-value-param <performance-unnecessary-value-param.html>`_, "Yes"
+   `portability-restrict-system-includes <portability-restrict-system-includes.html>`_, "Yes"
    `portability-simd-intrinsics <portability-simd-intrinsics.html>`_,
    `readability-avoid-const-params-in-decls <readability-avoid-const-params-in-decls.html>`_,
    `readability-braces-around-statements <readability-braces-around-statements.html>`_, "Yes"
Index: clang-tools-extra/docs/ReleaseNotes.rst
===================================================================
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -98,6 +98,15 @@
 
   Finds recursive functions and diagnoses them.
 
+- New :doc:`portability-restrict-system-includes
+  <clang-tidy/checks/portability-restrict-system-includes>` check.
+
+  Checks to selectively allow or disallow a configurable list of system
+  headers.
+
+  Moved fuchsia's restrict-system-includes check to portability to allow for
+  general use.
+
 New check aliases
 ^^^^^^^^^^^^^^^^^
 
@@ -111,6 +120,11 @@
   :doc:`bugprone-reserved-identifier
   <clang-tidy/checks/bugprone-reserved-identifier>` was added.
 
+- New alias :doc:`fuchsia-restrict-system-includes
+  <clang-tidy/checks/fuchsia-restrict-system-includes>` to
+  :doc:`portability-restrict-system-includes
+  <clang-tidy/checks/portability-restrict-system-includes>` was added.
+
 Changes in existing checks
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
Index: clang-tools-extra/clang-tidy/portability/RestrictSystemIncludesCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/portability/RestrictSystemIncludesCheck.h
+++ clang-tools-extra/clang-tidy/portability/RestrictSystemIncludesCheck.h
@@ -1,4 +1,4 @@
-//===--- RestrictSystemIncludesCheck.h - clang-tidy---------- ----*- C++-*-===//
+//===--- RestrictSystemIncludesCheck.h - clang-tidy --------------*- C++-*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,21 +6,21 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_RESTRICTINCLUDESSCHECK_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_RESTRICTINCLUDESSCHECK_H
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_RESTRICTINCLUDESSCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_RESTRICTINCLUDESSCHECK_H
 
 #include "../ClangTidyCheck.h"
 #include "../GlobList.h"
 
 namespace clang {
 namespace tidy {
-namespace fuchsia {
+namespace portability {
 
 /// Checks for allowed includes and suggests removal of any others. If no
 /// includes are specified, the check will exit without issuing any warnings.
 ///
 /// For the user-facing documentation see:
-/// http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-restrict-system-includes.html
+/// http://clang.llvm.org/extra/clang-tidy/checks/portability-restrict-system-includes.html
 class RestrictSystemIncludesCheck : public ClangTidyCheck {
 public:
   RestrictSystemIncludesCheck(StringRef Name, ClangTidyContext *Context)
@@ -40,8 +40,8 @@
   GlobList AllowedIncludesGlobList;
 };
 
-} // namespace fuchsia
+} // namespace portability 
 } // namespace tidy
 } // namespace clang
 
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_RESTRICTINCLUDESSCHECK_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_RESTRICTINCLUDESSCHECK_H
\ No newline at end of file
Index: clang-tools-extra/clang-tidy/portability/RestrictSystemIncludesCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/portability/RestrictSystemIncludesCheck.cpp
+++ clang-tools-extra/clang-tidy/portability/RestrictSystemIncludesCheck.cpp
@@ -1,4 +1,4 @@
-//===--- RestrictSystemIncludesCheck.cpp - clang-tidy----------------------===//
+//===--- RestrictSystemIncludesCheck.cpp - clang-tidy ---------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -18,7 +18,7 @@
 
 namespace clang {
 namespace tidy {
-namespace fuchsia {
+namespace portability {
 
 class RestrictedIncludesPPCallbacks : public PPCallbacks {
 public:
@@ -111,6 +111,6 @@
   Options.store(Opts, "Includes", AllowedIncludes);
 }
 
-} // namespace fuchsia
+} // namespace portability
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
===================================================================
--- clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
+++ clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
@@ -9,6 +9,7 @@
 #include "../ClangTidy.h"
 #include "../ClangTidyModule.h"
 #include "../ClangTidyModuleRegistry.h"
+#include "RestrictSystemIncludesCheck.h"
 #include "SIMDIntrinsicsCheck.h"
 
 namespace clang {
@@ -18,6 +19,8 @@
 class PortabilityModule : public ClangTidyModule {
 public:
   void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
+    CheckFactories.registerCheck<RestrictSystemIncludesCheck>(
+        "portability-restrict-system-includes");
     CheckFactories.registerCheck<SIMDIntrinsicsCheck>(
         "portability-simd-intrinsics");
   }
Index: clang-tools-extra/clang-tidy/portability/CMakeLists.txt
===================================================================
--- clang-tools-extra/clang-tidy/portability/CMakeLists.txt
+++ clang-tools-extra/clang-tidy/portability/CMakeLists.txt
@@ -2,6 +2,7 @@
 
 add_clang_library(clangTidyPortabilityModule
   PortabilityTidyModule.cpp
+  RestrictSystemIncludesCheck.cpp
   SIMDIntrinsicsCheck.cpp
 
   LINK_LIBS
Index: clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp
===================================================================
--- clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp
+++ clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp
@@ -10,11 +10,11 @@
 #include "../ClangTidyModule.h"
 #include "../ClangTidyModuleRegistry.h"
 #include "../google/UnnamedNamespaceInHeaderCheck.h"
+#include "../portability/RestrictSystemIncludesCheck.h"
 #include "DefaultArgumentsCallsCheck.h"
 #include "DefaultArgumentsDeclarationsCheck.h"
 #include "MultipleInheritanceCheck.h"
 #include "OverloadedOperatorCheck.h"
-#include "RestrictSystemIncludesCheck.h"
 #include "StaticallyConstructedObjectsCheck.h"
 #include "TrailingReturnCheck.h"
 #include "VirtualInheritanceCheck.h"
@@ -39,7 +39,7 @@
         "fuchsia-multiple-inheritance");
     CheckFactories.registerCheck<OverloadedOperatorCheck>(
         "fuchsia-overloaded-operator");
-    CheckFactories.registerCheck<RestrictSystemIncludesCheck>(
+    CheckFactories.registerCheck<portability::RestrictSystemIncludesCheck>(
         "fuchsia-restrict-system-includes");
     CheckFactories.registerCheck<StaticallyConstructedObjectsCheck>(
         "fuchsia-statically-constructed-objects");
Index: clang-tools-extra/clang-tidy/fuchsia/CMakeLists.txt
===================================================================
--- clang-tools-extra/clang-tidy/fuchsia/CMakeLists.txt
+++ clang-tools-extra/clang-tidy/fuchsia/CMakeLists.txt
@@ -6,7 +6,6 @@
   FuchsiaTidyModule.cpp
   MultipleInheritanceCheck.cpp
   OverloadedOperatorCheck.cpp
-  RestrictSystemIncludesCheck.cpp
   StaticallyConstructedObjectsCheck.cpp
   TrailingReturnCheck.cpp
   VirtualInheritanceCheck.cpp
@@ -18,5 +17,6 @@
   clangLex
   clangTidy
   clangTidyGoogleModule
+  clangTidyPortabilityModule
   clangTidyUtils
   )
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to