This is an automated email from the ASF dual-hosted git repository.

wasphin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git


The following commit(s) were added to refs/heads/master by this push:
     new 7f8120a5 Refactor NULL with nullptr in brpc/details (#3457)
7f8120a5 is described below

commit 7f8120a5835359823d8c384fd1d534a054bac4e2
Author: Bright Chen <[email protected]>
AuthorDate: Tue Aug 18 13:47:41 2026 +0800

    Refactor NULL with nullptr in brpc/details (#3457)
---
 src/brpc/details/controller_private_accessor.h |   2 +-
 src/brpc/details/has_epollrdhup.cpp            |   3 +-
 src/brpc/details/health_check.cpp              |   8 +-
 src/brpc/details/hpack.cpp                     |  34 +++---
 src/brpc/details/http_message.cpp              |  38 +++---
 src/brpc/details/http_message.h                |  12 +-
 src/brpc/details/http_parser.cpp               |   4 +-
 src/brpc/details/jemalloc_profiler.cpp         |   2 +-
 src/brpc/details/mesalink_ssl_helper.cpp       |  46 ++++----
 src/brpc/details/method_status.cpp             |   2 +-
 src/brpc/details/method_status.h               |   8 +-
 src/brpc/details/naming_service_thread.cpp     |  64 +++++-----
 src/brpc/details/naming_service_thread.h       |   2 +-
 src/brpc/details/server_private_accessor.h     |   4 +-
 src/brpc/details/sparse_minute_counter.h       |   4 +-
 src/brpc/details/ssl_helper.cpp                | 156 ++++++++++++-------------
 src/brpc/details/ssl_helper.h                  |   2 +-
 src/brpc/details/tcmalloc_extension.cpp        |   8 +-
 src/brpc/details/tcmalloc_extension.h          |  10 +-
 src/brpc/details/usercode_backup_pool.cpp      |  14 +--
 20 files changed, 206 insertions(+), 217 deletions(-)

diff --git a/src/brpc/details/controller_private_accessor.h 
b/src/brpc/details/controller_private_accessor.h
index 07a071bd..ea0d30e1 100644
--- a/src/brpc/details/controller_private_accessor.h
+++ b/src/brpc/details/controller_private_accessor.h
@@ -63,7 +63,7 @@ public:
     }
 
     void move_in_server_receiving_sock(SocketUniquePtr& ptr) {
-        CHECK(_cntl->_current_call.sending_sock == NULL);
+        CHECK(_cntl->_current_call.sending_sock == nullptr);
         _cntl->_current_call.sending_sock.reset(ptr.release());
     }
 
diff --git a/src/brpc/details/has_epollrdhup.cpp 
b/src/brpc/details/has_epollrdhup.cpp
index dd085ad8..9a49f56b 100644
--- a/src/brpc/details/has_epollrdhup.cpp
+++ b/src/brpc/details/has_epollrdhup.cpp
@@ -41,8 +41,7 @@ static unsigned int check_epollrdhup() {
     if (socketpair(AF_UNIX, SOCK_STREAM, 0, (int*)fds) < 0) {
         return 0;
     }
-    epoll_event evt = { static_cast<uint32_t>(EPOLLIN | EPOLLRDHUP | EPOLLET),
-                        { NULL }};
+    epoll_event evt = { static_cast<uint32_t>(EPOLLIN | EPOLLRDHUP | EPOLLET), 
{ nullptr }};
     if (epoll_ctl(epfd, EPOLL_CTL_ADD, fds[0], &evt) < 0) {
         return 0;
     }
diff --git a/src/brpc/details/health_check.cpp 
b/src/brpc/details/health_check.cpp
index 7cf4e32b..5bb3b023 100644
--- a/src/brpc/details/health_check.cpp
+++ b/src/brpc/details/health_check.cpp
@@ -100,8 +100,8 @@ void* HealthCheckManager::AppCheck(void* arg) {
     done->cntl.http_request().uri() = done->hc_option.health_check_path;
     ControllerPrivateAccessor(&done->cntl).set_health_check_call();
     done->last_check_time_ms = butil::cpuwide_time_ms();
-    done->channel.CallMethod(NULL, &done->cntl, NULL, NULL, done);
-    return NULL;
+    done->channel.CallMethod(nullptr, &done->cntl, nullptr, nullptr, done);
+    return nullptr;
 }
 
 void OnAppHealthCheckDone::Run() {
@@ -187,10 +187,10 @@ bool HealthCheckTask::OnTriggeringTask(timespec* 
next_abstime) {
         }
     }
 
-    // g_vars must not be NULL because it is newed at the creation of
+    // g_vars must not be nullptr because it is newed at the creation of
     // first Socket. When g_vars is used, the socket is at health-checking
     // state, which means the socket must be created and then g_vars can
-    // not be NULL.
+    // not be nullptr.
     g_vars->nhealthcheck << 1;
     int hc = 0;
     if (ptr->_user) {
diff --git a/src/brpc/details/hpack.cpp b/src/brpc/details/hpack.cpp
index e627e81d..c9c707c9 100644
--- a/src/brpc/details/hpack.cpp
+++ b/src/brpc/details/hpack.cpp
@@ -38,7 +38,7 @@ struct IndexTableOptions {
     IndexTableOptions()
         : max_size(0)
         , start_index(0)
-        , static_table(NULL)
+        , static_table(nullptr)
         , static_table_size(0)
         , need_indexes(false)
     {}
@@ -83,7 +83,7 @@ public:
 
     const Header* HeaderAt(int index) const {
         if (BAIDU_UNLIKELY(index < _start_index)) {
-            return NULL;
+            return nullptr;
         }
         return _header_queue.bottom(index - _start_index);
     };
@@ -319,10 +319,10 @@ public:
 
     const HuffmanNode* node(NodeId id) const {
         if (id == 0u) {
-            return NULL;
+            return nullptr;
         }
         if (id > _node_memory.size()) {
-            return NULL;
+            return nullptr;
         }
         return &_node_memory[id - 1];
     }
@@ -386,7 +386,7 @@ public:
         _out->push_back(_partial_byte);
         _partial_byte = 0;
         _remain_bit = 0;
-        _out = NULL;
+        _out = nullptr;
         ++_out_bytes;
     }
 
@@ -496,8 +496,8 @@ inline void EncodeInteger(butil::IOBufAppender* out, 
uint8_t msb,
 }
 
 // Static variables
-static HuffmanTree* s_huffman_tree = NULL;
-static IndexTable* s_static_table = NULL;
+static HuffmanTree* s_huffman_tree = nullptr;
+static IndexTable* s_static_table = nullptr;
 static pthread_once_t s_create_once = PTHREAD_ONCE_INIT;
 
 static void CreateStaticTableOrDie() {
@@ -530,7 +530,7 @@ static const size_t MAX_HPACK_INTEGER = 10 * 1024 * 1024ul;
 
 inline ssize_t DecodeInteger(butil::IOBufBytesIterator& iter,
                              uint8_t prefix_size, uint32_t* value) {
-    if (iter == NULL) {
+    if (iter == nullptr) {
         return 0; // No enough data
     }
     uint8_t first_byte = *iter;
@@ -615,7 +615,7 @@ inline void EncodeString(butil::IOBufAppender* out, const 
std::string& s,
 }
 
 inline ssize_t DecodeString(butil::IOBufBytesIterator& iter, std::string* out) 
{
-    if (iter == NULL) {
+    if (iter == nullptr) {
         return 0;
     }
     const bool huffman = *iter & 0x80;
@@ -634,7 +634,7 @@ inline ssize_t DecodeString(butil::IOBufBytesIterator& 
iter, std::string* out) {
         return in_bytes;
     }
     HuffmanDecoder d(out, s_huffman_tree);
-    for (; iter != NULL && length; ++iter, --length) {
+    for (; iter != nullptr && length; ++iter, --length) {
         if (d.Decode(*iter) != 0) {
             return -1;
         }
@@ -646,19 +646,19 @@ inline ssize_t DecodeString(butil::IOBufBytesIterator& 
iter, std::string* out) {
 }
 
 HPacker::HPacker()
-    : _encode_table(NULL)
-    , _decode_table(NULL) {
+    : _encode_table(nullptr)
+    , _decode_table(nullptr) {
     CreateStaticTableOnceOrDie();
 }
 
 HPacker::~HPacker() {
     if (_encode_table) {
         delete _encode_table;
-        _encode_table = NULL;
+        _encode_table = nullptr;
     }
     if (_decode_table) {
         delete _decode_table;
-        _decode_table = NULL;
+        _decode_table = nullptr;
     }
 }
 
@@ -752,7 +752,7 @@ inline ssize_t HPacker::DecodeWithKnownPrefix(
     }
     if (index != 0) {
         const Header* indexed_header = HeaderAt(index);
-        if (indexed_header == NULL) {
+        if (indexed_header == nullptr) {
             LOG(ERROR) << "No header at index=" << index;
             return -1;
         }
@@ -776,7 +776,7 @@ inline ssize_t HPacker::DecodeWithKnownPrefix(
 ssize_t HPacker::Decode(butil::IOBufBytesIterator& iter, Header* h) {
     ssize_t skipped_bytes = 0;
 decode_next:
-    if (iter == NULL) {
+    if (iter == nullptr) {
         return 0;
     }
     const uint8_t first_byte = *iter;
@@ -799,7 +799,7 @@ decode_next:
                 return index_bytes;
             }
             const Header* indexed_header = HeaderAt(index);
-            if (indexed_header == NULL) {
+            if (indexed_header == nullptr) {
                 LOG(ERROR) << "No header at index=" << index;
                 return -1;
             }
diff --git a/src/brpc/details/http_message.cpp 
b/src/brpc/details/http_message.cpp
index 003bafa0..13beb67a 100644
--- a/src/brpc/details/http_message.cpp
+++ b/src/brpc/details/http_message.cpp
@@ -117,7 +117,7 @@ int HttpMessage::on_header_value(http_parser *parser,
     }
     if (FLAGS_http_verbose) {
         butil::IOBufBuilder* vs = http_message->_vmsgbuilder.get();
-        if (vs == NULL) {
+        if (vs == nullptr) {
             vs = new butil::IOBufBuilder;
             http_message->_vmsgbuilder.reset(vs);
             if (parser->type == HTTP_REQUEST) {
@@ -177,7 +177,7 @@ int HttpMessage::on_headers_complete(http_parser *parser) {
     URI& uri = headers.uri();
     if (uri._host.empty()) {
         const std::string* host_header = headers.GetHeader("host");
-        if (host_header != NULL) {
+        if (host_header != nullptr) {
             uri.SetHostAndPort(*host_header);
         }
     }
@@ -236,7 +236,7 @@ int 
HttpMessage::UnlockAndFlushToBodyReader(std::unique_lock<butil::Mutex>& mu)
         butil::Status st = r->OnReadOnePart(blk.data(), blk.size());
         if (!st.ok()) {
             mu.lock();
-            _body_reader = NULL;
+            _body_reader = nullptr;
             mu.unlock();
             r->OnEndOfMessage(st);
             return -1;
@@ -274,7 +274,7 @@ int HttpMessage::OnBody(const char *at, const size_t 
length) {
             // the body is probably streaming data which is too long to print.
             header().status_code() == HTTP_STATUS_OK) {
             LOG(INFO) << '\n' << _vmsgbuilder->buf();
-            _vmsgbuilder.reset(NULL);
+            _vmsgbuilder.reset(nullptr);
         } else {
             if (_vbodylen < (size_t)FLAGS_http_verbose_max_body_length) {
                 int plen = std::min(length, 
(size_t)FLAGS_http_verbose_max_body_length
@@ -291,7 +291,7 @@ int HttpMessage::OnBody(const char *at, const size_t 
length) {
     }
     if (!_read_body_progressively) {
         // Normal read.
-        if (NULL != _current_source_iobuf) {
+        if (nullptr != _current_source_iobuf) {
             _current_source_iobuf->append_to(
                 &_body, length, _parsed_block_size + (at - 
_current_block_base));
         } else {
@@ -302,7 +302,7 @@ int HttpMessage::OnBody(const char *at, const size_t 
length) {
     // Progressive read.
     std::unique_lock<butil::Mutex> mu(_body_mutex);
     ProgressiveReader* r = _body_reader;
-    while (r == NULL) {
+    while (r == nullptr) {
         // When _body is full, the sleep-waiting may block parse handler
         // of the protocol. A more efficient solution is to remove the
         // socket from epoll and add it back when the _body is not full,
@@ -328,7 +328,7 @@ int HttpMessage::OnBody(const char *at, const size_t 
length) {
         return 0;
     }
     mu.lock();
-    _body_reader = NULL;
+    _body_reader = nullptr;
     mu.unlock();
     r->OnEndOfMessage(st);
     return -1;
@@ -341,10 +341,10 @@ int HttpMessage::OnMessageComplete() {
                 - (size_t)FLAGS_http_verbose_max_body_length << " bytes>";
         }
         LOG(INFO) << '\n' << _vmsgbuilder->buf();
-        _vmsgbuilder.reset(NULL);
+        _vmsgbuilder.reset(nullptr);
     }
     _cur_header.clear();
-    _cur_value = NULL;
+    _cur_value = nullptr;
     if (!_read_body_progressively) {
         // Normal read.
         _stage = HTTP_ON_MESSAGE_COMPLETE;
@@ -353,7 +353,7 @@ int HttpMessage::OnMessageComplete() {
     // Progressive read.
     std::unique_lock<butil::Mutex> mu(_body_mutex);
     _stage = HTTP_ON_MESSAGE_COMPLETE;
-    if (_body_reader != NULL) {
+    if (_body_reader != nullptr) {
         // Solve the case: SetBodyReader quit at ntry=MAX_TRY with non-empty
         // _body and the remaining _body is just the last part.
         // Make sure _body is emptied.
@@ -362,7 +362,7 @@ int HttpMessage::OnMessageComplete() {
         }
         mu.lock();
         ProgressiveReader* r = _body_reader;
-        _body_reader = NULL;
+        _body_reader = nullptr;
         mu.unlock();
         r->OnEndOfMessage(butil::Status());
     }
@@ -379,7 +379,7 @@ public:
     void OnEndOfMessage(const butil::Status&) {}
 };
 
-static FailAllRead* s_fail_all_read = NULL;
+static FailAllRead* s_fail_all_read = nullptr;
 static pthread_once_t s_fail_all_read_once = PTHREAD_ONCE_INIT;
 static void CreateFailAllRead() { s_fail_all_read = new FailAllRead; }
 
@@ -393,7 +393,7 @@ void HttpMessage::SetBodyReader(ProgressiveReader* r) {
     int ntry = 0;
     do {
         std::unique_lock<butil::Mutex> mu(_body_mutex);
-        if (_body_reader != NULL) {
+        if (_body_reader != nullptr) {
             mu.unlock();
             return r->OnEndOfMessage(
                 butil::Status(EPERM, "SetBodyReader is called more than 
once"));
@@ -456,7 +456,7 @@ HttpMessage::HttpMessage(bool read_body_progressively,
 HttpMessage::~HttpMessage() {
     if (_body_reader) {
         ProgressiveReader* saved_body_reader = _body_reader;
-        _body_reader = NULL;
+        _body_reader = nullptr;
         // Successfully ended message is ended in OnMessageComplete() or
         // SetBodyReader() and _body_reader should be null-ed. Non-null
         // _body_reader here just means the socket is broken before completion
@@ -499,7 +499,7 @@ ssize_t HttpMessage::ParseFromIOBuf(const butil::IOBuf 
&buf) {
     _parsed_block_size = 0;
     _current_source_iobuf = &buf;
     BRPC_SCOPE_EXIT {
-        _current_source_iobuf = NULL;
+        _current_source_iobuf = nullptr;
     };
     size_t nprocessed = 0;
     for (size_t i = 0; i < buf.backing_block_num(); ++i) {
@@ -632,7 +632,7 @@ void MakeRawHttpRequest(butil::IOBuf* request,
     //the request-target consists of only the host name and port number of 
     //the tunnel destination, separated by a colon. For example,
     //Host: server.example.com:80
-    if (h->GetHeader("host") == NULL) {
+    if (h->GetHeader("host") == nullptr) {
         os << "Host: ";
         if (!uri.host().empty()) {
             os << uri.host();
@@ -652,15 +652,15 @@ void MakeRawHttpRequest(butil::IOBuf* request,
          it != h->HeaderEnd(); ++it) {
         os << it->first << ": " << it->second << BRPC_CRLF;
     }
-    if (h->GetHeader("Accept") == NULL) {
+    if (h->GetHeader("Accept") == nullptr) {
         os << "Accept: */*" BRPC_CRLF;
     }
     // The fake "curl" user-agent may let servers return plain-text results.
-    if (h->GetHeader("User-Agent") == NULL) {
+    if (h->GetHeader("User-Agent") == nullptr) {
         os << "User-Agent: brpc/1.0 curl/7.0" BRPC_CRLF;
     }
     const std::string& user_info = h->uri().user_info();
-    if (!user_info.empty() && h->GetHeader("Authorization") == NULL) {
+    if (!user_info.empty() && h->GetHeader("Authorization") == nullptr) {
         // NOTE: just assume user_info is well formatted, namely
         // "<user_name>:<password>". Users are very unlikely to add extra
         // characters in this part and even if users did, most of them are
diff --git a/src/brpc/details/http_message.h b/src/brpc/details/http_message.h
index ae4a016d..14f8fbb7 100644
--- a/src/brpc/details/http_message.h
+++ b/src/brpc/details/http_message.h
@@ -114,21 +114,21 @@ private:
     // For mutual exclusion between on_body and SetBodyReader.
     butil::Mutex _body_mutex;
     // Read body progressively
-    ProgressiveReader* _body_reader{NULL};
+    ProgressiveReader* _body_reader{nullptr};
     butil::IOBuf _body;
     size_t _body_size{0};
     bool _body_too_large{false};
 
     // Store the IOBuf information in `ParseFromIOBuf'
     // for later zero-copy usage in `OnBody'.
-    const butil::IOBuf* _current_source_iobuf{NULL};
-    const char* _current_block_base{NULL};
+    const butil::IOBuf* _current_source_iobuf{nullptr};
+    const char* _current_block_base{nullptr};
     size_t _parsed_block_size{0};
 
     // Parser related members
     struct http_parser _parser;
     std::string _cur_header;
-    std::string *_cur_value{NULL};
+    std::string *_cur_value{nullptr};
 
 protected:
     // Only valid when -http_verbose is on
@@ -141,7 +141,7 @@ std::ostream& operator<<(std::ostream& os, const 
http_parser& parser);
 // Serialize a http request.
 // header: may be modified in some cases
 // remote_side: used when "Host" is absent
-// content: could be NULL.
+// content: could be nullptr.
 void MakeRawHttpRequest(butil::IOBuf* request,
                         HttpHeader* header,
                         const butil::EndPoint& remote_side,
@@ -149,7 +149,7 @@ void MakeRawHttpRequest(butil::IOBuf* request,
 
 // Serialize a http response.
 // header: may be modified in some cases
-// content: cleared after usage. could be NULL. 
+// content: cleared after usage. could be nullptr. 
 void MakeRawHttpResponse(butil::IOBuf* response,
                          HttpHeader* header,
                          butil::IOBuf* content);
diff --git a/src/brpc/details/http_parser.cpp b/src/brpc/details/http_parser.cpp
index a4aa4d12..2c68cffc 100644
--- a/src/brpc/details/http_parser.cpp
+++ b/src/brpc/details/http_parser.cpp
@@ -96,7 +96,7 @@ do {                                                          
       \
         return (ER);                                                 \
       }                                                              \
     }                                                                \
-    FOR##_mark = NULL;                                               \
+    FOR##_mark = nullptr;                                            \
   }                                                                  \
 } while (0)
   
@@ -2424,7 +2424,7 @@ http_parser_parse_url(const char *buf, size_t buflen, int 
is_connect,
 
   if (u->field_set & (1 << UF_PORT)) {
     /* Don't bother with endp; we've already validated the string */
-    unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10);
+    unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, nullptr, 10);
 
     /* Ports have a max value of 2^16 */
     if (v > 0xffff) {
diff --git a/src/brpc/details/jemalloc_profiler.cpp 
b/src/brpc/details/jemalloc_profiler.cpp
index fdd06fb4..2091eda7 100644
--- a/src/brpc/details/jemalloc_profiler.cpp
+++ b/src/brpc/details/jemalloc_profiler.cpp
@@ -137,7 +137,7 @@ static std::string JeProfileDump() {
     }
 
     const char* p_prof_name = prof_name;
-    int ret = mallctl("prof.dump", NULL, NULL, (void*)&p_prof_name, 
sizeof(p_prof_name));
+    int ret = mallctl("prof.dump", nullptr, nullptr, (void*)&p_prof_name, 
sizeof(p_prof_name));
     if (ret != 0) {
         LOG(WARNING) << "mallctl set prof.dump:" << p_prof_name << " err, 
ret:" << ret;
         return "";
diff --git a/src/brpc/details/mesalink_ssl_helper.cpp 
b/src/brpc/details/mesalink_ssl_helper.cpp
index aa83fa6c..171f045b 100644
--- a/src/brpc/details/mesalink_ssl_helper.cpp
+++ b/src/brpc/details/mesalink_ssl_helper.cpp
@@ -138,7 +138,7 @@ void ExtractHostnames(X509* x, std::vector<std::string>* 
hostnames) {
 
 struct FreeSSL {
     inline void operator()(SSL* ssl) const {
-        if (ssl != NULL) {
+        if (ssl != nullptr) {
             SSL_free(ssl);
         }
     }
@@ -146,7 +146,7 @@ struct FreeSSL {
 
 struct FreeBIO {
     inline void operator()(BIO* io) const {
-        if (io != NULL) {
+        if (io != nullptr) {
             BIO_free(io);
         }
     }
@@ -154,7 +154,7 @@ struct FreeBIO {
 
 struct FreeX509 {
     inline void operator()(X509* x) const {
-        if (x != NULL) {
+        if (x != nullptr) {
             X509_free(x);
         }
     }
@@ -162,7 +162,7 @@ struct FreeX509 {
 
 struct FreeEVPKEY {
     inline void operator()(EVP_PKEY* k) const {
-        if (k != NULL) {
+        if (k != nullptr) {
             EVP_PKEY_free(k);
         }
     }
@@ -177,7 +177,7 @@ static int LoadCertificate(SSL_CTX* ctx,
         std::unique_ptr<BIO, FreeBIO> kbio(
             BIO_new_mem_buf((void*)private_key.c_str(), -1));
         std::unique_ptr<EVP_PKEY, FreeEVPKEY> key(
-            PEM_read_bio_PrivateKey(kbio.get(), NULL, 0, NULL));
+            PEM_read_bio_PrivateKey(kbio.get(), nullptr, 0, nullptr));
         if (SSL_CTX_use_PrivateKey(ctx, key.get()) != 1) {
             LOG(ERROR) << "Fail to load " << private_key << ": "
                        << SSLError(ERR_get_error());
@@ -205,7 +205,7 @@ static int LoadCertificate(SSL_CTX* ctx,
         }
     }
     std::unique_ptr<X509, FreeX509> x(
-        PEM_read_bio_X509(cbio.get(), NULL, 0, NULL));
+        PEM_read_bio_X509(cbio.get(), nullptr, 0, nullptr));
     if (!x) {
         LOG(ERROR) << "Fail to parse " << certificate << ": "
                    << SSLError(ERR_get_error());
@@ -221,8 +221,8 @@ static int LoadCertificate(SSL_CTX* ctx,
 
     // Load the certificate chain
     //SSL_CTX_clear_chain_certs(ctx);
-    X509* ca = NULL;
-    while ((ca = PEM_read_bio_X509(cbio.get(), NULL, 0, NULL))) {
+    X509* ca = nullptr;
+    while ((ca = PEM_read_bio_X509(cbio.get(), nullptr, 0, nullptr))) {
         if (SSL_CTX_add_extra_chain_cert(ctx, ca) != 1) {
             LOG(ERROR) << "Fail to load chain certificate in "
                        << certificate << ": " << SSLError(ERR_get_error());
@@ -251,16 +251,16 @@ static int SetSSLOptions(SSL_CTX* ctx, const std::string& 
ciphers,
     if (verify.verify_depth > 0) {
         std::string cafile = verify.ca_file_path;
         if (!cafile.empty()) {
-            if (SSL_CTX_load_verify_locations(ctx, cafile.c_str(), NULL) == 0) 
{
+            if (SSL_CTX_load_verify_locations(ctx, cafile.c_str(), nullptr) == 
0) {
                 LOG(ERROR) << "Fail to load CA file " << cafile
                            << ": " << SSLError(ERR_get_error());
                 return -1;
             }
         }
         SSL_CTX_set_verify(ctx, (SSL_VERIFY_PEER
-                                 | SSL_VERIFY_FAIL_IF_NO_PEER_CERT), NULL);
+                                 | SSL_VERIFY_FAIL_IF_NO_PEER_CERT), nullptr);
     } else {
-        SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
+        SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, nullptr);
     }
 
     return 0;
@@ -271,21 +271,21 @@ SSL_CTX* CreateClientSSLContext(const ChannelSSLOptions& 
options) {
         SSL_CTX_new(TLSv1_2_client_method()));
     if (!ssl_ctx) {
         LOG(ERROR) << "Fail to new SSL_CTX: " << SSLError(ERR_get_error());
-        return NULL;
+        return nullptr;
     }
 
     if (!options.client_cert.certificate.empty()
         && LoadCertificate(ssl_ctx.get(),
                            options.client_cert.certificate,
-                           options.client_cert.private_key, NULL) != 0) {
-        return NULL;
+                           options.client_cert.private_key, nullptr) != 0) {
+        return nullptr;
     }
 
     int protocols = ParseSSLProtocols(options.protocols);
     if (protocols < 0
         || SetSSLOptions(ssl_ctx.get(), options.ciphers,
                          protocols, options.verify) != 0) {
-        return NULL;
+        return nullptr;
     }
 
     SSL_CTX_set_session_cache_mode(ssl_ctx.get(), SSL_SESS_CACHE_CLIENT);
@@ -300,12 +300,12 @@ SSL_CTX* CreateServerSSLContext(const std::string& 
certificate,
         SSL_CTX_new(TLSv1_2_server_method()));
     if (!ssl_ctx) {
         LOG(ERROR) << "Fail to new SSL_CTX: " << SSLError(ERR_get_error());
-        return NULL;
+        return nullptr;
     }
 
     if (LoadCertificate(ssl_ctx.get(), certificate,
                         private_key, hostnames) != 0) {
-        return NULL;
+        return nullptr;
     }
 
     int protocols = TLSv1 | TLSv1_1 | TLSv1_2;
@@ -314,7 +314,7 @@ SSL_CTX* CreateServerSSLContext(const std::string& 
certificate,
     }
     if (SetSSLOptions(ssl_ctx.get(), options.ciphers,
                       protocols, options.verify) != 0) {
-        return NULL;
+        return nullptr;
     }
 
     /* SSL_CTX_set_timeout(ssl_ctx.get(), options.session_lifetime_s); */
@@ -324,19 +324,19 @@ SSL_CTX* CreateServerSSLContext(const std::string& 
certificate,
 }
 
 SSL* CreateSSLSession(SSL_CTX* ctx, SocketId id, int fd, bool server_mode) {
-    if (ctx == NULL) {
+    if (ctx == nullptr) {
         LOG(WARNING) << "Lack SSL_ctx to create an SSL session";
-        return NULL;
+        return nullptr;
     }
     SSL* ssl = SSL_new(ctx);
-    if (ssl == NULL) {
+    if (ssl == nullptr) {
         LOG(ERROR) << "Fail to SSL_new: " << SSLError(ERR_get_error());
-        return NULL;
+        return nullptr;
     }
     if (SSL_set_fd(ssl, fd) != 1) {
         LOG(ERROR) << "Fail to SSL_set_fd: " << SSLError(ERR_get_error());
         SSL_free(ssl);
-        return NULL;
+        return nullptr;
     }
 
     if (server_mode) {
diff --git a/src/brpc/details/method_status.cpp 
b/src/brpc/details/method_status.cpp
index 3bed6bf2..d23283fb 100644
--- a/src/brpc/details/method_status.cpp
+++ b/src/brpc/details/method_status.cpp
@@ -159,7 +159,7 @@ int HandleResponseWritten(bthread_id_t id, void* data, int 
/*error_code*/) {
 ConcurrencyRemover::~ConcurrencyRemover() {
     if (_status) {
         _status->OnResponded(_c->ErrorCode(), butil::cpuwide_time_us() - 
_received_us);
-        _status = NULL;
+        _status = nullptr;
     }
     ServerPrivateAccessor(_c->server()).RemoveConcurrency(_c);
 }
diff --git a/src/brpc/details/method_status.h b/src/brpc/details/method_status.h
index 9b7f0709..fab56e90 100644
--- a/src/brpc/details/method_status.h
+++ b/src/brpc/details/method_status.h
@@ -37,8 +37,8 @@ public:
 
     // Call this function when the method is about to be called.
     // Returns false when the method is overloaded. If rejected_cc is not
-    // NULL, it's set with the rejected concurrency.
-    bool OnRequested(int* rejected_cc = NULL, Controller* cntl = NULL);
+    // nullptr, it's set with the rejected concurrency.
+    bool OnRequested(int* rejected_cc = nullptr, Controller* cntl = nullptr);
 
     // Call this when the method just finished.
     // `error_code' : The error code obtained from the controller. Equal to 
@@ -96,7 +96,7 @@ private:
 
 inline bool MethodStatus::OnRequested(int* rejected_cc, Controller* cntl) {
     const int cc = _nconcurrency.fetch_add(1, butil::memory_order_relaxed) + 1;
-    if (NULL == _cl || _cl->OnRequested(cc, cntl)) {
+    if (nullptr == _cl || _cl->OnRequested(cc, cntl)) {
         return true;
     } 
     if (rejected_cc) {
@@ -112,7 +112,7 @@ inline void MethodStatus::OnResponded(int error_code, 
int64_t latency) {
     } else {
         _nerror_bvar << 1;
     }
-    if (NULL != _cl) {
+    if (nullptr != _cl) {
         _cl->OnResponded(error_code, latency);
     }
 }
diff --git a/src/brpc/details/naming_service_thread.cpp 
b/src/brpc/details/naming_service_thread.cpp
index 7eb005e8..2303af1f 100644
--- a/src/brpc/details/naming_service_thread.cpp
+++ b/src/brpc/details/naming_service_thread.cpp
@@ -56,7 +56,7 @@ inline bool operator==(const NSKey& k1, const NSKey& k2) {
 
 typedef butil::FlatMap<NSKey, NamingServiceThread*, NSKeyHasher> 
NamingServiceMap;
 // Construct on demand to make the code work before main()
-static NamingServiceMap* g_nsthread_map = NULL;
+static NamingServiceMap* g_nsthread_map = nullptr;
 static pthread_mutex_t g_nsthread_map_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 NamingServiceThread::Actions::Actions(NamingServiceThread* owner)
@@ -64,7 +64,7 @@ NamingServiceThread::Actions::Actions(NamingServiceThread* 
owner)
     , _wait_id(INVALID_BTHREAD_ID)
     , _has_wait_error(false)
     , _wait_error(0) {
-    CHECK_EQ(0, bthread_id_create(&_wait_id, NULL, NULL));
+    CHECK_EQ(0, bthread_id_create(&_wait_id, nullptr, nullptr));
 }
 
 NamingServiceThread::Actions::~Actions() {
@@ -161,7 +161,7 @@ void NamingServiceThread::Actions::ResetServers(
                            _sockets.end());
     }
     std::vector<ServerId> removed_ids;
-    ServerNodeWithId2ServerId(_removed_sockets, &removed_ids, NULL);
+    ServerNodeWithId2ServerId(_removed_sockets, &removed_ids, nullptr);
 
     {
         BAIDU_SCOPED_LOCK(_owner->_mutex);
@@ -207,7 +207,7 @@ void NamingServiceThread::Actions::ResetServers(
 }
 
 void NamingServiceThread::Actions::EndWait(int error_code) {
-    if (bthread_id_trylock(_wait_id, NULL) == 0) {
+    if (bthread_id_trylock(_wait_id, nullptr) == 0) {
         _wait_error = error_code;
         _has_wait_error.store(true, butil::memory_order_release);
         bthread_id_unlock_and_destroy(_wait_id);
@@ -225,7 +225,7 @@ int 
NamingServiceThread::Actions::WaitForFirstBatchOfServers() {
 
 NamingServiceThread::NamingServiceThread()
     : _tid(0)
-    , _ns(NULL)
+    , _ns(nullptr)
     , _actions(this) {
 }
 
@@ -235,22 +235,22 @@ NamingServiceThread::~NamingServiceThread() {
     if (!_protocol.empty()) {
         const NSKey key(_protocol, _service_name, _options.channel_signature);
         std::unique_lock<pthread_mutex_t> mu(g_nsthread_map_mutex);
-        if (g_nsthread_map != NULL) {
+        if (g_nsthread_map != nullptr) {
             NamingServiceThread** ptr = g_nsthread_map->seek(key);
-            if (ptr != NULL && *ptr == this) {
+            if (ptr != nullptr && *ptr == this) {
                 g_nsthread_map->erase(key);
             }
         }
     }
     if (_tid) {
         bthread_stop(_tid);
-        bthread_join(_tid, NULL);
+        bthread_join(_tid, nullptr);
         _tid = 0;
     }
     {
         BAIDU_SCOPED_LOCK(_mutex);
         std::vector<ServerId> to_be_removed;
-        ServerNodeWithId2ServerId(_last_sockets, &to_be_removed, NULL);
+        ServerNodeWithId2ServerId(_last_sockets, &to_be_removed, nullptr);
         if (!_last_sockets.empty()) {
             for (std::map<NamingServiceWatcher*,
                           const NamingServiceFilter*>::iterator
@@ -263,20 +263,20 @@ NamingServiceThread::~NamingServiceThread() {
 
     if (_ns) {
         _ns->Destroy();
-        _ns = NULL;
+        _ns = nullptr;
     }
 }
 
 void* NamingServiceThread::RunThis(void* arg) {
     static_cast<NamingServiceThread*>(arg)->Run();
-    return NULL;
+    return nullptr;
 }
 
 int NamingServiceThread::Start(NamingService* naming_service,
                                const std::string& protocol,
                                const std::string& service_name,
                                const GetNamingServiceThreadOptions* opt_in) {
-    if (naming_service == NULL) {
+    if (naming_service == nullptr) {
         LOG(ERROR) << "Param[naming_service] is NULL";
         return -1;
     }
@@ -290,7 +290,7 @@ int NamingServiceThread::Start(NamingService* 
naming_service,
     if (_ns->RunNamingServiceReturnsQuickly()) {
         RunThis(this);
     } else {
-        int rc = bthread_start_urgent(&_tid, NULL, RunThis, this);
+        int rc = bthread_start_urgent(&_tid, nullptr, RunThis, this);
         if (rc) {
             LOG(ERROR) << "Fail to create bthread: " << berror(rc);
             return rc;
@@ -337,7 +337,7 @@ void NamingServiceThread::ServerNodeWithId2ServerId(
 
 int NamingServiceThread::AddWatcher(NamingServiceWatcher* watcher,
                                     const NamingServiceFilter* filter) {
-    if (watcher == NULL) {
+    if (watcher == nullptr) {
         LOG(ERROR) << "Param[watcher] is NULL";
         return -1;
     }
@@ -354,7 +354,7 @@ int NamingServiceThread::AddWatcher(NamingServiceWatcher* 
watcher,
 }
     
 int NamingServiceThread::RemoveWatcher(NamingServiceWatcher* watcher) {
-    if (watcher == NULL) {
+    if (watcher == nullptr) {
         LOG(ERROR) << "Param[watcher] is NULL";
         return -1;
     }
@@ -391,14 +391,14 @@ static const char* ParseNamingServiceUrl(const char* url, 
char* protocol) {
     // Accepting "[^:]{1,MAX_PROTOCOL_LEN}://*.*"
     //            ^^^^^^^^^^^^^^^^^^^^^^^^   ^^^
     //            protocol                service_name
-    if (__builtin_expect(url != NULL, 1)) {
+    if (__builtin_expect(url != nullptr, 1)) {
         const char* p1 = url;
         while (*p1 != ':') {
             if (p1 < url + MAX_PROTOCOL_LEN && *p1) {
                 protocol[p1 - url] = *p1;
                 ++p1;
             } else {
-                return NULL;
+                return nullptr;
             }
         }
         if (p1 <= url + MAX_PROTOCOL_LEN) {
@@ -409,7 +409,7 @@ static const char* ParseNamingServiceUrl(const char* url, 
char* protocol) {
             }
         }
     }
-    return NULL;
+    return nullptr;
 }
 
 int GetNamingServiceThread(
@@ -418,12 +418,12 @@ int GetNamingServiceThread(
     const GetNamingServiceThreadOptions* options) {
     char protocol[MAX_PROTOCOL_LEN + 1];
     const char* const service_name = ParseNamingServiceUrl(url, protocol);
-    if (service_name == NULL) {
+    if (service_name == nullptr) {
         LOG(ERROR) << "Invalid naming service url=" << url;
         return -1;
     }
     const NamingService* source_ns = NamingServiceExtension()->Find(protocol);
-    if (source_ns == NULL) {
+    if (source_ns == nullptr) {
         LOG(ERROR) << "Unknown protocol=" << protocol;
         return -1;
     }
@@ -433,19 +433,14 @@ int GetNamingServiceThread(
     butil::intrusive_ptr<NamingServiceThread> nsthread;
     {
         std::unique_lock<pthread_mutex_t> mu(g_nsthread_map_mutex);
-        if (g_nsthread_map == NULL) {
-            g_nsthread_map = new (std::nothrow) NamingServiceMap;
-            if (NULL == g_nsthread_map) {
-                mu.unlock();
-                LOG(ERROR) << "Fail to new g_nsthread_map";
-                return -1;
-            }
+        if (g_nsthread_map == nullptr) {
+            g_nsthread_map = new NamingServiceMap;
             if (g_nsthread_map->init(64) != 0) {
                 LOG(WARNING) << "Fail to init g_nsthread_map";
             }
         }
         NamingServiceThread*& ptr = (*g_nsthread_map)[key];
-        if (ptr != NULL) {
+        if (ptr != nullptr) {
             if (ptr->AddRefManually() == 0) {
                 // The ns thread's last intrusive_ptr was just destructed and
                 // the removal-from-global-map-code in 
ptr->~NamingServiceThread()
@@ -453,18 +448,13 @@ int GetNamingServiceThread(
                 // thread.
                 // Notice that we don't need to remove the reference because
                 // the object is already destructing.
-                ptr = NULL;
+                ptr = nullptr;
             } else {
                 nsthread.reset(ptr, false);
             }
         }
-        if (ptr == NULL) {
-            NamingServiceThread* thr = new (std::nothrow) NamingServiceThread;
-            if (thr == NULL) {
-                mu.unlock();
-                LOG(ERROR) << "Fail to new NamingServiceThread";
-                return -1;
-            }
+        if (ptr == nullptr) {
+            NamingServiceThread* thr = new NamingServiceThread;
             ptr = thr;
             nsthread.reset(ptr);
             new_thread = true;
@@ -491,7 +481,7 @@ int GetNamingServiceThread(
 
 void NamingServiceThread::Describe(std::ostream& os,
                                    const DescribeOptions& options) const {
-    if (_ns == NULL) {
+    if (_ns == nullptr) {
         os << "null";
     } else {
         _ns->Describe(os, options);
diff --git a/src/brpc/details/naming_service_thread.h 
b/src/brpc/details/naming_service_thread.h
index f01fbea6..befb475c 100644
--- a/src/brpc/details/naming_service_thread.h
+++ b/src/brpc/details/naming_service_thread.h
@@ -101,7 +101,7 @@ public:
     void EndWait(int error_code);
 
     int AddWatcher(NamingServiceWatcher* w, const NamingServiceFilter* f);
-    int AddWatcher(NamingServiceWatcher* w) { return AddWatcher(w, NULL); }
+    int AddWatcher(NamingServiceWatcher* w) { return AddWatcher(w, nullptr); }
     int RemoveWatcher(NamingServiceWatcher* w);
 
     void Describe(std::ostream& os, const DescribeOptions&) const override;
diff --git a/src/brpc/details/server_private_accessor.h 
b/src/brpc/details/server_private_accessor.h
index aacf2835..d553b4dc 100644
--- a/src/brpc/details/server_private_accessor.h
+++ b/src/brpc/details/server_private_accessor.h
@@ -111,12 +111,12 @@ public:
     ~ScopedNonServiceError() {
         if (_server) {
             ServerPrivateAccessor(_server).AddError();
-            _server = NULL;
+            _server = nullptr;
         }
     }
     const Server* release() {
         const Server* tmp = _server;
-        _server = NULL;
+        _server = nullptr;
         return tmp;
     }
 private:
diff --git a/src/brpc/details/sparse_minute_counter.h 
b/src/brpc/details/sparse_minute_counter.h
index 3834afab..d498cec6 100644
--- a/src/brpc/details/sparse_minute_counter.h
+++ b/src/brpc/details/sparse_minute_counter.h
@@ -41,7 +41,7 @@ template <typename T> class SparseMinuteCounter {
         Item(int64_t ts, const T& v) : timestamp_ms(ts), value(v) {}
     };
 public:
-    SparseMinuteCounter() : _q(NULL) {}
+    SparseMinuteCounter() : _q(nullptr) {}
     ~SparseMinuteCounter() { DestroyQueue(_q); }
 
     // Add `value' into this counter at timestamp `now_ms'
@@ -145,7 +145,7 @@ template <typename T>
 bool SparseMinuteCounter<T>::TryPop(int64_t now_ms, T* popped) {
     if (_q) {
         const Item* const oldest = _q->top();
-        if (oldest == NULL || now_ms < oldest->timestamp_ms + 60000) {
+        if (oldest == nullptr || now_ms < oldest->timestamp_ms + 60000) {
             return false;
         }
         *popped = oldest->value;
diff --git a/src/brpc/details/ssl_helper.cpp b/src/brpc/details/ssl_helper.cpp
index 52246980..1673db1d 100644
--- a/src/brpc/details/ssl_helper.cpp
+++ b/src/brpc/details/ssl_helper.cpp
@@ -49,10 +49,10 @@ bool SupportsPeerNameVerification() {
 }
 
 #ifndef OPENSSL_NO_DH
-static DH* g_dh_1024 = NULL;
-static DH* g_dh_2048 = NULL;
-static DH* g_dh_4096 = NULL;
-static DH* g_dh_8192 = NULL;
+static DH* g_dh_1024 = nullptr;
+static DH* g_dh_2048 = nullptr;
+static DH* g_dh_4096 = nullptr;
+static DH* g_dh_8192 = nullptr;
 #endif  // OPENSSL_NO_DH
 
 static const char* const PEM_START = "-----BEGIN";
@@ -202,18 +202,18 @@ static void SSLMessageCallback(int write_p, int version, 
int content_type,
 
 #if defined(OPENSSL_IS_BORINGSSL) || (OPENSSL_VERSION_NUMBER >= 0x10101000L)
 static pthread_once_t g_ssl_keylog_once = PTHREAD_ONCE_INIT;
-static FILE* g_ssl_keylog_file = NULL;
+static FILE* g_ssl_keylog_file = nullptr;
 
 static void InitSSLKeyLogFile() {
     const char* path = getenv("SSLKEYLOGFILE");
-    if (path == NULL || path[0] == '\0') {
+    if (path == nullptr || path[0] == '\0') {
         return;
     }
     g_ssl_keylog_file = fopen(path, "ae");
-    if (g_ssl_keylog_file == NULL) {
+    if (g_ssl_keylog_file == nullptr) {
         PLOG(WARNING) << "Fail to open SSLKEYLOGFILE=" << path;
     } else {
-        setvbuf(g_ssl_keylog_file, NULL, _IOLBF, 0);
+        setvbuf(g_ssl_keylog_file, nullptr, _IOLBF, 0);
         LOG(WARNING) << "SSLKEYLOGFILE is enabled (path: " << path << "). "
                      << "Sensitive TLS session keys will be written to this 
file. "
                      << "This feature is intended for debugging only and 
should NOT be used in production environments.";
@@ -222,7 +222,7 @@ static void InitSSLKeyLogFile() {
 
 static void SSLKeyLogCallback(const SSL* ssl, const char* line) {
     (void)ssl;
-    if (line == NULL || g_ssl_keylog_file == NULL) {
+    if (line == nullptr || g_ssl_keylog_file == nullptr) {
         return;
     }
     // Write the full key log line with newline in one call to keep output 
atomic.
@@ -231,7 +231,7 @@ static void SSLKeyLogCallback(const SSL* ssl, const char* 
line) {
 
 static void MaybeSetKeyLogCallback(SSL_CTX* ctx) {
     pthread_once(&g_ssl_keylog_once, InitSSLKeyLogFile);
-    if (ctx != NULL && g_ssl_keylog_file != NULL) {
+    if (ctx != nullptr && g_ssl_keylog_file != nullptr) {
         SSL_CTX_set_keylog_callback(ctx, SSLKeyLogCallback);
     }
 }
@@ -268,10 +268,10 @@ static DH* SSLGetDHCallback(SSL* ssl, int exp, int 
keylen) {
 void ExtractHostnames(X509* x, std::vector<std::string>* hostnames) {
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
     STACK_OF(GENERAL_NAME)* names = (STACK_OF(GENERAL_NAME)*)
-            X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
+            X509_get_ext_d2i(x, NID_subject_alt_name, nullptr, nullptr);
     if (names) {
         for (size_t i = 0; i < 
static_cast<size_t>(sk_GENERAL_NAME_num(names)); i++) {
-            char* str = NULL;
+            char* str = nullptr;
             GENERAL_NAME* name = sk_GENERAL_NAME_value(names, i);
             if (name->type == GEN_DNS) {
                 if (ASN1_STRING_to_UTF8((unsigned char**)&str,
@@ -289,7 +289,7 @@ void ExtractHostnames(X509* x, std::vector<std::string>* 
hostnames) {
     int i = -1;
     X509_NAME* xname = X509_get_subject_name(x);
     while ((i = X509_NAME_get_index_by_NID(xname, NID_commonName, i)) != -1) {
-        char* str = NULL;
+        char* str = nullptr;
         X509_NAME_ENTRY* entry = X509_NAME_get_entry(xname, i);
         const int len = ASN1_STRING_to_UTF8((unsigned char**)&str, 
                                             X509_NAME_ENTRY_get_data(entry));
@@ -303,7 +303,7 @@ void ExtractHostnames(X509* x, std::vector<std::string>* 
hostnames) {
 
 struct FreeSSL {
     inline void operator()(SSL* ssl) const {
-        if (ssl != NULL) {
+        if (ssl != nullptr) {
             SSL_free(ssl);
         }
     }
@@ -311,7 +311,7 @@ struct FreeSSL {
 
 struct FreeBIO {
     inline void operator()(BIO* io) const {
-        if (io != NULL) {
+        if (io != nullptr) {
             BIO_free(io);
         }
     }
@@ -319,7 +319,7 @@ struct FreeBIO {
 
 struct FreeX509 {
     inline void operator()(X509* x) const {
-        if (x != NULL) {
+        if (x != nullptr) {
             X509_free(x);
         }
     }
@@ -327,7 +327,7 @@ struct FreeX509 {
 
 struct FreeEVPKEY {
     inline void operator()(EVP_PKEY* k) const {
-        if (k != NULL) {
+        if (k != nullptr) {
             EVP_PKEY_free(k);
         }
     }
@@ -342,7 +342,7 @@ static int LoadCertificate(SSL_CTX* ctx,
         std::unique_ptr<BIO, FreeBIO> kbio(
             BIO_new_mem_buf((void*)private_key.c_str(), -1));
         std::unique_ptr<EVP_PKEY, FreeEVPKEY> key(
-            PEM_read_bio_PrivateKey(kbio.get(), NULL, 0, NULL));
+            PEM_read_bio_PrivateKey(kbio.get(), nullptr, 0, nullptr));
         if (SSL_CTX_use_PrivateKey(ctx, key.get()) != 1) {
             LOG(ERROR) << "Fail to load " << private_key << ": "
                        << SSLError(ERR_get_error());
@@ -371,7 +371,7 @@ static int LoadCertificate(SSL_CTX* ctx,
         }
     }
     std::unique_ptr<X509, FreeX509> x(
-        PEM_read_bio_X509_AUX(cbio.get(), NULL, 0, NULL));
+        PEM_read_bio_X509_AUX(cbio.get(), nullptr, 0, nullptr));
     if (!x) {
         LOG(ERROR) << "Fail to parse " << certificate << ": "
                    << SSLError(ERR_get_error());
@@ -389,13 +389,13 @@ static int LoadCertificate(SSL_CTX* ctx,
 #if (OPENSSL_VERSION_NUMBER >= 0x10002000L)
     SSL_CTX_clear_chain_certs(ctx);
 #else
-    if (ctx->extra_certs != NULL) {
+    if (ctx->extra_certs != nullptr) {
         sk_X509_pop_free(ctx->extra_certs, X509_free);
-        ctx->extra_certs = NULL;
+        ctx->extra_certs = nullptr;
     }
 #endif
-    X509* ca = NULL;
-    while ((ca = PEM_read_bio_X509(cbio.get(), NULL, 0, NULL))) {
+    X509* ca = nullptr;
+    while ((ca = PEM_read_bio_X509(cbio.get(), nullptr, 0, nullptr))) {
         if (SSL_CTX_add_extra_chain_cert(ctx, ca) != 1) {
             LOG(ERROR) << "Fail to load chain certificate in "
                        << certificate << ": " << SSLError(ERR_get_error());
@@ -420,7 +420,7 @@ static int LoadCertificate(SSL_CTX* ctx,
         return -1;
     }
 
-    if (hostnames != NULL) {
+    if (hostnames != nullptr) {
         ExtractHostnames(x.get(), hostnames);
     }
     return 0;
@@ -481,22 +481,22 @@ static int SetSSLOptions(SSL_CTX* ctx, const std::string& 
ciphers,
         }
         if (verify.verify_mode == VerifyMode::VERIFY_FAIL_IF_NO_PEER_CERT) {
             SSL_CTX_set_verify(ctx, (SSL_VERIFY_PEER
-                                     | SSL_VERIFY_FAIL_IF_NO_PEER_CERT), NULL);
+                                     | SSL_VERIFY_FAIL_IF_NO_PEER_CERT), 
nullptr);
         } else if (verify.verify_mode == VerifyMode::VERIFY_PEER) {
-            SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
+            SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, nullptr);
         } else if (verify.verify_mode == VerifyMode::VERIFY_NONE) {
-            SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
+            SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, nullptr);
         } else {
             // for forward compatibility
             SSL_CTX_set_verify(ctx, (SSL_VERIFY_PEER
-                                     | SSL_VERIFY_FAIL_IF_NO_PEER_CERT), NULL);
+                                     | SSL_VERIFY_FAIL_IF_NO_PEER_CERT), 
nullptr);
         }
         SSL_CTX_set_verify_depth(ctx, verify.verify_depth);
         std::string cafile = verify.ca_file_path;
         if (cafile.empty()) {
             cafile = X509_get_default_cert_area() + std::string("/cert.pem");
         }
-        if (SSL_CTX_load_verify_locations(ctx, cafile.c_str(), NULL) == 0) {
+        if (SSL_CTX_load_verify_locations(ctx, cafile.c_str(), nullptr) == 0) {
             if (verify.ca_file_path.empty()) {
                 LOG(WARNING) << "Fail to load default CA file " << cafile
                              << ": " << SSLError(ERR_get_error());
@@ -536,7 +536,7 @@ static int SetSSLOptions(SSL_CTX* ctx, const std::string& 
ciphers,
             LOG(ERROR) << "Expected peer name requires peer verification";
             return -1;
         }
-        SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
+        SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, nullptr);
     }
 
     SSL_CTX_set_info_callback(ctx, SSLInfoCallback);
@@ -587,28 +587,28 @@ SSL_CTX* CreateClientSSLContext(const ChannelSSLOptions& 
options) {
         SSL_CTX_new(SSLv23_client_method()));
     if (!ssl_ctx) {
         LOG(ERROR) << "Fail to new SSL_CTX: " << SSLError(ERR_get_error());
-        return NULL;
+        return nullptr;
     }
     MaybeSetKeyLogCallback(ssl_ctx.get());
 
     if (!options.client_cert.certificate.empty()
         && LoadCertificate(ssl_ctx.get(),
                            options.client_cert.certificate,
-                           options.client_cert.private_key, NULL) != 0) {
-        return NULL;
+                           options.client_cert.private_key, nullptr) != 0) {
+        return nullptr;
     }
 
     int protocols = ParseSSLProtocols(options.protocols);
     if (protocols < 0
         || SetSSLOptions(ssl_ctx.get(), options.ciphers,
                          protocols, options.verify) != 0) {
-        return NULL;
+        return nullptr;
     }
 
     if (!options.alpn_protocols.empty()) {
         std::vector<unsigned char> alpn_list;
         if (!BuildALPNProtocolList(options.alpn_protocols, alpn_list)) {
-            return NULL;
+            return nullptr;
         }
         SSL_CTX_set_alpn_protos(ssl_ctx.get(), alpn_list.data(), 
alpn_list.size());
     }
@@ -626,13 +626,13 @@ SSL_CTX* CreateServerSSLContext(const std::string& 
certificate,
         SSL_CTX_new(SSLv23_server_method()));
     if (!ssl_ctx) {
         LOG(ERROR) << "Fail to new SSL_CTX: " << SSLError(ERR_get_error());
-        return NULL;
+        return nullptr;
     }
     MaybeSetKeyLogCallback(ssl_ctx.get());
 
     if (LoadCertificate(ssl_ctx.get(), certificate,
                         private_key, hostnames) != 0) {
-        return NULL;
+        return nullptr;
     }
 
     int protocols = TLSv1 | TLSv1_1 | TLSv1_2 | TLSv1_3;
@@ -641,7 +641,7 @@ SSL_CTX* CreateServerSSLContext(const std::string& 
certificate,
     }
     if (SetSSLOptions(ssl_ctx.get(), options.ciphers,
                       protocols, options.verify) != 0) {
-        return NULL;
+        return nullptr;
     }
 
 #ifdef SSL_MODE_RELEASE_BUFFERS
@@ -659,13 +659,13 @@ SSL_CTX* CreateServerSSLContext(const std::string& 
certificate,
     SSL_CTX_set_tmp_dh_callback(ssl_ctx.get(), SSLGetDHCallback);
 
 #if !defined(OPENSSL_NO_ECDH) && defined(SSL_CTX_set_tmp_ecdh)
-    EC_KEY* ecdh = NULL;
+    EC_KEY* ecdh = nullptr;
     int i = OBJ_sn2nid(options.ecdhe_curve_name.c_str());
-    if (!i || ((ecdh = EC_KEY_new_by_curve_name(i)) == NULL)) {
+    if (!i || ((ecdh = EC_KEY_new_by_curve_name(i)) == nullptr)) {
         LOG(ERROR) << "Fail to find ECDHE named curve="
                    << options.ecdhe_curve_name
                    << ": " << SSLError(ERR_get_error());
-        return NULL;
+        return nullptr;
     }
     SSL_CTX_set_tmp_ecdh(ssl_ctx.get(), ecdh);
     EC_KEY_free(ecdh);
@@ -676,26 +676,26 @@ SSL_CTX* CreateServerSSLContext(const std::string& 
certificate,
     // Set ALPN callback to choose application protocol when alpns is not 
empty.
     if (alpns != nullptr && !alpns->empty()) {
         if (SetServerALPNCallback(ssl_ctx.get(), alpns) != 0) {
-            return NULL; 
+            return nullptr; 
         }
     }
     return ssl_ctx.release();
 }
 
 SSL* CreateSSLSession(SSL_CTX* ctx, SocketId id, int fd, bool server_mode) {
-    if (ctx == NULL) {
+    if (ctx == nullptr) {
         LOG(WARNING) << "Lack SSL_ctx to create an SSL session";
-        return NULL;
+        return nullptr;
     }
     SSL* ssl = SSL_new(ctx);
-    if (ssl == NULL) {
+    if (ssl == nullptr) {
         LOG(ERROR) << "Fail to SSL_new: " << SSLError(ERR_get_error());
-        return NULL;
+        return nullptr;
     }
     if (SSL_set_fd(ssl, fd) != 1) {
         LOG(ERROR) << "Fail to SSL_set_fd: " << SSLError(ERR_get_error());
         SSL_free(ssl);
-        return NULL;
+        return nullptr;
     }
 
     if (server_mode) {
@@ -785,7 +785,7 @@ static unsigned long SSLGetThreadId() {
 // may crash probably due to some TLS data used inside OpenSSL
 // Also according to performance test, there is little difference
 // between pthread mutex and bthread mutex
-static butil::Mutex* g_ssl_mutexs = NULL;
+static butil::Mutex* g_ssl_mutexs = nullptr;
 
 static void SSLLockCallback(int mode, int n, const char* file, int line) {
     (void)file;
@@ -818,94 +818,94 @@ int SSLThreadInit() {
 #ifndef OPENSSL_NO_DH
 
 static DH* SSLGetDH1024() {
-    BIGNUM* p = get_rfc2409_prime_1024(NULL);
+    BIGNUM* p = get_rfc2409_prime_1024(nullptr);
     if (!p) {
-        return NULL;
+        return nullptr;
     }
     // See RFC 2409, Section 6 "Oakley Groups"
     // for the reason why 2 is used as generator.
-    BIGNUM* g = NULL;
+    BIGNUM* g = nullptr;
     BN_dec2bn(&g, "2");
     if (!g) {
         BN_free(p);
-        return NULL;
+        return nullptr;
     }
     DH *dh = DH_new();
     if (!dh) {
         BN_free(p);
         BN_free(g);
-        return NULL;
+        return nullptr;
     }
-    DH_set0_pqg(dh, p, NULL, g);
+    DH_set0_pqg(dh, p, nullptr, g);
     return dh;
 }
 
 static DH* SSLGetDH2048() {
-    BIGNUM* p = get_rfc3526_prime_2048(NULL);
+    BIGNUM* p = get_rfc3526_prime_2048(nullptr);
     if (!p) {
-        return NULL;
+        return nullptr;
     }
     // See RFC 3526, Section 3 "2048-bit MODP Group"
     // for the reason why 2 is used as generator.
-    BIGNUM* g = NULL;
+    BIGNUM* g = nullptr;
     BN_dec2bn(&g, "2");
     if (!g) {
         BN_free(p);
-        return NULL;
+        return nullptr;
     }
     DH* dh = DH_new();
     if (!dh) {
         BN_free(p);
         BN_free(g);
-        return NULL;
+        return nullptr;
     }
-    DH_set0_pqg(dh, p, NULL, g);
+    DH_set0_pqg(dh, p, nullptr, g);
     return dh;
 }
 
 static DH* SSLGetDH4096() {
-    BIGNUM* p = get_rfc3526_prime_4096(NULL);
+    BIGNUM* p = get_rfc3526_prime_4096(nullptr);
     if (!p) {
-        return NULL;
+        return nullptr;
     }
     // See RFC 3526, Section 5 "4096-bit MODP Group"
     // for the reason why 2 is used as generator.
-    BIGNUM* g = NULL;
+    BIGNUM* g = nullptr;
     BN_dec2bn(&g, "2");
     if (!g) {
         BN_free(p);
-        return NULL;
+        return nullptr;
     }
     DH *dh = DH_new();
     if (!dh) {
         BN_free(p);
         BN_free(g);
-        return NULL;
+        return nullptr;
     }
-    DH_set0_pqg(dh, p, NULL, g);
+    DH_set0_pqg(dh, p, nullptr, g);
     return dh;
 }
 
 static DH* SSLGetDH8192() {
-    BIGNUM* p = get_rfc3526_prime_8192(NULL);
+    BIGNUM* p = get_rfc3526_prime_8192(nullptr);
     if (!p) {
-        return NULL;
+        return nullptr;
     }
     // See RFC 3526, Section 7 "8192-bit MODP Group"
     // for the reason why 2 is used as generator.
-    BIGNUM* g = NULL;
+    BIGNUM* g = nullptr;
     BN_dec2bn(&g, "2");
     if (!g) {
         BN_free(g);
-        return NULL;
+        return nullptr;
     }
     DH *dh = DH_new();
     if (!dh) {
         BN_free(p);
         BN_free(g);
-        return NULL;
+        return nullptr;
     }
-    DH_set0_pqg(dh, p, NULL, g);
+    DH_set0_pqg(dh, p, nullptr, g);
     return dh;
 }
 
@@ -913,19 +913,19 @@ static DH* SSLGetDH8192() {
 
 int SSLDHInit() {
 #ifndef OPENSSL_NO_DH
-    if ((g_dh_1024 = SSLGetDH1024()) == NULL) {
+    if ((g_dh_1024 = SSLGetDH1024()) == nullptr) {
         LOG(ERROR) << "Fail to initialize DH-1024";
         return -1;
     }
-    if ((g_dh_2048 = SSLGetDH2048()) == NULL) {
+    if ((g_dh_2048 = SSLGetDH2048()) == nullptr) {
         LOG(ERROR) << "Fail to initialize DH-2048";
         return -1;
     }
-    if ((g_dh_4096 = SSLGetDH4096()) == NULL) {
+    if ((g_dh_4096 = SSLGetDH4096()) == nullptr) {
         LOG(ERROR) << "Fail to initialize DH-4096";
         return -1;
     }
-    if ((g_dh_8192 = SSLGetDH8192()) == NULL) {
+    if ((g_dh_8192 = SSLGetDH8192()) == nullptr) {
         LOG(ERROR) << "Fail to initialize DH-8192";
         return -1;
     }
@@ -970,7 +970,7 @@ void Print(std::ostream& os, SSL* ssl, const char* sep) {
 
 void Print(std::ostream& os, X509* cert, const char* sep) {
     BIO* buf = BIO_new(BIO_s_mem());
-    if (buf == NULL) {
+    if (buf == nullptr) {
         return;
     }
     BIO_printf(buf, "subject=");
@@ -990,7 +990,7 @@ void Print(std::ostream& os, X509* cert, const char* sep) {
     BIO_printf(buf, "%sissuer=", sep);
     X509_NAME_print(buf, X509_get_issuer_name(cert), 0);
 
-    char* bufp = NULL;
+    char* bufp = nullptr;
     int len = BIO_get_mem_data(buf, &bufp);
     os << butil::StringPiece(bufp, len);
 }
diff --git a/src/brpc/details/ssl_helper.h b/src/brpc/details/ssl_helper.h
index 815285c2..97fa7328 100644
--- a/src/brpc/details/ssl_helper.h
+++ b/src/brpc/details/ssl_helper.h
@@ -60,7 +60,7 @@ bool SupportsPeerNameVerification();
 
 struct FreeSSLCTX {
     inline void operator()(SSL_CTX* ctx) const {
-        if (ctx != NULL) {
+        if (ctx != nullptr) {
             SSL_CTX_free(ctx);
         }
     }
diff --git a/src/brpc/details/tcmalloc_extension.cpp 
b/src/brpc/details/tcmalloc_extension.cpp
index 6f0c9e45..a8704270 100644
--- a/src/brpc/details/tcmalloc_extension.cpp
+++ b/src/brpc/details/tcmalloc_extension.cpp
@@ -24,7 +24,7 @@
 namespace {
 typedef MallocExtension* (*GetInstanceFn)();
 static pthread_once_t g_get_instance_fn_once = PTHREAD_ONCE_INIT;
-static GetInstanceFn g_get_instance_fn = NULL;
+static GetInstanceFn g_get_instance_fn = nullptr;
 static void InitGetInstanceFn() {
     g_get_instance_fn = (GetInstanceFn)dlsym(
         RTLD_NEXT, "_ZN15MallocExtension8instanceEv");
@@ -43,11 +43,11 @@ MallocExtension* BAIDU_WEAK MallocExtension::instance() {
     if (g_get_instance_fn) {
         return g_get_instance_fn();
     }
-    return NULL;
+    return nullptr;
 }
 
 bool IsHeapProfilerEnabled() {
-    return MallocExtension::instance() != NULL;
+    return MallocExtension::instance() != nullptr;
 }
 
 bool IsTCMallocEnabled() {
@@ -56,7 +56,7 @@ bool IsTCMallocEnabled() {
 
 static bool check_TCMALLOC_SAMPLE_PARAMETER() {
     char* str = getenv("TCMALLOC_SAMPLE_PARAMETER");
-    if (str == NULL) {
+    if (str == nullptr) {
         return false;
     }
     char* endptr;
diff --git a/src/brpc/details/tcmalloc_extension.h 
b/src/brpc/details/tcmalloc_extension.h
index 037393ec..ee23b725 100644
--- a/src/brpc/details/tcmalloc_extension.h
+++ b/src/brpc/details/tcmalloc_extension.h
@@ -168,14 +168,14 @@ class PERFTOOLS_DLL_DECL MallocExtension {
   // Get the named "property"'s value.  Returns true if the property
   // is known.  Returns false if the property is not a valid property
   // name for the current malloc implementation.
-  // REQUIRES: property != NULL; value != NULL
+  // REQUIRES: property != nullptr; value != nullptr
   virtual bool GetNumericProperty(const char* property, size_t* value);
 
   // Set the named "property"'s value.  Returns true if the property
   // is known and writable.  Returns false if the property is not a
   // valid property name for the current malloc implementation, or
   // is not writable.
-  // REQUIRES: property != NULL
+  // REQUIRES: property != nullptr
   virtual bool SetNumericProperty(const char* property, size_t value);
 
   // Mark the current thread as "idle".  This routine may optionally
@@ -232,14 +232,14 @@ class PERFTOOLS_DLL_DECL MallocExtension {
   // p must have been allocated by this malloc implementation,
   // must not be an interior pointer -- that is, must be exactly
   // the pointer returned to by malloc() et al., not some offset
-  // from that -- and should not have been freed yet.  p may be NULL.
+  // from that -- and should not have been freed yet.  p may be nullptr.
   // (Currently only implemented in tcmalloc; other implementations
   // will return 0.)
   // This is equivalent to malloc_size() in OS X, malloc_usable_size()
   // in glibc, and _msize() for windows.
   virtual size_t GetAllocatedSize(void* p);
 
-  // The current malloc implementation.  Always non-NULL.
+  // The current malloc implementation.  Always non-nullptr.
   static MallocExtension* instance();
 
   // Change the malloc implementation.  Typically called by the
@@ -301,7 +301,7 @@ class PERFTOOLS_DLL_DECL MallocExtension {
   //
   // It is the responsibility of the caller to "delete[]" the returned array.
   //
-  // May return NULL to indicate no results.
+  // May return nullptr to indicate no results.
   //
   // This is an internal extension.  Callers should use the more
   // convenient "GetHeapSample(string*)" method defined above.
diff --git a/src/brpc/details/usercode_backup_pool.cpp 
b/src/brpc/details/usercode_backup_pool.cpp
index 338038ae..fba05e84 100644
--- a/src/brpc/details/usercode_backup_pool.cpp
+++ b/src/brpc/details/usercode_backup_pool.cpp
@@ -67,7 +67,7 @@ static pthread_cond_t s_usercode_cond = 
PTHREAD_COND_INITIALIZER;
 static pthread_once_t s_usercode_init = PTHREAD_ONCE_INIT;
 butil::static_atomic<int> g_usercode_inplace = BUTIL_STATIC_ATOMIC_INIT(0);
 bool g_too_many_usercode = false;
-static UserCodeBackupPool* s_usercode_pool = NULL;
+static UserCodeBackupPool* s_usercode_pool = nullptr;
 
 static int GetUserCodeInPlace(void*) {
     return g_usercode_inplace.load(butil::memory_order_relaxed);
@@ -75,7 +75,7 @@ static int GetUserCodeInPlace(void*) {
 
 static size_t GetUserCodeQueueSize(void*) {
     BAIDU_SCOPED_LOCK(s_usercode_mutex);
-    return (s_usercode_pool != NULL ? s_usercode_pool->queue.size() : 0);
+    return (s_usercode_pool != nullptr ? s_usercode_pool->queue.size() : 0);
 }
 
 static double GetInPoolElapseInSecond(void* arg) {
@@ -83,8 +83,8 @@ static double GetInPoolElapseInSecond(void* arg) {
 }
 
 UserCodeBackupPool::UserCodeBackupPool()
-    : inplace_var("rpc_usercode_inplace", GetUserCodeInPlace, NULL)
-    , queue_size_var("rpc_usercode_queue_size", GetUserCodeQueueSize, NULL)
+    : inplace_var("rpc_usercode_inplace", GetUserCodeInPlace, nullptr)
+    , queue_size_var("rpc_usercode_queue_size", GetUserCodeQueueSize, nullptr)
     , inpool_count("rpc_usercode_backup_count")
     , inpool_per_second("rpc_usercode_backup_second", &inpool_count)
     , inpool_elapse_s(GetInPoolElapseInSecond, &inpool_elapse_us)
@@ -94,7 +94,7 @@ UserCodeBackupPool::UserCodeBackupPool()
 static void* UserCodeRunner(void* args) {
     butil::PlatformThread::SetNameSimple("brpc_user_code_runner");
     static_cast<UserCodeBackupPool*>(args)->UserCodeRunningLoop();
-    return NULL;
+    return nullptr;
 }
 
 int UserCodeBackupPool::Init() {
@@ -102,7 +102,7 @@ int UserCodeBackupPool::Init() {
     // during termination of program).
     for (int i = 0; i < FLAGS_usercode_backup_threads; ++i) {
         pthread_t th;
-        if (pthread_create(&th, NULL, UserCodeRunner, this) != 0) {
+        if (pthread_create(&th, nullptr, UserCodeRunner, this) != 0) {
             LOG(ERROR) << "Fail to create UserCodeRunner";
             return -1;
         }
@@ -120,7 +120,7 @@ void UserCodeBackupPool::UserCodeRunningLoop() {
     int64_t last_time = butil::cpuwide_time_us();
     while (true) {
         bool blocked = false;
-        UserCode usercode = { NULL, NULL };
+        UserCode usercode = { nullptr, nullptr };
         {
             BAIDU_SCOPED_LOCK(s_usercode_mutex);
             while (queue.empty()) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to