Start fixing implicit truncations
authorChristopher Dykes <cdykes@fb.com>
Wed, 30 Nov 2016 19:17:39 +0000 (11:17 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Wed, 30 Nov 2016 19:23:35 +0000 (11:23 -0800)
Summary:
Truncations should be explicit, but for some reason, MSVC seems to be the only compiler that will warn you when you implicitly truncate integer or float values.
This allows Folly to be compiled with warnings 4018, 4242, 4244 and 4305 enabled.
Technically 4018 is a sign mismatch warning, but there was only one place it was being triggered so I included it anyways. The other 3 are warnings for implicit truncation.

There is one other implicit truncation warning that currently triggers in Folly, 4267, but there are a lot more places where that triggers so I'll do that in a separate diff.

Reviewed By: yfeldblum

Differential Revision: D4249471

fbshipit-source-id: e18a93d85856c998576934a6229c9edd1638a54e

folly/Conv.cpp
folly/IPAddress.cpp
folly/SocketAddress.cpp
folly/Uri.cpp
folly/detail/BitsDetail.h
folly/detail/FileUtilDetail.h
folly/experimental/bser/Dump.cpp
folly/experimental/io/HugePages.cpp
folly/io/async/AsyncSocket.cpp
folly/json.cpp

index 1e6da78aecd14f543ecf4821863e7ed9aeb47340..3e5214a879fa775ebcc424ea66a1332e9a1642f8 100644 (file)
@@ -549,7 +549,7 @@ inline Expected<Tgt, ConversionCode> digits_to(
   UT result = 0;
 
   for (; e - b >= 4; b += 4) {
-    result *= 10000;
+    result *= static_cast<UT>(10000);
     const int32_t r0 = shift1000[static_cast<size_t>(b[0])];
     const int32_t r1 = shift100[static_cast<size_t>(b[1])];
     const int32_t r2 = shift10[static_cast<size_t>(b[2])];
@@ -558,7 +558,7 @@ inline Expected<Tgt, ConversionCode> digits_to(
     if (sum >= OOR) {
       goto outOfRange;
     }
-    result += sum;
+    result += UT(sum);
   }
 
   switch (e - b) {
index c4a51007d58504c766ecb52a4dec4a6c31db770c..e1ac5b890d1b6f0765633911eff7c843f534d774 100644 (file)
@@ -419,7 +419,7 @@ IPAddress::longestCommonPrefix(const CIDRNetwork& one, const CIDRNetwork& two) {
   } else {
     throw std::invalid_argument("Unknown address family");
   }
-  return {IPAddress(0), 0};
+  return {IPAddress(0), uint8_t(0)};
 }
 
 [[noreturn]] void IPAddress::asV4Throw() const {
index 1107e0e0f54f628349d50833cc6bd756d902b315..9e0eb0e4148ac47c513bff32fe3cf33a642b1a22 100644 (file)
@@ -548,7 +548,7 @@ bool SocketAddress::prefixMatch(const SocketAddress& other,
   if (other.getFamily() != getFamily()) {
     return false;
   }
-  int mask_length = 128;
+  uint8_t mask_length = 128;
   switch (getFamily()) {
     case AF_INET:
       mask_length = 32;
index bc94a31fb33a6cd688225ee97e9354eee6f5dffd..f278619b58c626eefcf19b8f105a3aa25c9ab76c 100644 (file)
@@ -31,7 +31,7 @@ fbstring submatch(const boost::cmatch& m, size_t idx) {
 template <class String>
 void toLower(String& s) {
   for (auto& c : s) {
-    c = tolower(c);
+    c = char(tolower(c));
   }
 }
 
index d89a25ef608601076b161c183cccbe5a4f37369c..0613654721581ce8bedea4283e23fd76aac89978 100644 (file)
@@ -28,7 +28,7 @@ inline int popcount(unsigned int x) {
   return __popcnt(x);
 }
 inline int popcountll(unsigned long long x) {
-  return __popcnt64(x);
+  return int(__popcnt64(x));
 }
 #elif defined(__POPCNT__)
 
index bcebc5fc08f82b111c5a1be84c0e1295da0b1e53..5b70d65f28261d5c3f9479155fd81f782f8214e7 100644 (file)
@@ -38,7 +38,7 @@ ssize_t wrapNoInt(F f, Args... args) {
 }
 
 inline void incr(ssize_t /* n */) {}
-inline void incr(ssize_t n, off_t& offset) { offset += n; }
+inline void incr(ssize_t n, off_t& offset) { offset += off_t(n); }
 
 // Wrap call to read/pread/write/pwrite(fd, buf, count, offset?) to retry on
 // incomplete reads / writes.  The variadic argument magic is there to support
index ae820af2b9abf8d6a5ce4352cca929877145c7b2..078438d9c10a2cf4cb33eded66d4691778be5bb0 100644 (file)
@@ -198,7 +198,7 @@ std::unique_ptr<folly::IOBuf> toBserIOBuf(folly::dynamic const& dyn,
 
   // compute the length
   auto len = q.chainLength();
-  if (len > std::numeric_limits<int64_t>::max()) {
+  if (len > uint64_t(std::numeric_limits<int64_t>::max())) {
     throw std::range_error(folly::to<std::string>(
         "serialized data size ", len, " is too large to represent as BSER"));
   }
index 901571e99810dd8869c82e869ec22e4b80359012..656c7ea9d3621e04a6d413f56395db0b6c843160 100644 (file)
@@ -96,7 +96,7 @@ size_t parsePageSizeValue(StringPiece value) {
   }
   char c = '\0';
   if (match.length(2) != 0) {
-    c = tolower(value[match.position(2)]);
+    c = char(tolower(value[match.position(2)]));
   }
   StringPiece numStr(value.data() + match.position(1), match.length(1));
   size_t size = to<size_t>(numStr);
index a51e08ead9a13d828594ebf51f1f8fe8bb6c15e1..987dfa5af0ee52fdfcb6f848b0b70494eca7a70c 100644 (file)
@@ -126,7 +126,8 @@ class AsyncSocket::BytesWriteRequest : public AsyncSocket::WriteRequest {
     currentOp->iov_len -= partialBytes_;
 
     // Increment the totalBytesWritten_ count by bytesWritten_;
-    totalBytesWritten_ += bytesWritten_;
+    assert(bytesWritten_ >= 0);
+    totalBytesWritten_ += uint32_t(bytesWritten_);
   }
 
  private:
index 105b1ca7ff9264574fdd1ee0c9fb024ece10fa0b..0e6b01367764b855eade6c469aa81d151ddd3926 100644 (file)
@@ -552,7 +552,7 @@ dynamic parseNumber(Input& in) {
 }
 
 std::string decodeUnicodeEscape(Input& in) {
-  auto hexVal = [&] (char c) -> unsigned {
+  auto hexVal = [&] (int c) -> uint16_t {
     return c >= '0' && c <= '9' ? c - '0' :
            c >= 'a' && c <= 'f' ? c - 'a' + 10 :
            c >= 'A' && c <= 'F' ? c - 'A' + 10 :
@@ -645,7 +645,7 @@ std::string parseString(Input& in) {
       in.error("null byte in string");
     }
 
-    ret.push_back(*in);
+    ret.push_back(char(*in));
     ++in;
   }