diff --git a/CMake/Settings.cmake b/CMake/Settings.cmake index 119d09b5c..cce729fe0 100644 --- a/CMake/Settings.cmake +++ b/CMake/Settings.cmake @@ -1,10 +1,34 @@ -target_compile_options (clio PUBLIC +set(COMPILER_FLAGS -Wall + -Wcast-align + -Wdouble-promotion -Wextra -Werror + -Wformat=2 + -Wimplicit-fallthrough + -Wmisleading-indentation -Wno-narrowing -Wno-deprecated-declarations -Wno-dangling-else -Wno-unused-but-set-variable + -Wnon-virtual-dtor + -Wnull-dereference + -Wold-style-cast + -Woverloaded-virtual -pedantic + -Wpedantic + -Wunused ) +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + list(APPEND COMPILER_FLAGS + -Wduplicated-branches + -Wduplicated-cond + -Wlifetime + -Wlogical-op + -Wuseless-cast + ) +endif () + +# See https://github.com/cpp-best-practices/cppbestpractices/blob/master/02-Use_the_Tools_Available.md#gcc--clang for the flags description + +target_compile_options (clio PUBLIC ${COMPILER_FLAGS}) diff --git a/src/data/LedgerCache.cpp b/src/data/LedgerCache.cpp index 0b976d4b6..731d66065 100644 --- a/src/data/LedgerCache.cpp +++ b/src/data/LedgerCache.cpp @@ -146,7 +146,7 @@ LedgerCache::getObjectHitRate() const { if (!objectReqCounter_) return 1; - return ((float)objectHitCounter_) / objectReqCounter_; + return static_cast(objectHitCounter_) / objectReqCounter_; } float @@ -154,7 +154,7 @@ LedgerCache::getSuccessorHitRate() const { if (!successorReqCounter_) return 1; - return ((float)successorHitCounter_) / successorReqCounter_; + return static_cast(successorHitCounter_) / successorReqCounter_; } } // namespace data diff --git a/src/etl/LoadBalancer.cpp b/src/etl/LoadBalancer.cpp index 691d64f6b..2605e06f8 100644 --- a/src/etl/LoadBalancer.cpp +++ b/src/etl/LoadBalancer.cpp @@ -147,7 +147,7 @@ LoadBalancer::forwardToRippled( std::string const& clientIp, boost::asio::yield_context yield) const { - srand((unsigned)time(0)); + srand(static_cast(time(0))); auto sourceIdx = rand() % sources_.size(); auto numAttempts = 0u; @@ -193,7 +193,7 @@ template bool LoadBalancer::execute(Func f, uint32_t ledgerSequence) { - srand((unsigned)time(0)); + srand(static_cast(time(0))); auto sourceIdx = rand() % sources_.size(); auto numAttempts = 0; diff --git a/src/etl/impl/AsyncData.h b/src/etl/impl/AsyncData.h index 7d915d1f5..053a44b71 100644 --- a/src/etl/impl/AsyncData.h +++ b/src/etl/impl/AsyncData.h @@ -128,7 +128,7 @@ class AsyncCallData auto& obj = *(cur_->mutable_ledger_objects()->mutable_objects(i)); if (!more && nextPrefix_ != 0x00) { - if (((unsigned char)obj.key()[0]) >= nextPrefix_) + if (static_cast(obj.key()[0]) >= nextPrefix_) continue; } cacheUpdates.push_back( diff --git a/src/etl/impl/LedgerLoader.h b/src/etl/impl/LedgerLoader.h index 857e8f205..1a6552ee3 100644 --- a/src/etl/impl/LedgerLoader.h +++ b/src/etl/impl/LedgerLoader.h @@ -108,7 +108,7 @@ class LedgerLoader result.nfTokensData.push_back(*maybeNFT); result.accountTxData.emplace_back(txMeta, sttx.getTransactionID()); - std::string keyStr{(const char*)sttx.getTransactionID().data(), 32}; + std::string keyStr{reinterpret_cast(sttx.getTransactionID().data()), 32}; backend_->writeTransaction( std::move(keyStr), ledger.seq, diff --git a/src/rpc/BookChangesHelper.h b/src/rpc/BookChangesHelper.h index 49cc43376..7733ea523 100644 --- a/src/rpc/BookChangesHelper.h +++ b/src/rpc/BookChangesHelper.h @@ -199,6 +199,7 @@ class BookChanges final case ripple::ttOFFER_CREATE: if (tx->isFieldPresent(ripple::sfOfferSequence)) return tx->getFieldU32(ripple::sfOfferSequence); + [[fallthrough]]; default: return std::nullopt; } diff --git a/unittests/SubscriptionManagerTests.cpp b/unittests/SubscriptionManagerTests.cpp index ffa527a93..5e0539611 100644 --- a/unittests/SubscriptionManagerTests.cpp +++ b/unittests/SubscriptionManagerTests.cpp @@ -270,7 +270,7 @@ TEST_F(SubscriptionManagerSimpleBackendTest, SubscriptionManagerAccountProposedT })"; subManagerPtr->forwardProposedTransaction(json::parse(dummyTransaction).get_object()); CheckSubscriberMessage(dummyTransaction, session); - auto rawIdle = (MockSession*)(sessionIdle.get()); + auto rawIdle = static_cast(sessionIdle.get()); EXPECT_EQ("", rawIdle->message); } diff --git a/unittests/SubscriptionTests.cpp b/unittests/SubscriptionTests.cpp index f9a4be081..c0f0ecf81 100644 --- a/unittests/SubscriptionTests.cpp +++ b/unittests/SubscriptionTests.cpp @@ -25,7 +25,6 @@ #include #include -namespace json = boost::json; using namespace feed; // io_context @@ -83,9 +82,9 @@ TEST_F(SubscriptionTest, SubscriptionPublish) sub.publish(std::make_shared("message")); ctx.restart(); ctx.run(); - MockSession* p1 = (MockSession*)(session1.get()); + MockSession* p1 = static_cast(session1.get()); EXPECT_EQ(p1->message, "message"); - MockSession* p2 = (MockSession*)(session2.get()); + MockSession* p2 = static_cast(session2.get()); EXPECT_EQ(p2->message, "message"); sub.unsubscribe(session1); ctx.restart(); @@ -166,9 +165,9 @@ TEST_F(SubscriptionMapTest, SubscriptionMapPublish) subMap.publish(std::make_shared(topic2Message.data()), topic2); // rvalue ctx.restart(); ctx.run(); - MockSession* p1 = (MockSession*)(session1.get()); + MockSession* p1 = static_cast(session1.get()); EXPECT_EQ(p1->message, topic1Message); - MockSession* p2 = (MockSession*)(session2.get()); + MockSession* p2 = static_cast(session2.get()); EXPECT_EQ(p2->message, topic2Message); } @@ -190,9 +189,9 @@ TEST_F(SubscriptionMapTest, SubscriptionMapDeadRemoveSubscriber) subMap.publish(std::make_shared(topic2Message), topic2); // rvalue ctx.restart(); ctx.run(); - MockDeadSession* p1 = (MockDeadSession*)(session1.get()); + MockDeadSession* p1 = static_cast(session1.get()); EXPECT_EQ(p1->dead(), true); - MockSession* p2 = (MockSession*)(session2.get()); + MockSession* p2 = static_cast(session2.get()); EXPECT_EQ(p2->message, topic2Message); subMap.publish(message1, topic1); ctx.restart(); diff --git a/unittests/data/cassandra/BackendTests.cpp b/unittests/data/cassandra/BackendTests.cpp index 06c8c90db..c39659aa2 100644 --- a/unittests/data/cassandra/BackendTests.cpp +++ b/unittests/data/cassandra/BackendTests.cpp @@ -400,8 +400,8 @@ TEST_F(BackendCassandraTest, Basic) EXPECT_EQ(ledgerInfoToBlob(*retLgr), ledgerInfoToBlob(lgrInfoNext)); auto txns = backend->fetchAllTransactionsInLedger(lgrInfoNext.seq, yield); ASSERT_EQ(txns.size(), 1); - EXPECT_STREQ((const char*)txns[0].transaction.data(), (const char*)txnBlob.data()); - EXPECT_STREQ((const char*)txns[0].metadata.data(), (const char*)metaBlob.data()); + EXPECT_STREQ(reinterpret_cast(txns[0].transaction.data()), static_cast(txnBlob.data())); + EXPECT_STREQ(reinterpret_cast(txns[0].metadata.data()), static_cast(metaBlob.data())); auto hashes = backend->fetchAllTransactionHashesInLedger(lgrInfoNext.seq, yield); EXPECT_EQ(hashes.size(), 1); EXPECT_EQ(ripple::strHex(hashes[0]), hashHex); @@ -423,10 +423,10 @@ TEST_F(BackendCassandraTest, Basic) EXPECT_TRUE(key256.parseHex(accountIndexHex)); auto obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlob.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlob.data())); obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq + 1, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlob.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlob.data())); obj = backend->fetchLedgerObject(key256, lgrInfoOld.seq - 1, yield); EXPECT_FALSE(obj); } @@ -462,13 +462,13 @@ TEST_F(BackendCassandraTest, Basic) EXPECT_TRUE(key256.parseHex(accountIndexHex)); auto obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlob.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlob.data())); obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq + 1, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlob.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlob.data())); obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq - 1, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlobOld.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlobOld.data())); obj = backend->fetchLedgerObject(key256, lgrInfoOld.seq - 1, yield); EXPECT_FALSE(obj); } @@ -504,7 +504,7 @@ TEST_F(BackendCassandraTest, Basic) EXPECT_FALSE(obj); obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq - 2, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlobOld.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlobOld.data())); obj = backend->fetchLedgerObject(key256, lgrInfoOld.seq - 1, yield); EXPECT_FALSE(obj); } @@ -517,7 +517,7 @@ TEST_F(BackendCassandraTest, Basic) for (auto& blob : res) { ++key; - std::string keyStr{(const char*)key.data(), key.size()}; + std::string keyStr{reinterpret_cast(key.data()), key.size()}; blob.first = keyStr; blob.second = std::to_string(ledgerSequence) + keyStr; } @@ -537,7 +537,7 @@ TEST_F(BackendCassandraTest, Basic) for (auto& blob : res) { ++base; - std::string hashStr{(const char*)base.data(), base.size()}; + std::string hashStr{reinterpret_cast(base.data()), base.size()}; std::string txnStr = "tx" + std::to_string(ledgerSequence) + hashStr; std::string metaStr = "meta" + std::to_string(ledgerSequence) + hashStr; blob = std::make_tuple(hashStr, txnStr, metaStr); @@ -641,8 +641,8 @@ TEST_F(BackendCassandraTest, Basic) bool found = false; for (auto [retTxn, retMeta, retSeq, retDate] : retTxns) { - if (std::strncmp((const char*)retTxn.data(), (const char*)txn.data(), txn.size()) == 0 && - std::strncmp((const char*)retMeta.data(), (const char*)meta.data(), meta.size()) == 0) + if (std::strncmp(reinterpret_cast(retTxn.data()), static_cast(txn.data()), txn.size()) == 0 && + std::strncmp(reinterpret_cast(retMeta.data()), static_cast(meta.data()), meta.size()) == 0) found = true; } ASSERT_TRUE(found); @@ -665,8 +665,8 @@ TEST_F(BackendCassandraTest, Basic) { auto [txn, meta, seq, date] = retData[i]; auto [hash, expTxn, expMeta] = data[i]; - EXPECT_STREQ((const char*)txn.data(), (const char*)expTxn.data()); - EXPECT_STREQ((const char*)meta.data(), (const char*)expMeta.data()); + EXPECT_STREQ(reinterpret_cast(txn.data()), static_cast(expTxn.data())); + EXPECT_STREQ(reinterpret_cast(meta.data()), static_cast(expMeta.data())); } } std::vector keys; @@ -676,7 +676,7 @@ TEST_F(BackendCassandraTest, Basic) if (obj.size()) { ASSERT_TRUE(retObj.has_value()); - EXPECT_STREQ((const char*)obj.data(), (const char*)retObj->data()); + EXPECT_STREQ(static_cast(obj.data()), reinterpret_cast(retObj->data())); } else { @@ -696,7 +696,7 @@ TEST_F(BackendCassandraTest, Basic) if (obj.size()) { ASSERT_TRUE(retObj.size()); - EXPECT_STREQ((const char*)obj.data(), (const char*)retObj.data()); + EXPECT_STREQ(static_cast(obj.data()), reinterpret_cast(retObj.data())); } else { @@ -746,7 +746,7 @@ TEST_F(BackendCassandraTest, Basic) for (auto account : rec.accounts) { allAccountTx[lgrInfoNext.seq][account].push_back( - std::string{(const char*)rec.txHash.data(), rec.txHash.size()}); + std::string{reinterpret_cast(rec.txHash.data()), rec.txHash.size()}); } } EXPECT_EQ(objs.size(), 25); @@ -779,7 +779,7 @@ TEST_F(BackendCassandraTest, Basic) for (auto account : rec.accounts) { allAccountTx[lgrInfoNext.seq][account].push_back( - std::string{(const char*)rec.txHash.data(), rec.txHash.size()}); + std::string{reinterpret_cast(rec.txHash.data()), rec.txHash.size()}); } } EXPECT_EQ(objs.size(), 25); @@ -978,10 +978,10 @@ TEST_F(BackendCassandraTest, CacheIntegration) EXPECT_TRUE(key256.parseHex(accountIndexHex)); auto obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlob.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlob.data())); obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq + 1, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlob.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlob.data())); obj = backend->fetchLedgerObject(key256, lgrInfoOld.seq - 1, yield); EXPECT_FALSE(obj); } @@ -1016,13 +1016,13 @@ TEST_F(BackendCassandraTest, CacheIntegration) EXPECT_TRUE(key256.parseHex(accountIndexHex)); auto obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlob.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlob.data())); obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq + 1, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlob.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlob.data())); obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq - 1, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlobOld.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlobOld.data())); obj = backend->fetchLedgerObject(key256, lgrInfoOld.seq - 1, yield); EXPECT_FALSE(obj); } @@ -1058,7 +1058,7 @@ TEST_F(BackendCassandraTest, CacheIntegration) EXPECT_FALSE(obj); obj = backend->fetchLedgerObject(key256, lgrInfoNext.seq - 2, yield); EXPECT_TRUE(obj); - EXPECT_STREQ((const char*)obj->data(), (const char*)accountBlobOld.data()); + EXPECT_STREQ(reinterpret_cast(obj->data()), static_cast(accountBlobOld.data())); obj = backend->fetchLedgerObject(key256, lgrInfoOld.seq - 1, yield); EXPECT_FALSE(obj); } @@ -1071,7 +1071,7 @@ TEST_F(BackendCassandraTest, CacheIntegration) for (auto& blob : res) { ++key; - std::string keyStr{(const char*)key.data(), key.size()}; + std::string keyStr{reinterpret_cast(key.data()), key.size()}; blob.first = keyStr; blob.second = std::to_string(ledgerSequence) + keyStr; } @@ -1153,7 +1153,7 @@ TEST_F(BackendCassandraTest, CacheIntegration) if (obj.size()) { ASSERT_TRUE(retObj.has_value()); - EXPECT_STREQ((const char*)obj.data(), (const char*)retObj->data()); + EXPECT_STREQ(static_cast(obj.data()), reinterpret_cast(retObj->data())); } else { @@ -1173,7 +1173,7 @@ TEST_F(BackendCassandraTest, CacheIntegration) if (obj.size()) { ASSERT_TRUE(retObj.size()); - EXPECT_STREQ((const char*)obj.data(), (const char*)retObj.data()); + EXPECT_STREQ(static_cast(obj.data()), reinterpret_cast(retObj.data())); } else { diff --git a/unittests/util/StringUtils.cpp b/unittests/util/StringUtils.cpp index 3e22e0f19..f4e96f70e 100644 --- a/unittests/util/StringUtils.cpp +++ b/unittests/util/StringUtils.cpp @@ -37,7 +37,7 @@ ripple::uint256 binaryStringToUint256(std::string const& bin) { ripple::uint256 uint; - return uint.fromVoid((void const*)bin.data()); + return uint.fromVoid(static_cast(bin.data())); } std::string