THRIFT-4776:Modernize c++11 code by clang-tidy (#1732)

* use override
* use make_shared
* use emplace
* use range for
* fix error on MSVC
* replace boost functions with std functions
* fix static analyzer warnings
* check api return value
* initialize member
* check the return value of SSL_peek > 0
* add override
diff --git a/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.cpp b/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.cpp
index 952394b..0dac524 100644
--- a/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.cpp
+++ b/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.cpp
@@ -17,10 +17,11 @@
  * under the License.
  */
 
-#include <thrift/async/TConcurrentClientSyncInfo.h>
-#include <thrift/TApplicationException.h>
-#include <thrift/transport/TTransportException.h>
 #include <limits>
+#include <memory>
+#include <thrift/TApplicationException.h>
+#include <thrift/async/TConcurrentClientSyncInfo.h>
+#include <thrift/transport/TTransportException.h>
 
 namespace apache { namespace thrift { namespace async {
 
@@ -140,15 +141,15 @@
 {
   wakeupSomeone_ = true;
   stop_ = true;
-  for(auto i = seqidToMonitorMap_.begin(); i != seqidToMonitorMap_.end(); ++i)
-    i->second->notify();
+  for(auto & i : seqidToMonitorMap_)
+    i.second->notify();
 }
 
 TConcurrentClientSyncInfo::MonitorPtr
 TConcurrentClientSyncInfo::newMonitor_(const Guard &)
 {
   if(freeMonitors_.empty())
-    return MonitorPtr(new Monitor(&readMutex_));
+    return std::make_shared<Monitor>(&readMutex_);
   MonitorPtr retval;
   //swapping to avoid an atomic operation
   retval.swap(freeMonitors_.back());
diff --git a/lib/cpp/src/thrift/concurrency/ThreadFactory.cpp b/lib/cpp/src/thrift/concurrency/ThreadFactory.cpp
index 941b993..becb3b2 100644
--- a/lib/cpp/src/thrift/concurrency/ThreadFactory.cpp
+++ b/lib/cpp/src/thrift/concurrency/ThreadFactory.cpp
@@ -27,7 +27,7 @@
 namespace concurrency {
 
 std::shared_ptr<Thread> ThreadFactory::newThread(std::shared_ptr<Runnable> runnable) const {
-  std::shared_ptr<Thread> result = std::shared_ptr<Thread>(new Thread(isDetached(), runnable));
+  std::shared_ptr<Thread> result = std::make_shared<Thread>(isDetached(), runnable);
   runnable->thread(result);
   return result;
 }
diff --git a/lib/cpp/src/thrift/concurrency/ThreadManager.cpp b/lib/cpp/src/thrift/concurrency/ThreadManager.cpp
index c889660..25b838a 100644
--- a/lib/cpp/src/thrift/concurrency/ThreadManager.cpp
+++ b/lib/cpp/src/thrift/concurrency/ThreadManager.cpp
@@ -344,7 +344,7 @@
   std::set<shared_ptr<Thread> > newThreads;
   for (size_t ix = 0; ix < value; ix++) {
     shared_ptr<ThreadManager::Worker> worker
-        = shared_ptr<ThreadManager::Worker>(new ThreadManager::Worker(this));
+        = std::make_shared<ThreadManager::Worker>(this);
     newThreads.insert(threadFactory_->newThread(worker));
   }
 
@@ -352,13 +352,12 @@
   workerMaxCount_ += value;
   workers_.insert(newThreads.begin(), newThreads.end());
 
-  for (auto ix = newThreads.begin(); ix != newThreads.end();
-       ++ix) {
+  for (const auto & newThread : newThreads) {
     shared_ptr<ThreadManager::Worker> worker
-        = dynamic_pointer_cast<ThreadManager::Worker, Runnable>((*ix)->runnable());
+        = dynamic_pointer_cast<ThreadManager::Worker, Runnable>(newThread->runnable());
     worker->state_ = ThreadManager::Worker::STARTING;
-    (*ix)->start();
-    idMap_.insert(std::pair<const Thread::id_t, shared_ptr<Thread> >((*ix)->getId(), *ix));
+    newThread->start();
+    idMap_.insert(std::pair<const Thread::id_t, shared_ptr<Thread> >(newThread->getId(), newThread));
   }
 
   while (workerCount_ != workerMaxCount_) {
@@ -430,17 +429,15 @@
     workerMonitor_.wait();
   }
 
-  for (auto ix = deadWorkers_.begin();
-       ix != deadWorkers_.end();
-       ++ix) {
+  for (const auto & deadWorker : deadWorkers_) {
 
     // when used with a joinable thread factory, we join the threads as we remove them
     if (!threadFactory_->isDetached()) {
-      (*ix)->join();
+      deadWorker->join();
     }
 
-    idMap_.erase((*ix)->getId());
-    workers_.erase(*ix);
+    idMap_.erase(deadWorker->getId());
+    workers_.erase(deadWorker);
   }
 
   deadWorkers_.clear();
@@ -480,7 +477,7 @@
     }
   }
 
-  tasks_.push_back(shared_ptr<ThreadManager::Task>(new ThreadManager::Task(value, expiration)));
+  tasks_.push_back(std::make_shared<ThreadManager::Task>(value, expiration));
 
   // If idle thread is available notify it, otherwise all worker threads are
   // running and will get around to this task in time.
diff --git a/lib/cpp/src/thrift/concurrency/TimerManager.cpp b/lib/cpp/src/thrift/concurrency/TimerManager.cpp
index df59900..003f564 100644
--- a/lib/cpp/src/thrift/concurrency/TimerManager.cpp
+++ b/lib/cpp/src/thrift/concurrency/TimerManager.cpp
@@ -22,6 +22,7 @@
 
 #include <assert.h>
 #include <iostream>
+#include <memory>
 #include <set>
 
 namespace apache {
@@ -121,10 +122,8 @@
         }
       }
 
-      for (auto ix = expiredTasks.begin();
-           ix != expiredTasks.end();
-           ++ix) {
-        (*ix)->run();
+      for (const auto & expiredTask : expiredTasks) {
+        expiredTask->run();
       }
 
     } while (manager_->state_ == TimerManager::STARTED);
@@ -152,7 +151,7 @@
 TimerManager::TimerManager()
   : taskCount_(0),
     state_(TimerManager::UNINITIALIZED),
-    dispatcher_(shared_ptr<Dispatcher>(new Dispatcher(this))) {
+    dispatcher_(std::make_shared<Dispatcher>(this)) {
 }
 
 #if defined(_MSC_VER)
diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp
index 35592f0..28d0da2 100644
--- a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp
+++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp
@@ -20,8 +20,6 @@
 #include <thrift/protocol/TJSONProtocol.h>
 
 #include <boost/locale.hpp>
-#include <boost/math/special_functions/fpclassify.hpp>
-#include <boost/math/special_functions/sign.hpp>
 
 #include <cmath>
 #include <limits>
@@ -537,9 +535,9 @@
   std::string val;
 
   bool special = false;
-  switch (boost::math::fpclassify(num)) {
+  switch (std::fpclassify(num)) {
   case FP_INFINITE:
-    if (boost::math::signbit(num)) {
+    if (std::signbit(num)) {
       val = kThriftNegativeInfinity;
     } else {
       val = kThriftInfinity;
diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.h b/lib/cpp/src/thrift/protocol/TJSONProtocol.h
index 020e61c..420995e 100644
--- a/lib/cpp/src/thrift/protocol/TJSONProtocol.h
+++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.h
@@ -248,7 +248,7 @@
   class LookaheadReader {
 
   public:
-    LookaheadReader(TTransport& trans) : trans_(&trans), hasData_(false) {}
+    LookaheadReader(TTransport& trans) : trans_(&trans), hasData_(false), data_(0) {}
 
     uint8_t read() {
       if (hasData_) {
diff --git a/lib/cpp/src/thrift/qt/TQIODeviceTransport.cpp b/lib/cpp/src/thrift/qt/TQIODeviceTransport.cpp
index 78c3b39..1537fc6 100644
--- a/lib/cpp/src/thrift/qt/TQIODeviceTransport.cpp
+++ b/lib/cpp/src/thrift/qt/TQIODeviceTransport.cpp
@@ -46,7 +46,7 @@
   }
 }
 
-bool TQIODeviceTransport::isOpen() {
+bool TQIODeviceTransport::isOpen() const {
   return dev_->isOpen();
 }
 
diff --git a/lib/cpp/src/thrift/qt/TQIODeviceTransport.h b/lib/cpp/src/thrift/qt/TQIODeviceTransport.h
index e0cdd18..a3b511d 100644
--- a/lib/cpp/src/thrift/qt/TQIODeviceTransport.h
+++ b/lib/cpp/src/thrift/qt/TQIODeviceTransport.h
@@ -40,7 +40,7 @@
   ~TQIODeviceTransport() override;
 
   void open() override;
-  bool isOpen();
+  bool isOpen() const override;
   bool peek() override;
   void close() override;
 
diff --git a/lib/cpp/src/thrift/qt/TQTcpServer.cpp b/lib/cpp/src/thrift/qt/TQTcpServer.cpp
index bd39893..0404482 100644
--- a/lib/cpp/src/thrift/qt/TQTcpServer.cpp
+++ b/lib/cpp/src/thrift/qt/TQTcpServer.cpp
@@ -90,7 +90,7 @@
     }
 
     ctxMap_[connection.get()]
-        = shared_ptr<ConnectionContext>(new ConnectionContext(connection, transport, iprot, oprot));
+        = std::make_shared<ConnectionContext>(connection, transport, iprot, oprot);
 
     connect(connection.get(), SIGNAL(readyRead()), SLOT(beginDecode()));
 
diff --git a/lib/cpp/src/thrift/server/TNonblockingServer.cpp b/lib/cpp/src/thrift/server/TNonblockingServer.cpp
index 4e62324..eea0427 100644
--- a/lib/cpp/src/thrift/server/TNonblockingServer.cpp
+++ b/lib/cpp/src/thrift/server/TNonblockingServer.cpp
@@ -1074,8 +1074,8 @@
 
 void TNonblockingServer::stop() {
   // Breaks the event loop in all threads so that they end ASAP.
-  for (uint32_t i = 0; i < ioThreads_.size(); ++i) {
-    ioThreads_[i]->stop();
+  for (auto & ioThread : ioThreads_) {
+    ioThread->stop();
   }
 }
 
@@ -1162,10 +1162,13 @@
                                            bool useHighPriority)
   : server_(server),
     number_(number),
+    threadId_{},
     listenSocket_(listenSocket),
     useHighPriority_(useHighPriority),
     eventBase_(nullptr),
-    ownEventBase_(false) {
+    ownEventBase_(false),
+    serverEvent_{},
+    notificationEvent_{} {
   notificationPipeFDs_[0] = -1;
   notificationPipeFDs_[1] = -1;
 }
@@ -1186,13 +1189,13 @@
     listenSocket_ = THRIFT_INVALID_SOCKET;
   }
 
-  for (int i = 0; i < 2; ++i) {
-    if (notificationPipeFDs_[i] >= 0) {
-      if (0 != ::THRIFT_CLOSESOCKET(notificationPipeFDs_[i])) {
+  for (auto notificationPipeFD : notificationPipeFDs_) {
+    if (notificationPipeFD >= 0) {
+      if (0 != ::THRIFT_CLOSESOCKET(notificationPipeFD)) {
         GlobalOutput.perror("TNonblockingIOThread notificationPipe close(): ",
                             THRIFT_GET_SOCKET_ERROR);
       }
-      notificationPipeFDs_[i] = THRIFT_INVALID_SOCKET;
+      notificationPipeFD = THRIFT_INVALID_SOCKET;
     }
   }
 }
@@ -1208,13 +1211,13 @@
     ::THRIFT_CLOSESOCKET(notificationPipeFDs_[1]);
     throw TException("TNonblockingServer::createNotificationPipe() THRIFT_O_NONBLOCK");
   }
-  for (int i = 0; i < 2; ++i) {
+  for (auto notificationPipeFD : notificationPipeFDs_) {
 #if LIBEVENT_VERSION_NUMBER < 0x02000000
     int flags;
-    if ((flags = THRIFT_FCNTL(notificationPipeFDs_[i], F_GETFD, 0)) < 0
-        || THRIFT_FCNTL(notificationPipeFDs_[i], F_SETFD, flags | FD_CLOEXEC) < 0) {
+    if ((flags = THRIFT_FCNTL(notificationPipeFD, F_GETFD, 0)) < 0
+        || THRIFT_FCNTL(notificationPipeFD, F_SETFD, flags | FD_CLOEXEC) < 0) {
 #else
-    if (evutil_make_socket_closeonexec(notificationPipeFDs_[i]) < 0) {
+    if (evutil_make_socket_closeonexec(notificationPipeFD) < 0) {
 #endif
       ::THRIFT_CLOSESOCKET(notificationPipeFDs_[0]);
       ::THRIFT_CLOSESOCKET(notificationPipeFDs_[1]);
diff --git a/lib/cpp/src/thrift/transport/TBufferTransports.h b/lib/cpp/src/thrift/transport/TBufferTransports.h
index a008fa1..df06586 100644
--- a/lib/cpp/src/thrift/transport/TBufferTransports.h
+++ b/lib/cpp/src/thrift/transport/TBufferTransports.h
@@ -217,7 +217,7 @@
 
   void open() override { transport_->open(); }
 
-  bool isOpen() { return transport_->isOpen(); }
+  bool isOpen() const override { return transport_->isOpen(); }
 
   bool peek() override {
     if (rBase_ == rBound_) {
@@ -345,7 +345,7 @@
 
   void open() override { transport_->open(); }
 
-  bool isOpen() { return transport_->isOpen(); }
+  bool isOpen() const override { return transport_->isOpen(); }
 
   bool peek() override { return (rBase_ < rBound_) || transport_->peek(); }
 
@@ -550,7 +550,7 @@
     }
   }
 
-  bool isOpen() { return true; }
+  bool isOpen() const override { return true; }
 
   bool peek() override { return (rBase_ < wBase_); }
 
diff --git a/lib/cpp/src/thrift/transport/TFDTransport.h b/lib/cpp/src/thrift/transport/TFDTransport.h
index ede5ccb..a3cf519 100644
--- a/lib/cpp/src/thrift/transport/TFDTransport.h
+++ b/lib/cpp/src/thrift/transport/TFDTransport.h
@@ -53,7 +53,7 @@
     }
   }
 
-  bool isOpen() { return fd_ >= 0; }
+  bool isOpen() const override { return fd_ >= 0; }
 
   void open() override {}
 
diff --git a/lib/cpp/src/thrift/transport/TFileTransport.cpp b/lib/cpp/src/thrift/transport/TFileTransport.cpp
index 1eefb89..53e5136 100644
--- a/lib/cpp/src/thrift/transport/TFileTransport.cpp
+++ b/lib/cpp/src/thrift/transport/TFileTransport.cpp
@@ -977,7 +977,7 @@
     inputTransport_(inputTransport) {
 
   // default the output transport to a null transport (common case)
-  outputTransport_ = shared_ptr<TNullTransport>(new TNullTransport());
+  outputTransport_ = std::make_shared<TNullTransport>();
 }
 
 TFileProcessor::TFileProcessor(shared_ptr<TProcessor> processor,
@@ -990,7 +990,7 @@
     inputTransport_(inputTransport) {
 
   // default the output transport to a null transport (common case)
-  outputTransport_ = shared_ptr<TNullTransport>(new TNullTransport());
+  outputTransport_ = std::make_shared<TNullTransport>();
 }
 
 TFileProcessor::TFileProcessor(shared_ptr<TProcessor> processor,
diff --git a/lib/cpp/src/thrift/transport/THttpTransport.h b/lib/cpp/src/thrift/transport/THttpTransport.h
index 1cf36b2..75f0d8c 100644
--- a/lib/cpp/src/thrift/transport/THttpTransport.h
+++ b/lib/cpp/src/thrift/transport/THttpTransport.h
@@ -42,7 +42,7 @@
 
   void open() override { transport_->open(); }
 
-  bool isOpen() { return transport_->isOpen(); }
+  bool isOpen() const override { return transport_->isOpen(); }
 
   bool peek() override { return transport_->peek(); }
 
diff --git a/lib/cpp/src/thrift/transport/TNonblockingServerSocket.cpp b/lib/cpp/src/thrift/transport/TNonblockingServerSocket.cpp
index 51990b0..9902b90 100644
--- a/lib/cpp/src/thrift/transport/TNonblockingServerSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TNonblockingServerSocket.cpp
@@ -20,6 +20,7 @@
 #include <thrift/thrift-config.h>
 
 #include <cstring>
+#include <memory>
 #include <stdexcept>
 #include <sys/types.h>
 #ifdef HAVE_SYS_SOCKET_H
@@ -532,7 +533,7 @@
 }
 
 shared_ptr<TSocket> TNonblockingServerSocket::createSocket(THRIFT_SOCKET clientSocket) {
-  return shared_ptr<TSocket>(new TSocket(clientSocket));
+  return std::make_shared<TSocket>(clientSocket);
 }
 
 void TNonblockingServerSocket::close() {
diff --git a/lib/cpp/src/thrift/transport/TPipeServer.cpp b/lib/cpp/src/thrift/transport/TPipeServer.cpp
index 55c3580..47d8822 100644
--- a/lib/cpp/src/thrift/transport/TPipeServer.cpp
+++ b/lib/cpp/src/thrift/transport/TPipeServer.cpp
@@ -333,8 +333,22 @@
   SetEntriesInAcl(1, &ea, NULL, &acl);
 
   PSECURITY_DESCRIPTOR sd = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
-  InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION);
-  SetSecurityDescriptorDacl(sd, TRUE, acl, FALSE);
+  if (!InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION)) {
+    auto lastError = GetLastError();
+    LocalFree(sd);
+    LocalFree(acl);
+    GlobalOutput.perror("TPipeServer::InitializeSecurityDescriptor() GLE=", lastError);
+    throw TTransportException(TTransportException::NOT_OPEN, "InitializeSecurityDescriptor() failed",
+                              lastError);
+  }
+  if (!SetSecurityDescriptorDacl(sd, TRUE, acl, FALSE)) {
+    auto lastError = GetLastError();
+    LocalFree(sd);
+    LocalFree(acl);
+    GlobalOutput.perror("TPipeServer::SetSecurityDescriptorDacl() GLE=", lastError);
+    throw TTransportException(TTransportException::NOT_OPEN,
+                              "SetSecurityDescriptorDacl() failed", lastError);
+  }
 
   SECURITY_ATTRIBUTES sa;
   sa.nLength = sizeof(SECURITY_ATTRIBUTES);
@@ -353,7 +367,7 @@
                                      0,                    // client time-out
                                      &sa));                // security attributes
 
-  DWORD lastError = GetLastError();
+  auto lastError = GetLastError();
   LocalFree(sd);
   LocalFree(acl);
   FreeSid(everyone_sid);
@@ -364,7 +378,6 @@
     throw TTransportException(TTransportException::NOT_OPEN,
                               "TCreateNamedPipe() failed",
                 lastError);
-    return false;
   }
 
   Pipe_.reset(hPipe.release());
@@ -375,8 +388,17 @@
   SECURITY_ATTRIBUTES sa;
   SECURITY_DESCRIPTOR sd; // security information for pipes
 
-  InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
-  SetSecurityDescriptorDacl(&sd, true, NULL, false);
+  if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
+  {
+    GlobalOutput.perror("TPipeServer InitializeSecurityDescriptor (anon) failed, GLE=", GetLastError());
+    return false;
+  }
+  if (!SetSecurityDescriptorDacl(&sd, true, NULL, false))
+  {
+    GlobalOutput.perror("TPipeServer SetSecurityDescriptorDacl (anon) failed, GLE=",
+                        GetLastError());
+    return false;
+  }
   sa.lpSecurityDescriptor = &sd;
   sa.nLength = sizeof(SECURITY_ATTRIBUTES);
   sa.bInheritHandle = true; // allow passing handle to child
diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.cpp b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
index 636bb2d..b413002 100644
--- a/lib/cpp/src/thrift/transport/TSSLSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
@@ -19,9 +19,10 @@
 
 #include <thrift/thrift-config.h>
 
-#include <errno.h>
-#include <string>
 #include <cstring>
+#include <errno.h>
+#include <memory>
+#include <string>
 #ifdef HAVE_ARPA_INET_H
 #include <arpa/inet.h>
 #endif
@@ -266,7 +267,7 @@
   eventSafe_ = false;
 }
 
-bool TSSLSocket::isOpen() {
+bool TSSLSocket::isOpen() const {
   if (ssl_ == nullptr || !TSocket::isOpen()) {
     return false;
   }
@@ -291,11 +292,10 @@
   if (!checkHandshake())
     throw TSSLException("SSL_peek: Handshake is not completed");
   int rc;
-  uint8_t byte;
   do {
+    uint8_t byte;
     rc = SSL_peek(ssl_, &byte, 1);
     if (rc < 0) {
-
       int errno_copy = THRIFT_GET_SOCKET_ERROR;
       int error = SSL_get_error(ssl_, rc);
       switch (error) {
@@ -318,6 +318,8 @@
     } else if (rc == 0) {
       ERR_clear_error();
       break;
+    } else {
+      break;
     }
   } while (true);
   return (rc > 0);
@@ -857,7 +859,7 @@
     randomize();
   }
   count_++;
-  ctx_ = std::shared_ptr<SSLContext>(new SSLContext(protocol));
+  ctx_ = std::make_shared<SSLContext>(protocol);
 }
 
 TSSLSocketFactory::~TSSLSocketFactory() {
diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.h b/lib/cpp/src/thrift/transport/TSSLSocket.h
index 4d46998..87a9601 100644
--- a/lib/cpp/src/thrift/transport/TSSLSocket.h
+++ b/lib/cpp/src/thrift/transport/TSSLSocket.h
@@ -73,7 +73,7 @@
   /**
    * TTransport interface.
    */
-  bool isOpen();
+  bool isOpen() const override;
   bool peek() override;
   void open() override;
   void close() override;
diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp
index 1732c82..ece0544 100644
--- a/lib/cpp/src/thrift/transport/TServerSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp
@@ -20,6 +20,7 @@
 #include <thrift/thrift-config.h>
 
 #include <cstring>
+#include <memory>
 #include <stdexcept>
 #include <sys/types.h>
 #ifdef HAVE_SYS_SOCKET_H
@@ -641,9 +642,9 @@
 
 shared_ptr<TSocket> TServerSocket::createSocket(THRIFT_SOCKET clientSocket) {
   if (interruptableChildren_) {
-    return shared_ptr<TSocket>(new TSocket(clientSocket, pChildInterruptSockReader_));
+    return std::make_shared<TSocket>(clientSocket, pChildInterruptSockReader_);
   } else {
-    return shared_ptr<TSocket>(new TSocket(clientSocket));
+    return std::make_shared<TSocket>(clientSocket);
   }
 }
 
diff --git a/lib/cpp/src/thrift/transport/TShortReadTransport.h b/lib/cpp/src/thrift/transport/TShortReadTransport.h
index 2151606..185c78d 100644
--- a/lib/cpp/src/thrift/transport/TShortReadTransport.h
+++ b/lib/cpp/src/thrift/transport/TShortReadTransport.h
@@ -41,7 +41,7 @@
   TShortReadTransport(std::shared_ptr<TTransport> transport, double full_prob)
     : transport_(transport), fullProb_(full_prob) {}
 
-  bool isOpen() { return transport_->isOpen(); }
+  bool isOpen() const override { return transport_->isOpen(); }
 
   bool peek() override { return transport_->peek(); }
 
diff --git a/lib/cpp/src/thrift/transport/TSocketPool.cpp b/lib/cpp/src/thrift/transport/TSocketPool.cpp
index 89eee6e..b6e79d3 100644
--- a/lib/cpp/src/thrift/transport/TSocketPool.cpp
+++ b/lib/cpp/src/thrift/transport/TSocketPool.cpp
@@ -21,6 +21,7 @@
 
 #include <algorithm>
 #include <iostream>
+#include <memory>
 #if __cplusplus >= 201703L
 #include <random>
 #endif
@@ -94,8 +95,8 @@
     maxConsecutiveFailures_(1),
     randomize_(true),
     alwaysTryLast_(true) {
-  for (unsigned i = 0; i < servers.size(); ++i) {
-    addServer(servers[i].first, servers[i].second);
+  for (const auto & server : servers) {
+    addServer(server.first, server.second);
   }
 }
 
@@ -129,7 +130,7 @@
 }
 
 void TSocketPool::addServer(const string& host, int port) {
-  servers_.push_back(shared_ptr<TSocketPoolServer>(new TSocketPoolServer(host, port)));
+  servers_.push_back(std::make_shared<TSocketPoolServer>(host, port));
 }
 
 void TSocketPool::addServer(shared_ptr<TSocketPoolServer>& server) {
diff --git a/lib/cpp/src/thrift/transport/TTransportUtils.h b/lib/cpp/src/thrift/transport/TTransportUtils.h
index 6cff76a..28c93d2 100644
--- a/lib/cpp/src/thrift/transport/TTransportUtils.h
+++ b/lib/cpp/src/thrift/transport/TTransportUtils.h
@@ -46,7 +46,7 @@
 
   ~TNullTransport() override = default;
 
-  bool isOpen() { return true; }
+  bool isOpen() const override { return true; }
 
   void open() override {}
 
diff --git a/lib/cpp/src/thrift/transport/TZlibTransport.cpp b/lib/cpp/src/thrift/transport/TZlibTransport.cpp
index ddceb99..437190b 100644
--- a/lib/cpp/src/thrift/transport/TZlibTransport.cpp
+++ b/lib/cpp/src/thrift/transport/TZlibTransport.cpp
@@ -110,7 +110,7 @@
   delete wstream_;
 }
 
-bool TZlibTransport::isOpen() {
+bool TZlibTransport::isOpen() const {
   return (readAvail() > 0) || (rstream_->avail_in > 0) || transport_->isOpen();
 }
 
@@ -131,7 +131,7 @@
 // In standalone objects, we set input_ended_ to true when inflate returns
 // Z_STREAM_END.  This allows to make sure that a checksum was verified.
 
-inline int TZlibTransport::readAvail() {
+inline int TZlibTransport::readAvail() const {
   return urbuf_size_ - rstream_->avail_out - urpos_;
 }
 
diff --git a/lib/cpp/src/thrift/transport/TZlibTransport.h b/lib/cpp/src/thrift/transport/TZlibTransport.h
index be2d198..29afae0 100644
--- a/lib/cpp/src/thrift/transport/TZlibTransport.h
+++ b/lib/cpp/src/thrift/transport/TZlibTransport.h
@@ -138,7 +138,7 @@
    */
   ~TZlibTransport() override;
 
-  bool isOpen();
+  bool isOpen() const override;
   bool peek() override;
 
   void open() override { transport_->open(); }
@@ -185,7 +185,7 @@
 protected:
   inline void checkZlibRv(int status, const char* msg);
   inline void checkZlibRvNothrow(int status, const char* msg);
-  inline int readAvail();
+  inline int readAvail() const;
   void flushToTransport(int flush);
   void flushToZlib(const uint8_t* buf, int len, int flush);
   bool readFromZlib();
diff --git a/lib/cpp/test/TBufferBaseTest.cpp b/lib/cpp/test/TBufferBaseTest.cpp
index 430302c..7203f82 100644
--- a/lib/cpp/test/TBufferBaseTest.cpp
+++ b/lib/cpp/test/TBufferBaseTest.cpp
@@ -165,8 +165,8 @@
 
   // Repeatability.  Kind of.
   std::srand(42);
-  for (size_t i = 0; i < (sizeof(data)/sizeof(data[0])); ++i) {
-    data[i] = (uint8_t)rand();
+  for (unsigned char & i : data) {
+    i = (uint8_t)rand();
   }
 
   data_str.assign((char*)data, sizeof(data));
@@ -178,14 +178,14 @@
 BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_GetBuffer ) {
   init_data();
 
-  for (int d1 = 0; d1 < 3; d1++) {
+  for (auto & d1 : dist) {
     TMemoryBuffer buffer(16);
     int offset = 0;
     int index = 0;
 
     while (offset < 1<<15) {
-      buffer.write(&data[offset], dist[d1][index]);
-      offset += dist[d1][index];
+      buffer.write(&data[offset], d1[index]);
+      offset += d1[index];
       index++;
     }
 
@@ -197,8 +197,8 @@
 BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_Read ) {
   init_data();
 
-  for (int d1 = 0; d1 < 3; d1++) {
-    for (int d2 = 0; d2 < 3; d2++) {
+  for (auto & d1 : dist) {
+    for (auto & d2 : dist) {
       TMemoryBuffer buffer(16);
       uint8_t data_out[1<<15];
       int offset;
@@ -207,17 +207,17 @@
       offset = 0;
       index = 0;
       while (offset < 1<<15) {
-        buffer.write(&data[offset], dist[d1][index]);
-        offset += dist[d1][index];
+        buffer.write(&data[offset], d1[index]);
+        offset += d1[index];
         index++;
       }
 
       offset = 0;
       index = 0;
       while (offset < 1<<15) {
-        unsigned int got = buffer.read(&data_out[offset], dist[d2][index]);
-        BOOST_CHECK_EQUAL(got, dist[d2][index]);
-        offset += dist[d2][index];
+        unsigned int got = buffer.read(&data_out[offset], d2[index]);
+        BOOST_CHECK_EQUAL(got, d2[index]);
+        offset += d2[index];
         index++;
       }
 
@@ -229,8 +229,8 @@
 BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_ReadString ) {
   init_data();
 
-  for (int d1 = 0; d1 < 3; d1++) {
-    for (int d2 = 0; d2 < 3; d2++) {
+  for (auto & d1 : dist) {
+    for (auto & d2 : dist) {
       TMemoryBuffer buffer(16);
       string output;
       int offset;
@@ -239,17 +239,17 @@
       offset = 0;
       index = 0;
       while (offset < 1<<15) {
-        buffer.write(&data[offset], dist[d1][index]);
-        offset += dist[d1][index];
+        buffer.write(&data[offset], d1[index]);
+        offset += d1[index];
         index++;
       }
 
       offset = 0;
       index = 0;
       while (offset < 1<<15) {
-        unsigned int got = buffer.readAppendToString(output, dist[d2][index]);
-        BOOST_CHECK_EQUAL(got, dist[d2][index]);
-        offset += dist[d2][index];
+        unsigned int got = buffer.readAppendToString(output, d2[index]);
+        BOOST_CHECK_EQUAL(got, d2[index]);
+        offset += d2[index];
         index++;
       }
 
@@ -263,8 +263,8 @@
 
   // Do shorter writes and reads so we don't align to power-of-two boundaries.
 
-  for (int d1 = 0; d1 < 3; d1++) {
-    for (int d2 = 0; d2 < 3; d2++) {
+  for (auto & d1 : dist) {
+    for (auto & d2 : dist) {
       TMemoryBuffer buffer(16);
       uint8_t data_out[1<<15];
       int offset;
@@ -274,16 +274,16 @@
         offset = 0;
         index = 0;
         while (offset < (1<<15)-42) {
-          buffer.write(&data[offset], dist[d1][index]);
-          offset += dist[d1][index];
+          buffer.write(&data[offset], d1[index]);
+          offset += d1[index];
           index++;
         }
 
         offset = 0;
         index = 0;
         while (offset < (1<<15)-42) {
-          buffer.read(&data_out[offset], dist[d2][index]);
-          offset += dist[d2][index];
+          buffer.read(&data_out[offset], d2[index]);
+          offset += d2[index];
           index++;
         }
 
@@ -303,8 +303,8 @@
   // Pull the buffer out of the loop so its state gets worked harder.
   TMemoryBuffer buffer(16);
 
-  for (int d1 = 0; d1 < 3; d1++) {
-    for (int d2 = 0; d2 < 3; d2++) {
+  for (auto & d1 : dist) {
+    for (auto & d2 : dist) {
       uint8_t data_out[1<<15];
       int offset;
       int index;
@@ -313,16 +313,16 @@
         offset = 0;
         index = 0;
         while (offset < (1<<15)-42) {
-          buffer.write(&data[offset], dist[d1][index]);
-          offset += dist[d1][index];
+          buffer.write(&data[offset], d1[index]);
+          offset += d1[index];
           index++;
         }
 
         offset = 0;
         index = 0;
         while (offset < (1<<15)-42) {
-          buffer.read(&data_out[offset], dist[d2][index]);
-          offset += dist[d2][index];
+          buffer.read(&data_out[offset], d2[index]);
+          offset += d2[index];
           index++;
         }
 
@@ -341,8 +341,8 @@
   // Do shorter writes and reads so we don't align to power-of-two boundaries.
   // Pull the buffer out of the loop so its state gets worked harder.
 
-  for (int d1 = 0; d1 < 3; d1++) {
-    for (int d2 = 0; d2 < 3; d2++) {
+  for (auto & d1 : dist) {
+    for (auto & d2 : dist) {
       TMemoryBuffer buffer(16);
       uint8_t data_out[1<<13];
 
@@ -350,7 +350,7 @@
       int write_index = 0;
       unsigned int to_write = (1<<14)-42;
       while (to_write > 0) {
-        int write_amt = (std::min)(dist[d1][write_index], to_write);
+        int write_amt = (std::min)(d1[write_index], to_write);
         buffer.write(&data[write_offset], write_amt);
         write_offset += write_amt;
         write_index++;
@@ -361,7 +361,7 @@
       int read_index = 0;
       unsigned int to_read = (1<<13)-42;
       while (to_read > 0) {
-        int read_amt = (std::min)(dist[d2][read_index], to_read);
+        int read_amt = (std::min)(d2[read_index], to_read);
         int got = buffer.read(&data_out[read_offset], read_amt);
         BOOST_CHECK_EQUAL(got, read_amt);
         read_offset += read_amt;
@@ -375,7 +375,7 @@
       int second_index = write_index-1;
       unsigned int to_second = (1<<14)+42;
       while (to_second > 0) {
-        int second_amt = (std::min)(dist[d1][second_index], to_second);
+        int second_amt = (std::min)(d1[second_index], to_second);
         //printf("%d\n", second_amt);
         buffer.write(&data[second_offset], second_amt);
         second_offset += second_amt;
@@ -399,17 +399,16 @@
     1<<14, 1<<17,
   };
 
-  for (size_t i = 0; i < sizeof (sizes) / sizeof (sizes[0]); i++) {
-    int size = sizes[i];
-    for (int d1 = 0; d1 < 3; d1++) {
+  for (int size : sizes) {
+    for (auto & d1 : dist) {
       shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(16));
       TBufferedTransport trans(buffer, size);
 
       int offset = 0;
       int index = 0;
       while (offset < 1<<15) {
-        trans.write(&data[offset], dist[d1][index]);
-        offset += dist[d1][index];
+        trans.write(&data[offset], d1[index]);
+        offset += d1[index];
         index++;
       }
       trans.flush();
@@ -430,9 +429,8 @@
     1<<14, 1<<17,
   };
 
-  for (size_t i = 0; i < sizeof (sizes) / sizeof (sizes[0]); i++) {
-    int size = sizes[i];
-    for (int d1 = 0; d1 < 3; d1++) {
+  for (int size : sizes) {
+    for (auto & d1 : dist) {
       shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(data, sizeof(data)));
       TBufferedTransport trans(buffer, size);
       uint8_t data_out[1<<15];
@@ -443,8 +441,8 @@
         // Note: this doesn't work with "read" because TBufferedTransport
         // doesn't try loop over reads, so we get short reads.  We don't
         // check the return value, so that messes us up.
-        trans.readAll(&data_out[offset], dist[d1][index]);
-        offset += dist[d1][index];
+        trans.readAll(&data_out[offset], d1[index]);
+        offset += d1[index];
         index++;
       }
 
@@ -463,9 +461,8 @@
     1<<14, 1<<17,
   };
 
-  for (size_t i = 0; i < sizeof (sizes) / sizeof (sizes[0]); i++) {
-    int size = sizes[i];
-    for (int d1 = 0; d1 < 3; d1++) {
+  for (int size : sizes) {
+    for (auto & d1 : dist) {
       shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(data, sizeof(data)));
       shared_ptr<TShortReadTransport> tshort(new TShortReadTransport(buffer, 0.125));
       TBufferedTransport trans(buffer, size);
@@ -477,8 +474,8 @@
         // Note: this doesn't work with "read" because TBufferedTransport
         // doesn't try loop over reads, so we get short reads.  We don't
         // check the return value, so that messes us up.
-        trans.readAll(&data_out[offset], dist[d1][index]);
-        offset += dist[d1][index];
+        trans.readAll(&data_out[offset], d1[index]);
+        offset += d1[index];
         index++;
       }
 
@@ -497,17 +494,16 @@
     1<<14, 1<<17,
   };
 
-  for (size_t i = 0; i < sizeof (sizes) / sizeof (sizes[0]); i++) {
-    int size = sizes[i];
-    for (int d1 = 0; d1 < 3; d1++) {
+  for (int size : sizes) {
+    for (auto & d1 : dist) {
       shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(16));
       TFramedTransport trans(buffer, size);
 
       int offset = 0;
       int index = 0;
       while (offset < 1<<15) {
-        trans.write(&data[offset], dist[d1][index]);
-        offset += dist[d1][index];
+        trans.write(&data[offset], d1[index]);
+        offset += d1[index];
         index++;
       }
       trans.flush();
@@ -526,7 +522,7 @@
 BOOST_AUTO_TEST_CASE( test_FramedTransport_Read ) {
   init_data();
 
-  for (int d1 = 0; d1 < 3; d1++) {
+  for (auto & d1 : dist) {
     uint8_t data_out[1<<15];
     shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer());
     TFramedTransport trans(buffer);
@@ -539,8 +535,8 @@
     int index = 0;
     while (offset < 1<<15) {
       // This should work with read because we have one huge frame.
-      trans.read(&data_out[offset], dist[d1][index]);
-      offset += dist[d1][index];
+      trans.read(&data_out[offset], d1[index]);
+      offset += d1[index];
       index++;
     }
 
@@ -560,11 +556,9 @@
 
   int probs[] = { 1, 2, 4, 8, 16, 32, };
 
-  for (size_t i = 0; i < sizeof (sizes) / sizeof (sizes[0]); i++) {
-    int size = sizes[i];
-    for (size_t j = 0; j < sizeof (probs) / sizeof (probs[0]); j++) {
-      int prob = probs[j];
-      for (int d1 = 0; d1 < 3; d1++) {
+  for (int size : sizes) {
+    for (int prob : probs) {
+      for (auto & d1 : dist) {
         shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(16));
         TFramedTransport trans(buffer, size);
         std::vector<uint8_t> data_out(1<<17, 0);
@@ -574,9 +568,9 @@
         int write_index = 0;
         int flush_size = 0;
         while (write_offset < 1<<15) {
-          trans.write(&data[write_offset], dist[d1][write_index]);
-          write_offset += dist[d1][write_index];
-          flush_size += dist[d1][write_index];
+          trans.write(&data[write_offset], d1[write_index]);
+          write_offset += d1[write_index];
+          flush_size += d1[write_index];
           write_index++;
           if (flush_size > 0 && rand()%prob == 0) {
             flush_sizes.push_back(flush_size);
@@ -593,8 +587,7 @@
         int read_offset = 0;
         int read_index = 0;
 
-        for (unsigned int k = 0; k < flush_sizes.size(); k++) {
-          int fsize = flush_sizes[k];
+        for (int fsize : flush_sizes) {
           // We are exploiting an implementation detail of TFramedTransport.
           // The read buffer starts empty and it will never do more than one
           // readFrame per read, so we should always get exactly one frame.
diff --git a/lib/cpp/test/TFileTransportTest.cpp b/lib/cpp/test/TFileTransportTest.cpp
index ad32185..21c1f3b 100644
--- a/lib/cpp/test/TFileTransportTest.cpp
+++ b/lib/cpp/test/TFileTransportTest.cpp
@@ -279,12 +279,12 @@
   BOOST_WARN_GE(calls->size(), static_cast<FsyncLog::CallList::size_type>(1));
 
   const struct timeval* prev_time = nullptr;
-  for (auto it = calls->begin(); it != calls->end(); ++it) {
+  for (const auto & call : *calls) {
     if (prev_time) {
-      int delta = time_diff(prev_time, &it->time);
+      int delta = time_diff(prev_time, &call.time);
       BOOST_WARN( delta < max_allowed_delta );
     }
-    prev_time = &it->time;
+    prev_time = &call.time;
   }
 }
 
diff --git a/lib/cpp/test/TMemoryBufferTest.cpp b/lib/cpp/test/TMemoryBufferTest.cpp
index 9206872..42f9711 100644
--- a/lib/cpp/test/TMemoryBufferTest.cpp
+++ b/lib/cpp/test/TMemoryBufferTest.cpp
@@ -81,9 +81,9 @@
 }
 
 BOOST_AUTO_TEST_CASE(test_readAppendToString) {
-  string* str1 = new string("abcd1234");
-  TMemoryBuffer buf((uint8_t*)str1->data(),
-                    static_cast<uint32_t>(str1->length()),
+  string str1 = "abcd1234";
+  TMemoryBuffer buf((uint8_t*)str1.data(),
+                    static_cast<uint32_t>(str1.length()),
                     TMemoryBuffer::COPY);
 
   string str3 = "wxyz", str4 = "6789";
diff --git a/lib/cpp/test/TNonblockingSSLServerTest.cpp b/lib/cpp/test/TNonblockingSSLServerTest.cpp
index d0d8688..dc40c12 100644
--- a/lib/cpp/test/TNonblockingSSLServerTest.cpp
+++ b/lib/cpp/test/TNonblockingSSLServerTest.cpp
@@ -151,7 +151,7 @@
     std::shared_ptr<transport::TNonblockingSSLServerSocket> socket;
     Mutex mutex_;
 
-    Runner() {
+    Runner():port(0) {
       listenHandler.reset(new ListenEventHandler(&mutex_));
     }
 
diff --git a/lib/cpp/test/TNonblockingServerTest.cpp b/lib/cpp/test/TNonblockingServerTest.cpp
index 434217e..f9aab4c 100644
--- a/lib/cpp/test/TNonblockingServerTest.cpp
+++ b/lib/cpp/test/TNonblockingServerTest.cpp
@@ -83,6 +83,7 @@
     Mutex mutex_;
 
     Runner() {
+      port = 0;
       listenHandler.reset(new ListenEventHandler(&mutex_));
     }
 
diff --git a/lib/cpp/test/TServerTransportTest.cpp b/lib/cpp/test/TServerTransportTest.cpp
index 15177a8..18a393e 100644
--- a/lib/cpp/test/TServerTransportTest.cpp
+++ b/lib/cpp/test/TServerTransportTest.cpp
@@ -39,7 +39,7 @@
 
 protected:
   shared_ptr<TTransport> acceptImpl() override {
-    return valid_ ? shared_ptr<TestTTransport>(new TestTTransport)
+    return valid_ ? std::make_shared<TestTTransport>()
                   : shared_ptr<TestTTransport>();
   }
 };
diff --git a/lib/cpp/test/TransportTest.cpp b/lib/cpp/test/TransportTest.cpp
index b0c84b6..a890aa8 100644
--- a/lib/cpp/test/TransportTest.cpp
+++ b/lib/cpp/test/TransportTest.cpp
@@ -140,8 +140,8 @@
   std::shared_ptr<Transport_> out;
 
 private:
-  CoupledTransports(const CoupledTransports&);
-  CoupledTransports& operator=(const CoupledTransports&);
+  CoupledTransports(const CoupledTransports&) = delete;
+  CoupledTransports& operator=(const CoupledTransports&) = delete;
 };
 
 /**
diff --git a/lib/cpp/test/concurrency/Tests.cpp b/lib/cpp/test/concurrency/Tests.cpp
index f2b0111..8c734c2 100644
--- a/lib/cpp/test/concurrency/Tests.cpp
+++ b/lib/cpp/test/concurrency/Tests.cpp
@@ -31,8 +31,6 @@
 
 int main(int argc, char** argv) {
 
-  std::string arg;
-
   std::vector<std::string> args(argc - 1 > 1 ? argc - 1 : 1);
 
   args[0] = "all";