Fix integer parsing again
This commit is contained in:
parent
3e5ecf1d2a
commit
e17c6b0827
@ -29,6 +29,7 @@ THE SOFTWARE.
|
|||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <limits>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
@ -485,7 +486,7 @@ namespace cxxopts
|
|||||||
{
|
{
|
||||||
if (negative)
|
if (negative)
|
||||||
{
|
{
|
||||||
if (u > -static_cast<U>((std::numeric_limits<T>::min)()))
|
if (u > static_cast<U>((std::numeric_limits<T>::min)()))
|
||||||
{
|
{
|
||||||
throw argument_incorrect_type(text);
|
throw argument_incorrect_type(text);
|
||||||
}
|
}
|
||||||
@ -583,12 +584,13 @@ namespace cxxopts
|
|||||||
throw argument_incorrect_type(text);
|
throw argument_incorrect_type(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (umax - digit < result * base)
|
US next = result * base + digit;
|
||||||
|
if (result > next)
|
||||||
{
|
{
|
||||||
throw argument_incorrect_type(text);
|
throw argument_incorrect_type(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = result * base + digit;
|
result = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
detail::check_signed_range<T>(negative, result, text);
|
detail::check_signed_range<T>(negative, result, text);
|
||||||
|
|||||||
@ -408,6 +408,8 @@ TEST_CASE("Overflow on boundary", "[integer]")
|
|||||||
|
|
||||||
TEST_CASE("Integer overflow", "[options]")
|
TEST_CASE("Integer overflow", "[options]")
|
||||||
{
|
{
|
||||||
|
using namespace cxxopts::values;
|
||||||
|
|
||||||
cxxopts::Options options("reject_overflow", "rejects overflowing integers");
|
cxxopts::Options options("reject_overflow", "rejects overflowing integers");
|
||||||
options.add_options()
|
options.add_options()
|
||||||
("positional", "Integers", cxxopts::value<std::vector<int8_t>>());
|
("positional", "Integers", cxxopts::value<std::vector<int8_t>>());
|
||||||
@ -419,6 +421,10 @@ TEST_CASE("Integer overflow", "[options]")
|
|||||||
|
|
||||||
options.parse_positional("positional");
|
options.parse_positional("positional");
|
||||||
CHECK_THROWS_AS(options.parse(argc, argv), cxxopts::argument_incorrect_type&);
|
CHECK_THROWS_AS(options.parse(argc, argv), cxxopts::argument_incorrect_type&);
|
||||||
|
|
||||||
|
int integer = 0;
|
||||||
|
CHECK_THROWS_AS((integer_parser("23423423423", integer)), cxxopts::argument_incorrect_type&);
|
||||||
|
CHECK_THROWS_AS((integer_parser("234234234234", integer)), cxxopts::argument_incorrect_type&);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Floats", "[options]")
|
TEST_CASE("Floats", "[options]")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user