Boost精神不检查int溢出
Boost spirit do not check for int overflow
我正在尝试用 boost spirit 解析一些整数,我必须检查数据是否溢出,spirit 文档说所有整数解析器都会检查溢出,但是它只适用于无符号类型,如果我尝试解析有符号整数精神将不再检查溢出。
char const* b = "6600452345243524352340";
char const* e = b + strlen("6600452345243524352340");
int32_t res = 0;
bool valid = boost::spirit::qi::parse(b, e, boost::spirit::qi::int_, res);
std::cout << valid << " " << res << std::endl;
有没有办法对签名溢出进行精神检查?我使用的是 boost 1.55,gcc 4.9。
两者都检查溢出就好了:
#include <boost/spirit/include/qi.hpp>
#include <boost/multiprecision/cpp_int.hpp>
using boost::multiprecision::int128_t;
using boost::multiprecision::int256_t;
using boost::multiprecision::uint128_t;
using boost::multiprecision::uint256_t;
template <typename T>
bool try_parse(char const* s) {
auto b = s, e = b + strlen(s);
T res = 0;
namespace qi = boost::spirit::qi;
bool valid = qi::parse(b, e, qi::int_parser<T, 10>(), res);
if (!valid)
std::cout << "Unparsed (" << __PRETTY_FUNCTION__ << ")\n";
else
std::cout << "Valid: " << res << "(" << __PRETTY_FUNCTION__ << ")\n";;
if (b!=e)
std::cout << " --> remaining: '" << std::string(b,e) << "'\n";
return valid;
}
int main() {
try_parse<int8_t> ("6600452345243524352340");
try_parse<uint8_t> ("6600452345243524352340");
try_parse<int16_t> ("6600452345243524352340");
try_parse<uint16_t> ("6600452345243524352340");
try_parse<int32_t> ("6600452345243524352340");
try_parse<uint32_t> ("6600452345243524352340");
try_parse<int64_t> ("6600452345243524352340");
try_parse<uint64_t> ("6600452345243524352340");
try_parse<int128_t> ("6600452345243524352340");
try_parse<uint128_t> ("6600452345243524352340");
}
版画
Unparsed (bool try_parse(const char *) [T = signed char])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = unsigned char])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = short])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = unsigned short])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = int])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = unsigned int])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = long])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = unsigned long])
--> remaining: '6600452345243524352340'
Valid: 6600452345243524352340 (bool try_parse(const char *) [T = boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<128, 128, boost::multiprecision::cpp_integer_type::signed_magnitude, boost::multiprecision::cpp_int_check_type::unchecked, void>, boost::multiprecision::expression_template_option::et_off>])
Valid: 6600452345243524352340 (bool try_parse(const char *) [T = boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<128, 128, boost::multiprecision::cpp_integer_type::unsigned_magnitude, boost::multiprecision::cpp_int_check_type::unchecked, void>, boost::multiprecision::expression_template_option::et_off>])
我正在尝试用 boost spirit 解析一些整数,我必须检查数据是否溢出,spirit 文档说所有整数解析器都会检查溢出,但是它只适用于无符号类型,如果我尝试解析有符号整数精神将不再检查溢出。
char const* b = "6600452345243524352340";
char const* e = b + strlen("6600452345243524352340");
int32_t res = 0;
bool valid = boost::spirit::qi::parse(b, e, boost::spirit::qi::int_, res);
std::cout << valid << " " << res << std::endl;
有没有办法对签名溢出进行精神检查?我使用的是 boost 1.55,gcc 4.9。
两者都检查溢出就好了:
#include <boost/spirit/include/qi.hpp>
#include <boost/multiprecision/cpp_int.hpp>
using boost::multiprecision::int128_t;
using boost::multiprecision::int256_t;
using boost::multiprecision::uint128_t;
using boost::multiprecision::uint256_t;
template <typename T>
bool try_parse(char const* s) {
auto b = s, e = b + strlen(s);
T res = 0;
namespace qi = boost::spirit::qi;
bool valid = qi::parse(b, e, qi::int_parser<T, 10>(), res);
if (!valid)
std::cout << "Unparsed (" << __PRETTY_FUNCTION__ << ")\n";
else
std::cout << "Valid: " << res << "(" << __PRETTY_FUNCTION__ << ")\n";;
if (b!=e)
std::cout << " --> remaining: '" << std::string(b,e) << "'\n";
return valid;
}
int main() {
try_parse<int8_t> ("6600452345243524352340");
try_parse<uint8_t> ("6600452345243524352340");
try_parse<int16_t> ("6600452345243524352340");
try_parse<uint16_t> ("6600452345243524352340");
try_parse<int32_t> ("6600452345243524352340");
try_parse<uint32_t> ("6600452345243524352340");
try_parse<int64_t> ("6600452345243524352340");
try_parse<uint64_t> ("6600452345243524352340");
try_parse<int128_t> ("6600452345243524352340");
try_parse<uint128_t> ("6600452345243524352340");
}
版画
Unparsed (bool try_parse(const char *) [T = signed char])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = unsigned char])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = short])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = unsigned short])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = int])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = unsigned int])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = long])
--> remaining: '6600452345243524352340'
Unparsed (bool try_parse(const char *) [T = unsigned long])
--> remaining: '6600452345243524352340'
Valid: 6600452345243524352340 (bool try_parse(const char *) [T = boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<128, 128, boost::multiprecision::cpp_integer_type::signed_magnitude, boost::multiprecision::cpp_int_check_type::unchecked, void>, boost::multiprecision::expression_template_option::et_off>])
Valid: 6600452345243524352340 (bool try_parse(const char *) [T = boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<128, 128, boost::multiprecision::cpp_integer_type::unsigned_magnitude, boost::multiprecision::cpp_int_check_type::unchecked, void>, boost::multiprecision::expression_template_option::et_off>])