JsonCpp не защищает от переполнения uint64 и ведет себя странно ⇐ C++
-
Anonymous
JsonCpp не защищает от переполнения uint64 и ведет себя странно
Я экспериментирую с JsonCpp и заметил странное поведение при достижении конца диапазона uint64.
Числа в диапазоне работают правильно. Числа выше диапазона, но между [2**64,2**64+2**10] возвращают 0. Числа выше 2**64+2**10 вызывают исключение.
Ожидается ли это? Могу ли я настроить JsonCpp для выполнения этих проверок за меня?
Заранее спасибо!
Ниже приведен фрагмент кода, демонстрирующий проблему.
#include #include #include #include интервал основной() { //std::string uint64Str = "1234"; // любое число в диапазоне [0, 2**64-1] работает правильно (печатает uint64Str) //std::string uint64Str = "18446744073709551615"; // любое число в диапазоне [0, 2**64-1] работает правильно, включая 2**64-1 (печатает uint64Str) //std::string uint64Str = "18446744073709551616"; //макс. uint64 + 1 напечатаем 0 //std::string uint64Str = "18446744073709551617"; //макс. uint64 + 2 напечатаем 0 // ... //std::string uint64Str = "18446744073709553663"; //макс. uint64 + 2048 напечатаем 0 //std::string uint64Str = "18446744073709553664"; //макс. uint64 + 2049 напечатаем 0 std::string uint64Str = "18446744073709553665"; //max uint64 + 2050 (или более) выдает экземпляр 'Json::LogicError' What(): double вне диапазона UInt64 Json::Корень значения; Json::Reader Reader; bool parsingResult = reader.parse("{\"key\":"+uint64Str+"}", root); std::cout
Я экспериментирую с JsonCpp и заметил странное поведение при достижении конца диапазона uint64.
Числа в диапазоне работают правильно. Числа выше диапазона, но между [2**64,2**64+2**10] возвращают 0. Числа выше 2**64+2**10 вызывают исключение.
Ожидается ли это? Могу ли я настроить JsonCpp для выполнения этих проверок за меня?
Заранее спасибо!
Ниже приведен фрагмент кода, демонстрирующий проблему.
#include #include #include #include интервал основной() { //std::string uint64Str = "1234"; // любое число в диапазоне [0, 2**64-1] работает правильно (печатает uint64Str) //std::string uint64Str = "18446744073709551615"; // любое число в диапазоне [0, 2**64-1] работает правильно, включая 2**64-1 (печатает uint64Str) //std::string uint64Str = "18446744073709551616"; //макс. uint64 + 1 напечатаем 0 //std::string uint64Str = "18446744073709551617"; //макс. uint64 + 2 напечатаем 0 // ... //std::string uint64Str = "18446744073709553663"; //макс. uint64 + 2048 напечатаем 0 //std::string uint64Str = "18446744073709553664"; //макс. uint64 + 2049 напечатаем 0 std::string uint64Str = "18446744073709553665"; //max uint64 + 2050 (или более) выдает экземпляр 'Json::LogicError' What(): double вне диапазона UInt64 Json::Корень значения; Json::Reader Reader; bool parsingResult = reader.parse("{\"key\":"+uint64Str+"}", root); std::cout
Мобильная версия