Change key of m_subparser_map and m_subparser_used to be a std::string to make clang -fsanitize=unsigned-integer-overflow happy

This commit is contained in:
Even Rouault 2024-03-11 22:30:20 +01:00
parent c4406e2479
commit 907b942db2
No known key found for this signature in database
GPG Key ID: 33EBBFC47B3DD87D

View File

@ -545,10 +545,9 @@ std::size_t get_levenshtein_distance(const StringType &s1,
} }
template <typename ValueType> template <typename ValueType>
std::string_view std::string get_most_similar_string(const std::map<std::string, ValueType> &map,
get_most_similar_string(const std::map<std::string_view, ValueType> &map, const std::string &input) {
const std::string_view input) { std::string most_similar{};
std::string_view most_similar{};
std::size_t min_distance = std::numeric_limits<std::size_t>::max(); std::size_t min_distance = std::numeric_limits<std::size_t>::max();
for (const auto &entry : map) { for (const auto &entry : map) {
@ -1586,11 +1585,12 @@ public:
if constexpr (std::is_same_v<T, Argument>) { if constexpr (std::is_same_v<T, Argument>) {
return (*this)[name]; return (*this)[name];
} else { } else {
auto subparser_it = m_subparser_map.find(name); std::string str_name(name);
auto subparser_it = m_subparser_map.find(str_name);
if (subparser_it != m_subparser_map.end()) { if (subparser_it != m_subparser_map.end()) {
return subparser_it->second->get(); return subparser_it->second->get();
} }
throw std::logic_error("No such subparser: " + std::string(name)); throw std::logic_error("No such subparser: " + str_name);
} }
} }
@ -1720,7 +1720,7 @@ public:
/* Getter that returns true if a subcommand is used. /* Getter that returns true if a subcommand is used.
*/ */
auto is_subcommand_used(std::string_view subcommand_name) const { auto is_subcommand_used(std::string_view subcommand_name) const {
return m_subparser_used.at(subcommand_name); return m_subparser_used.at(std::string(subcommand_name));
} }
/* Getter that returns true if a subcommand is used. /* Getter that returns true if a subcommand is used.
@ -1972,10 +1972,8 @@ private:
if (Argument::is_positional(current_argument, m_prefix_chars)) { if (Argument::is_positional(current_argument, m_prefix_chars)) {
if (positional_argument_it == std::end(m_positional_arguments)) { if (positional_argument_it == std::end(m_positional_arguments)) {
std::string_view maybe_command = current_argument;
// Check sub-parsers // Check sub-parsers
auto subparser_it = m_subparser_map.find(maybe_command); auto subparser_it = m_subparser_map.find(current_argument);
if (subparser_it != m_subparser_map.end()) { if (subparser_it != m_subparser_map.end()) {
// build list of remaining args // build list of remaining args
@ -1984,7 +1982,7 @@ private:
// invoke subparser // invoke subparser
m_is_parsed = true; m_is_parsed = true;
m_subparser_used[maybe_command] = true; m_subparser_used[current_argument] = true;
return subparser_it->second->get().parse_args( return subparser_it->second->get().parse_args(
unprocessed_arguments); unprocessed_arguments);
} }
@ -2075,10 +2073,8 @@ private:
if (Argument::is_positional(current_argument, m_prefix_chars)) { if (Argument::is_positional(current_argument, m_prefix_chars)) {
if (positional_argument_it == std::end(m_positional_arguments)) { if (positional_argument_it == std::end(m_positional_arguments)) {
std::string_view maybe_command = current_argument;
// Check sub-parsers // Check sub-parsers
auto subparser_it = m_subparser_map.find(maybe_command); auto subparser_it = m_subparser_map.find(current_argument);
if (subparser_it != m_subparser_map.end()) { if (subparser_it != m_subparser_map.end()) {
// build list of remaining args // build list of remaining args
@ -2087,7 +2083,7 @@ private:
// invoke subparser // invoke subparser
m_is_parsed = true; m_is_parsed = true;
m_subparser_used[maybe_command] = true; m_subparser_used[current_argument] = true;
return subparser_it->second->get().parse_known_args_internal( return subparser_it->second->get().parse_known_args_internal(
unprocessed_arguments); unprocessed_arguments);
} }
@ -2175,8 +2171,8 @@ private:
std::map<std::string, argument_it> m_argument_map; std::map<std::string, argument_it> m_argument_map;
std::string m_parser_path; std::string m_parser_path;
std::list<std::reference_wrapper<ArgumentParser>> m_subparsers; std::list<std::reference_wrapper<ArgumentParser>> m_subparsers;
std::map<std::string_view, argument_parser_it> m_subparser_map; std::map<std::string, argument_parser_it> m_subparser_map;
std::map<std::string_view, bool> m_subparser_used; std::map<std::string, bool> m_subparser_used;
std::vector<MutuallyExclusiveGroup> m_mutually_exclusive_groups; std::vector<MutuallyExclusiveGroup> m_mutually_exclusive_groups;
bool m_suppress = false; bool m_suppress = false;
}; };