| From 41d9d5092a17e60615077da6ef22b4f5cfae2c2e Mon Sep 17 00:00:00 2001 |
| From: Manoj Gupta <manojgupta@google.com> |
| Date: Fri, 13 Sep 2019 18:00:51 +0000 |
| Subject: [PATCH] Reland r371785: Add -Wpoison-system-directories warning |
| |
| When using clang as a cross-compiler, we should not use system |
| headers to do the compilation. |
| This CL adds support of a new warning flag -Wpoison-system-directories which |
| emits warnings if --sysroot is set and headers from common host system location |
| are used. |
| By default the warning is disabled. |
| |
| The intention of the warning is to catch bad includes which are usually |
| generated by third party build system not targeting cross-compilation. |
| Such cases happen in Chrome OS when someone imports a new package or upgrade |
| one to a newer version from upstream. |
| |
| This is reland of r371785 with a fix to test file. |
| |
| Patch by: denik (Denis Nikitin) |
| |
| llvm-svn: 371878 |
| --- |
| .../clang/Basic/DiagnosticCommonKinds.td | 5 ++++ |
| clang/lib/Frontend/InitHeaderSearch.cpp | 7 +++++ |
| .../sysroot_x86_64_cross_linux_tree/lib/.keep | 0 |
| .../usr/include/c++/.keep | 0 |
| .../usr/lib/gcc/.keep | 0 |
| .../usr/local/include/.keep | 0 |
| .../usr/local/lib/.keep | 0 |
| .../warning-poison-system-directories.c | 29 +++++++++++++++++++ |
| 8 files changed, 41 insertions(+) |
| create mode 100644 clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/lib/.keep |
| create mode 100644 clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/include/c++/.keep |
| create mode 100644 clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/lib/gcc/.keep |
| create mode 100644 clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/local/include/.keep |
| create mode 100644 clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/local/lib/.keep |
| create mode 100644 clang/test/Frontend/warning-poison-system-directories.c |
| |
| diff --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td |
| index 8196a4601c2..1cd62d1e138 100644 |
| --- a/clang/include/clang/Basic/DiagnosticCommonKinds.td |
| +++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td |
| @@ -315,4 +315,9 @@ def err_unknown_analyzer_checker_or_package : Error< |
| "no analyzer checkers or packages are associated with '%0'">; |
| def note_suggest_disabling_all_checkers : Note< |
| "use -analyzer-disable-all-checks to disable all static analyzer checkers">; |
| + |
| +// Poison system directories. |
| +def warn_poison_system_directories : Warning < |
| + "include location '%0' is unsafe for cross-compilation">, |
| + InGroup<DiagGroup<"poison-system-directories">>, DefaultIgnore; |
| } |
| diff --git a/clang/lib/Frontend/InitHeaderSearch.cpp b/clang/lib/Frontend/InitHeaderSearch.cpp |
| index ad0d2327148..5d877ee9c0d 100644 |
| --- a/clang/lib/Frontend/InitHeaderSearch.cpp |
| +++ b/clang/lib/Frontend/InitHeaderSearch.cpp |
| @@ -137,6 +137,13 @@ bool InitHeaderSearch::AddUnmappedPath(const Twine &Path, IncludeDirGroup Group, |
| SmallString<256> MappedPathStorage; |
| StringRef MappedPathStr = Path.toStringRef(MappedPathStorage); |
| |
| + // If use system headers while cross-compiling, emit the warning. |
| + if (HasSysroot && (MappedPathStr.startswith("/usr/include") || |
| + MappedPathStr.startswith("/usr/local/include"))) { |
| + Headers.getDiags().Report(diag::warn_poison_system_directories) |
| + << MappedPathStr; |
| + } |
| + |
| // Compute the DirectoryLookup type. |
| SrcMgr::CharacteristicKind Type; |
| if (Group == Quoted || Group == Angled || Group == IndexHeaderMap) { |
| diff --git a/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/lib/.keep b/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/lib/.keep |
| new file mode 100644 |
| index 00000000000..e69de29bb2d |
| diff --git a/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/include/c++/.keep b/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/include/c++/.keep |
| new file mode 100644 |
| index 00000000000..e69de29bb2d |
| diff --git a/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/lib/gcc/.keep b/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/lib/gcc/.keep |
| new file mode 100644 |
| index 00000000000..e69de29bb2d |
| diff --git a/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/local/include/.keep b/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/local/include/.keep |
| new file mode 100644 |
| index 00000000000..e69de29bb2d |
| diff --git a/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/local/lib/.keep b/clang/test/Frontend/Inputs/sysroot_x86_64_cross_linux_tree/usr/local/lib/.keep |
| new file mode 100644 |
| index 00000000000..e69de29bb2d |
| diff --git a/clang/test/Frontend/warning-poison-system-directories.c b/clang/test/Frontend/warning-poison-system-directories.c |
| new file mode 100644 |
| index 00000000000..ba4c0e1990e |
| --- /dev/null |
| +++ b/clang/test/Frontend/warning-poison-system-directories.c |
| @@ -0,0 +1,29 @@ |
| +// REQUIRES: x86-registered-target |
| + |
| +// System directory and sysroot option causes warning. |
| +// RUN: %clang -Wpoison-system-directories -target x86_64 -I/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.1.stderr |
| +// RUN: FileCheck -check-prefix=WARN < %t.1.stderr %s |
| +// RUN: %clang -Wpoison-system-directories -target x86_64 -cxx-isystem/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.1.stderr |
| +// RUN: FileCheck -check-prefix=WARN < %t.1.stderr %s |
| +// RUN: %clang -Wpoison-system-directories -target x86_64 -iquote/usr/local/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.1.stderr |
| +// RUN: FileCheck -check-prefix=WARN < %t.1.stderr %s |
| +// RUN: %clang -Wpoison-system-directories -target x86_64 -isystem/usr/local/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.1.stderr |
| +// RUN: FileCheck -check-prefix=WARN < %t.1.stderr %s |
| + |
| +// Missing target but included sysroot still causes the warning. |
| +// RUN: %clang -Wpoison-system-directories -I/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.2.stderr |
| +// RUN: FileCheck -check-prefix=WARN < %t.2.stderr %s |
| + |
| +// With -Werror the warning causes the failure. |
| +// RUN: not %clang -Werror=poison-system-directories -target x86_64 -I/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s 2> %t.3.stderr |
| +// RUN: FileCheck -check-prefix=ERROR < %t.3.stderr %s |
| + |
| +// Cros target without sysroot causes no warning. |
| +// RUN: %clang -Wpoison-system-directories -Werror -target x86_64 -I/usr/include -c -o - %s |
| + |
| +// By default the warning is off. |
| +// RUN: %clang -Werror -target x86_64 -I/usr/include --sysroot %S/Inputs/sysroot_x86_64_cross_linux_tree -c -o - %s |
| + |
| +// WARN: warning: include location {{[^ ]+}} is unsafe for cross-compilation [-Wpoison-system-directories] |
| + |
| +// ERROR: error: include location {{[^ ]+}} is unsafe for cross-compilation [-Werror,-Wpoison-system-directories] |
| -- |
| 2.23.0.351.gc4317032e6-goog |
| |