#ifndef FOLLY_VARINT_H_
#define FOLLY_VARINT_H_
-#include "folly/Range.h"
+#include <folly/Range.h>
namespace folly {
const int8_t* p = begin;
uint64_t val = 0;
- if (LIKELY(end - begin >= kMaxVarintLength64)) { // fast path
+ // end is always greater than or equal to begin, so this subtraction is safe
+ if (LIKELY(size_t(end - begin) >= kMaxVarintLength64)) { // fast path
int64_t b;
do {
b = *p++; val = (b & 0x7f) ; if (b >= 0) break;
b = *p++; val |= (b & 0x7f) << 49; if (b >= 0) break;
b = *p++; val |= (b & 0x7f) << 56; if (b >= 0) break;
b = *p++; val |= (b & 0x7f) << 63; if (b >= 0) break;
- throw std::invalid_argument("Invalid varint value"); // too big
+ throw std::invalid_argument("Invalid varint value. Too big.");
} while (false);
} else {
int shift = 0;
val |= static_cast<uint64_t>(*p++ & 0x7f) << shift;
shift += 7;
}
- if (p == end) throw std::invalid_argument("Invalid varint value");
+ if (p == end) {
+ throw std::invalid_argument("Invalid varint value. Too small: " +
+ std::to_string(end - begin) + " bytes");
+ }
val |= static_cast<uint64_t>(*p++) << shift;
}
} // namespaces
#endif /* FOLLY_VARINT_H_ */
-