mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 02:06:30 +00:00
[clang-tidy] fix incorrect configuration file path resolving when file paths contain ..
(#121323)
`makeAbsolute` will not normalize path. When getting parent folder, `..` will go into the subfolder instead of the parent folder.
This commit is contained in:
parent
ae9bf17697
commit
0249554ee1
@ -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();
|
||||
@ -397,16 +408,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);
|
||||
|
||||
|
@ -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 @@ protected:
|
||||
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);
|
||||
|
@ -117,6 +117,9 @@ Improvements to clang-tidy
|
||||
- Improved :program:`run-clang-tidy.py` script. Fixed minor shutdown noise
|
||||
happening on certain platforms when interrupting the script.
|
||||
|
||||
- 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`. Global scoped `StrictMode` and `IgnoreMacros` are deprecated
|
||||
|
@ -0,0 +1 @@
|
||||
InvalidYamlFormat
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user