From c4406e24799acc3a0a5a640adac812d7bc0c84f8 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 11 Mar 2024 22:09:39 +0100 Subject: [PATCH 1/2] Change key of m_argument_map to be a std::string to make clang -fsanitize=unsigned-integer-overflow happy --- include/argparse/argparse.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index ec06ba23..0591926e 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -1734,12 +1734,12 @@ class ArgumentParser { * @throws std::logic_error in case of an invalid argument name */ Argument &operator[](std::string_view arg_name) const { - auto it = m_argument_map.find(arg_name); + std::string name(arg_name); + auto it = m_argument_map.find(name); if (it != m_argument_map.end()) { return *(it->second); } if (!is_valid_prefix_char(arg_name.front())) { - std::string name(arg_name); const auto legal_prefix_char = get_any_valid_prefix_char(); const auto prefix = std::string(1, legal_prefix_char); @@ -2172,7 +2172,7 @@ class ArgumentParser { bool m_is_parsed = false; std::list m_positional_arguments; std::list m_optional_arguments; - std::map m_argument_map; + std::map m_argument_map; std::string m_parser_path; std::list> m_subparsers; std::map m_subparser_map; From 907b942db21094fe59f45b675f9bc3b037673605 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 11 Mar 2024 22:30:20 +0100 Subject: [PATCH 2/2] Change key of m_subparser_map and m_subparser_used to be a std::string to make clang -fsanitize=unsigned-integer-overflow happy --- include/argparse/argparse.hpp | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index 0591926e..c41cdb14 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -545,10 +545,9 @@ std::size_t get_levenshtein_distance(const StringType &s1, } template -std::string_view -get_most_similar_string(const std::map &map, - const std::string_view input) { - std::string_view most_similar{}; +std::string get_most_similar_string(const std::map &map, + const std::string &input) { + std::string most_similar{}; std::size_t min_distance = std::numeric_limits::max(); for (const auto &entry : map) { @@ -1586,11 +1585,12 @@ class ArgumentParser { if constexpr (std::is_same_v) { 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 @@ class ArgumentParser { /* 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 @@ class ArgumentParser { 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 @@ class ArgumentParser { // 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 @@ class ArgumentParser { 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 @@ class ArgumentParser { // 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 @@ class ArgumentParser { std::map m_argument_map; std::string m_parser_path; std::list> m_subparsers; - std::map m_subparser_map; - std::map m_subparser_used; + std::map m_subparser_map; + std::map m_subparser_used; std::vector m_mutually_exclusive_groups; bool m_suppress = false; };