[clang-tools-extra] [clang-tidy] Avoid overflow when dumping unsigned integer values (PR #85060)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 13 03:46:04 PDT 2024
https://github.com/ealcdan created https://github.com/llvm/llvm-project/pull/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.
>From 6fc8a717e53a309087d4b48f05b1c69f1ea60d07 Mon Sep 17 00:00:00 2001
From: Daniel Alcaide Nombela <daniel.alcaide.nombela at ericsson.com>
Date: Wed, 13 Mar 2024 11:28:34 +0100
Subject: [PATCH] [clang-tidy] Avoid overflow when dumping unsigned integer
values
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.
Change-Id: I551e6bc616071cf7aa10a8c0220d2076ed3d40e6
---
.../clang-tidy/ClangTidyCheck.cpp | 6 +++++
clang-tools-extra/clang-tidy/ClangTidyCheck.h | 27 +++++++++++++++++--
2 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
index 3e926236adb451..710b361e16c0a7 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 656a2f008f6e0e..5ccd91d5d891ff 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyCheck.h
+++ b/clang-tools-extra/clang-tidy/ClangTidyCheck.h
@@ -408,17 +408,26 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {
/// Stores an option with the check-local name \p LocalName with
/// integer value \p Value to \p Options.
template <typename T>
- std::enable_if_t<std::is_integral_v<T>>
+ std::enable_if_t<std::is_integral_v<T> && std::is_signed<T>::value>
store(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
T Value) const {
storeInt(Options, LocalName, Value);
}
+ /// Stores an option with the check-local name \p LocalName with
+ /// unsigned integer value \p Value to \p Options.
+ template <typename T>
+ std::enable_if_t<std::is_unsigned<T>::value>
+ store(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
+ T Value) const {
+ storeUnsigned(Options, LocalName, Value);
+ }
+
/// Stores an option with the check-local name \p LocalName with
/// integer value \p Value to \p Options. If the value is empty
/// stores ``
template <typename T>
- std::enable_if_t<std::is_integral_v<T>>
+ std::enable_if_t<std::is_integral_v<T> && std::is_signed<T>::value>
store(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
std::optional<T> Value) const {
if (Value)
@@ -427,6 +436,18 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {
store(Options, LocalName, "none");
}
+ /// Stores an option with the check-local name \p LocalName with
+ /// unsigned integer value \p Value to \p Options.
+ template <typename T>
+ std::enable_if_t<std::is_unsigned<T>::value>
+ store(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
+ std::optional<T> Value) const {
+ if (Value)
+ storeUnsigned(Options, LocalName, *Value);
+ else
+ store(Options, LocalName, "none");
+ }
+
/// Stores an option with the check-local name \p LocalName as the string
/// representation of the Enum \p Value to \p Options.
///
@@ -470,6 +491,8 @@ class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {
void storeInt(ClangTidyOptions::OptionMap &Options, StringRef LocalName,
int64_t Value) const;
+ void storeUnsigned(ClangTidyOptions::OptionMap &Options,
+ StringRef LocalName, int64_t Value) const;
std::string NamePrefix;
const ClangTidyOptions::OptionMap &CheckOptions;
More information about the cfe-commits
mailing list