aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorealcdan <daniel.alcaide.nombela@ericsson.com>2024-04-23 13:03:09 +0200
committerGitHub <noreply@github.com>2024-04-23 13:03:09 +0200
commitc52b18d1e41107067b7557d8af3a06e6fe0beb0f (patch)
tree7a2f9ccfa080e3f7766d8e0d3f39273ad7709685
parentbac5d8ed036869bc65ba2eef6d4afd671ca7c72b (diff)
downloadllvm-c52b18d1e41107067b7557d8af3a06e6fe0beb0f.zip
llvm-c52b18d1e41107067b7557d8af3a06e6fe0beb0f.tar.gz
llvm-c52b18d1e41107067b7557d8af3a06e6fe0beb0f.tar.bz2
[clang-tidy] Avoid overflow when dumping unsigned integer values (#85060)
Some options take the maximum unsigned integer value as default, but they are being dumped to a string as integers. This makes -dump-config write invalid '-1' values for these options. This change fixes this issue by using utostr if the option is unsigned. Fixes #60217
-rw-r--r--clang-tools-extra/clang-tidy/ClangTidyCheck.cpp6
-rw-r--r--clang-tools-extra/clang-tidy/ClangTidyCheck.h9
-rw-r--r--clang-tools-extra/docs/ReleaseNotes.rst2
-rw-r--r--clang-tools-extra/test/clang-tidy/infrastructure/Inputs/config-files/5/.clang-tidy4
-rw-r--r--clang-tools-extra/test/clang-tidy/infrastructure/config-files.cpp8
5 files changed, 27 insertions, 2 deletions
diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
index 3e92623..710b361 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
@@ -139,6 +139,12 @@ void ClangTidyCheck::OptionsView::storeInt(ClangTidyOptions::OptionMap &Options,
store(Options, LocalName, llvm::itostr(Value));
}
+void ClangTidyCheck::OptionsView::storeUnsigned(
+ ClangTidyOptions::OptionMap &Options, StringRef LocalName,
+ uint64_t Value) const {
+ store(Options, LocalName, llvm::utostr(Value));
+}
+
template <>
void ClangTidyCheck::OptionsView::store<bool>(
ClangTidyOptions::OptionMap &Options, StringRef LocalName,
diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.h b/clang-tools-extra/clang-tidy/ClangTidyCheck.h
index 656a2f0..7427aa9 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyCheck.h
+++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.h
@@ -411,7 +411,10 @@ public:
std::enable_if_t<std::is_integral_v<T>>
store(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
T Value) const {
- storeInt(Options, LocalName, Value);
+ if constexpr (std::is_signed_v<T>)
+ storeInt(Options, LocalName, Value);
+ else
+ storeUnsigned(Options, LocalName, Value);
}
/// Stores an option with the check-local name \p LocalName with
@@ -422,7 +425,7 @@ public:
store(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
std::optional<T> Value) const {
if (Value)
- storeInt(Options, LocalName, *Value);
+ store(Options, LocalName, *Value);
else
store(Options, LocalName, "none");
}
@@ -470,6 +473,8 @@ public:
void storeInt(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
int64_t Value) const;
+ void storeUnsigned(ClangTidyOptions::OptionMap &Options,
+ StringRef LocalName, uint64_t Value) const;
std::string NamePrefix;
const ClangTidyOptions::OptionMap &CheckOptions;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index f3f9a81..28840b9 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -102,6 +102,8 @@ Improvements to clang-tidy
similar fashion to what `-header-filter` does for header files.
- Improved :program:`check_clang_tidy.py` script. Added argument `-export-fixes`
to aid in clang-tidy and test development.
+- Fixed bug where big values for unsigned check options overflowed into negative values
+ when being printed with ``--dump-config``.
- Fixed ``--verify-config`` option not properly parsing checks when using the
literal operator in the ``.clang-tidy`` config.
diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/Inputs/config-files/5/.clang-tidy b/clang-tools-extra/test/clang-tidy/infrastructure/Inputs/config-files/5/.clang-tidy
new file mode 100644
index 0000000..e33f0f8
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/infrastructure/Inputs/config-files/5/.clang-tidy
@@ -0,0 +1,4 @@
+InheritParentConfig: true
+Checks: 'misc-throw-by-value-catch-by-reference'
+CheckOptions:
+ misc-throw-by-value-catch-by-reference.MaxSize: '1152921504606846976'
diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/config-files.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/config-files.cpp
index ab4f3be..cb0f0bc 100644
--- a/clang-tools-extra/test/clang-tidy/infrastructure/config-files.cpp
+++ b/clang-tools-extra/test/clang-tidy/infrastructure/config-files.cpp
@@ -64,3 +64,11 @@
// Validate that check options are printed in alphabetical order:
// RUN: clang-tidy --checks="-*,readability-identifier-naming" --dump-config %S/Inputs/config-files/- -- | grep "readability-identifier-naming\." | sort --check
+
+// Dumped config does not overflow for unsigned options
+// RUN: clang-tidy --dump-config \
+// RUN: --checks="-*,misc-throw-by-value-catch-by-reference" \
+// RUN: -- | grep -v -q "misc-throw-by-value-catch-by-reference.MaxSize: '-1'"
+
+// RUN: clang-tidy --dump-config %S/Inputs/config-files/5/- \
+// RUN: -- | grep -q "misc-throw-by-value-catch-by-reference.MaxSize: '1152921504606846976'"