https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/121323
>From 896db4495ff2c29c2e623d92e004ef64f49c8dd0 Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Mon, 30 Dec 2024 16:38:29 +0800 Subject: [PATCH] [clang-tidy] fix incorrect configuration file path resolving when file paths contain `..` `makeAbsolute` will not normalize path. When getting parent folder, `..` will go into the subfolder instead of the parent folder. --- .../clang-tidy/ClangTidyOptions.cpp | 32 ++++++++++++------- .../clang-tidy/ClangTidyOptions.h | 4 +++ clang-tools-extra/docs/ReleaseNotes.rst | 3 ++ .../Inputs/normalized-path/code.cpp | 0 .../normalized-path/error-config/.clang-tidy | 1 + .../infrastructure/normalized-path.test | 3 ++ 6 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 clang-tools-extra/test/clang-tidy/infrastructure/Inputs/normalized-path/code.cpp create mode 100644 clang-tools-extra/test/clang-tidy/infrastructure/Inputs/normalized-path/error-config/.clang-tidy create mode 100644 clang-tools-extra/test/clang-tidy/infrastructure/normalized-path.test diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp index 445c7f85c900c6..1ad278e5d9a795 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp @@ -12,6 +12,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Errc.h" +#include "llvm/Support/ErrorOr.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBufferRef.h" #include "llvm/Support/Path.h" @@ -298,12 +299,11 @@ ConfigOptionsProvider::getRawOptions(llvm::StringRef FileName) { if (ConfigOptions.InheritParentConfig.value_or(false)) { LLVM_DEBUG(llvm::dbgs() << "Getting options for file " << FileName << "...\n"); - assert(FS && "FS must be set."); - llvm::SmallString<128> AbsoluteFilePath(FileName); - - if (!FS->makeAbsolute(AbsoluteFilePath)) { - addRawFileOptions(AbsoluteFilePath, RawOptions); + llvm::ErrorOr<llvm::SmallString<128>> AbsoluteFilePath = + getNormalizedAbsolutePath(FileName); + if (AbsoluteFilePath) { + addRawFileOptions(AbsoluteFilePath->str(), RawOptions); } } RawOptions.emplace_back(ConfigOptions, @@ -334,6 +334,17 @@ FileOptionsBaseProvider::FileOptionsBaseProvider( OverrideOptions(std::move(OverrideOptions)), ConfigHandlers(std::move(ConfigHandlers)) {} +llvm::ErrorOr<llvm::SmallString<128>> +FileOptionsBaseProvider::getNormalizedAbsolutePath(llvm::StringRef Path) { + assert(FS && "FS must be set."); + llvm::SmallString<128> NormalizedAbsolutePath = {Path}; + std::error_code Err = FS->makeAbsolute(NormalizedAbsolutePath); + if (Err) + return Err; + llvm::sys::path::remove_dots(NormalizedAbsolutePath, /*remove_dot_dot=*/true); + return NormalizedAbsolutePath; +} + void FileOptionsBaseProvider::addRawFileOptions( llvm::StringRef AbsolutePath, std::vector<OptionsSource> &CurOptions) { auto CurSize = CurOptions.size(); @@ -396,16 +407,15 @@ std::vector<OptionsSource> FileOptionsProvider::getRawOptions(StringRef FileName) { LLVM_DEBUG(llvm::dbgs() << "Getting options for file " << FileName << "...\n"); - assert(FS && "FS must be set."); - - llvm::SmallString<128> AbsoluteFilePath(FileName); - if (FS->makeAbsolute(AbsoluteFilePath)) + llvm::ErrorOr<llvm::SmallString<128>> AbsoluteFilePath = + getNormalizedAbsolutePath(FileName); + if (!AbsoluteFilePath) return {}; std::vector<OptionsSource> RawOptions = - DefaultOptionsProvider::getRawOptions(AbsoluteFilePath.str()); - addRawFileOptions(AbsoluteFilePath, RawOptions); + DefaultOptionsProvider::getRawOptions(AbsoluteFilePath->str()); + addRawFileOptions(AbsoluteFilePath->str(), RawOptions); OptionsSource CommandLineOptions(OverrideOptions, OptionsSourceTypeCheckCommandLineOption); diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.h b/clang-tools-extra/clang-tidy/ClangTidyOptions.h index 85d5a02ebbc1bc..95abe932d56ccf 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyOptions.h +++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.h @@ -10,6 +10,7 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYOPTIONS_H #include "llvm/ADT/IntrusiveRefCntPtr.h" +#include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/ErrorOr.h" @@ -237,6 +238,9 @@ class FileOptionsBaseProvider : public DefaultOptionsProvider { void addRawFileOptions(llvm::StringRef AbsolutePath, std::vector<OptionsSource> &CurOptions); + llvm::ErrorOr<llvm::SmallString<128>> + getNormalizedAbsolutePath(llvm::StringRef AbsolutePath); + /// Try to read configuration files from \p Directory using registered /// \c ConfigHandlers. std::optional<OptionsSource> tryReadConfigFile(llvm::StringRef Directory); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 3cab440155250b..2bbe7324b1f4d4 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -117,6 +117,9 @@ Improvements to clang-tidy - Improved :program:`clang-tidy` by accepting parameters file in command line. +- Improved :program:`clang-tidy` by fixing incorrect configuration file path + resolving when file paths contain ``..``. + - Removed :program:`clang-tidy`'s global options for most of checks. All options are changed to local options except `IncludeStyle`, `StrictMode` and `IgnoreMacros`. diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/Inputs/normalized-path/code.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/Inputs/normalized-path/code.cpp new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/Inputs/normalized-path/error-config/.clang-tidy b/clang-tools-extra/test/clang-tidy/infrastructure/Inputs/normalized-path/error-config/.clang-tidy new file mode 100644 index 00000000000000..83bc4d519722bf --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/infrastructure/Inputs/normalized-path/error-config/.clang-tidy @@ -0,0 +1 @@ +InvalidYamlFormat diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/normalized-path.test b/clang-tools-extra/test/clang-tidy/infrastructure/normalized-path.test new file mode 100644 index 00000000000000..d14ad43bb8b137 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/infrastructure/normalized-path.test @@ -0,0 +1,3 @@ +// RUN: clang-tidy %S/Inputs/normalized-path/error-config/../code.cpp --verify-config 2>&1 | FileCheck %s + +// CHECK-NOT: Error parsing _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits