diff --git a/include/flatbuffers/util.h b/include/flatbuffers/util.h index baf5bdd376aba856ecb654ce199cc999114d8a16..c6755ab8ef2325802adf199555df5047af5aa4c7 100644 --- a/include/flatbuffers/util.h +++ b/include/flatbuffers/util.h @@ -95,20 +95,20 @@ inline std::string IntToStringHex(int i, int xdigits) { } // Portable implementation of strtoll(). -inline int64_t StringToInt(const char *str, int base = 10) { +inline int64_t StringToInt(const char *str, char **endptr = nullptr, int base = 10) { #ifdef _MSC_VER - return _strtoi64(str, nullptr, base); + return _strtoi64(str, endptr, base); #else - return strtoll(str, nullptr, base); + return strtoll(str, endptr, base); #endif } // Portable implementation of strtoull(). -inline int64_t StringToUInt(const char *str, int base = 10) { +inline int64_t StringToUInt(const char *str, char **endptr = nullptr, int base = 10) { #ifdef _MSC_VER - return _strtoui64(str, nullptr, base); + return _strtoui64(str, endptr, base); #else - return strtoull(str, nullptr, base); + return strtoull(str, endptr, base); #endif } diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index d845b837dbdb688e10f4ca9de067851b14aed1f2..21cbed3f55bac78f0f322ce1bdcda9e7defcf7b9 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -219,7 +219,7 @@ CheckedError Parser::ParseHexNum(int nibbles, int64_t *val) { return Error("escape code must be followed by " + NumToString(nibbles) + " hex digits"); std::string target(cursor_, cursor_ + nibbles); - *val = StringToUInt(target.c_str(), 16); + *val = StringToUInt(target.c_str(), nullptr, 16); cursor_ += nibbles; return NoError(); } @@ -447,7 +447,7 @@ CheckedError Parser::Next() { cursor_++; while (isxdigit(static_cast<unsigned char>(*cursor_))) cursor_++; attribute_.append(start + 2, cursor_); - attribute_ = NumToString(StringToUInt(attribute_.c_str(), 16)); + attribute_ = NumToString(StringToUInt(attribute_.c_str(), nullptr, 16)); token_ = kTokenIntegerConstant; return NoError(); } @@ -1093,10 +1093,15 @@ CheckedError Parser::ParseSingleValue(Value &e) { NEXT(); } else { // Numeric constant in string. if (IsInteger(e.type.base_type)) { - // TODO(wvo): do we want to check for garbage after the number? - e.constant = NumToString(StringToInt(attribute_.c_str())); + char *end; + e.constant = NumToString(StringToInt(attribute_.c_str(), &end)); + if (*end) + return Error("invalid integer: " + attribute_); } else if (IsFloat(e.type.base_type)) { - e.constant = NumToString(strtod(attribute_.c_str(), nullptr)); + char *end; + e.constant = NumToString(strtod(attribute_.c_str(), &end)); + if (*end) + return Error("invalid float: " + attribute_); } else { assert(0); // Shouldn't happen, we covered all types. e.constant = "0";