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>
std::string_view
get_most_similar_string(const std::map<std::string_view, ValueType> &map,
const std::string_view input) {
std::string_view most_similar{};
std::string get_most_similar_string(const std::map<std::string, ValueType> &map,
const std::string &input) {
std::string most_similar{};
std::size_t min_distance = std::numeric_limits<std::size_t>::max();
for (const auto &entry : map) {
@ -1586,11 +1585,12 @@ public:
if constexpr (std::is_same_v<T, Argument>) {
return (*this)[name];
} 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()) {
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.
*/
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.
@ -1972,10 +1972,8 @@ private:
if (Argument::is_positional(current_argument, m_prefix_chars)) {
if (positional_argument_it == std::end(m_positional_arguments)) {
std::string_view maybe_command = current_argument;
// 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()) {
// build list of remaining args
@ -1984,7 +1982,7 @@ private:
// invoke subparser
m_is_parsed = true;
m_subparser_used[maybe_command] = true;
m_subparser_used[current_argument] = true;
return subparser_it->second->get().parse_args(
unprocessed_arguments);
}
@ -2075,10 +2073,8 @@ private:
if (Argument::is_positional(current_argument, m_prefix_chars)) {
if (positional_argument_it == std::end(m_positional_arguments)) {
std::string_view maybe_command = current_argument;
// 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()) {
// build list of remaining args
@ -2087,7 +2083,7 @@ private:
// invoke subparser
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(
unprocessed_arguments);
}
@ -2175,8 +2171,8 @@ private:
std::map<std::string, argument_it> m_argument_map;
std::string m_parser_path;
std::list<std::reference_wrapper<ArgumentParser>> m_subparsers;
std::map<std::string_view, argument_parser_it> m_subparser_map;
std::map<std::string_view, bool> m_subparser_used;
std::map<std::string, argument_parser_it> m_subparser_map;
std::map<std::string, bool> m_subparser_used;
std::vector<MutuallyExclusiveGroup> m_mutually_exclusive_groups;
bool m_suppress = false;
};