From 50145f62c923403f8280a34fa08d599a51e76884 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:58:27 +0100 Subject: [PATCH] ci, iwyu: Enforce warning-free `src/common` Fix all IWYU warnings in `src/common` and treat them as errors in CI. Additionally, ensure that our drop-in header replacements are used instead of system headers: - `` instead of `` - `` instead of `` --- ci/test/03_test_script.sh | 5 +++-- src/common/args.cpp | 2 -- src/common/args.h | 1 - src/common/bloom.cpp | 3 +-- src/common/bloom.h | 3 ++- src/common/config.cpp | 9 +++------ src/common/init.cpp | 4 ++-- src/common/interfaces.cpp | 5 +++-- src/common/messages.cpp | 3 ++- src/common/messages.h | 4 +++- src/common/netif.cpp | 12 ++++++++++-- src/common/netif.h | 1 + src/common/pcp.cpp | 23 +++++++++++++++++------ src/common/pcp.h | 8 +++++++- src/common/run_command.cpp | 4 ++++ src/common/settings.cpp | 5 ++--- src/common/settings.h | 4 +++- src/common/signmessage.cpp | 5 ++++- src/common/system.cpp | 6 ++++-- src/common/system.h | 4 ++-- src/common/url.cpp | 1 + src/test/util_tests.cpp | 1 + 22 files changed, 75 insertions(+), 38 deletions(-) diff --git a/ci/test/03_test_script.sh b/ci/test/03_test_script.sh index 7650ab7d86b..834473b1ada 100755 --- a/ci/test/03_test_script.sh +++ b/ci/test/03_test_script.sh @@ -234,7 +234,7 @@ fi if [[ "${RUN_IWYU}" == true ]]; then # TODO: Consider enforcing IWYU across the entire codebase. - FILES_WITH_ENFORCED_IWYU="/src/(((bench|crypto|index|kernel|primitives|script|univalue/(lib|test)|util|zmq)/.*|common/license_info|node/(blockstorage|interfaces|miner|mining_args|utxo_snapshot)|rpc/mining|clientversion|core_io|signet|init)\\.cpp)" + FILES_WITH_ENFORCED_IWYU='/src/((bench|common|crypto|index|kernel|primitives|script|univalue/(lib|test)|util|zmq)/.*|node/(blockstorage|interfaces|miner|mining_args|utxo_snapshot)|rpc/mining|clientversion|core_io|signet|init)\.cpp' jq --arg patterns "$FILES_WITH_ENFORCED_IWYU" 'map(select(.file | test($patterns)))' "${BASE_BUILD_DIR}/compile_commands.json" > "${BASE_BUILD_DIR}/compile_commands_iwyu_errors.json" jq --arg patterns "$FILES_WITH_ENFORCED_IWYU" 'map(select(.file | test($patterns) | not))' "${BASE_BUILD_DIR}/compile_commands.json" > "${BASE_BUILD_DIR}/compile_commands_iwyu_warnings.json" @@ -247,7 +247,8 @@ if [[ "${RUN_IWYU}" == true ]]; then -p "${BASE_BUILD_DIR}" "${MAKEJOBS}" \ -- -Xiwyu --cxx17ns -Xiwyu --mapping_file="${BASE_ROOT_DIR}/contrib/devtools/iwyu/bitcoin.core.imp" \ -Xiwyu --max_line_length=160 \ - -Xiwyu --check_also="*/primitives/*.h" \ + -Xiwyu --check_also='*/common/types\.h' \ + -Xiwyu --check_also='*/primitives/transaction_identifier\.h' \ 2>&1 || true } | tee /tmp/iwyu_ci.out python3 "/include-what-you-use/fix_includes.py" --nosafe_headers < /tmp/iwyu_ci.out diff --git a/src/common/args.cpp b/src/common/args.cpp index cfd36e1f6a5..97b37eb4387 100644 --- a/src/common/args.cpp +++ b/src/common/args.cpp @@ -23,8 +23,6 @@ #endif #include -#include -#include #include #include #include diff --git a/src/common/args.h b/src/common/args.h index 0a3195f89d6..0a83e143047 100644 --- a/src/common/args.h +++ b/src/common/args.h @@ -6,7 +6,6 @@ #define BITCOIN_COMMON_ARGS_H #include -#include #include #include #include diff --git a/src/common/bloom.cpp b/src/common/bloom.cpp index 3ee78994c14..c15c8f78f90 100644 --- a/src/common/bloom.cpp +++ b/src/common/bloom.cpp @@ -16,8 +16,7 @@ #include #include -#include -#include +#include #include static constexpr double LN2SQUARED = 0.4804530139182014246671025263266649717305529515945455; diff --git a/src/common/bloom.h b/src/common/bloom.h index 97007e1ff51..c9ed89f85e3 100644 --- a/src/common/bloom.h +++ b/src/common/bloom.h @@ -6,8 +6,9 @@ #define BITCOIN_COMMON_BLOOM_H #include -#include +#include +#include #include class COutPoint; diff --git a/src/common/config.cpp b/src/common/config.cpp index cc7ffd59537..8cf324ca483 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -2,28 +2,25 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include +#include // IWYU pragma: associated #include #include #include #include -#include +#include #include #include #include #include -#include #include -#include #include #include -#include #include #include -#include #include +#include #include #include #include diff --git a/src/common/init.cpp b/src/common/init.cpp index 5c9742bec47..091b8d81329 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -2,15 +2,15 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include + #include #include -#include #include #include #include #include -#include #include #include diff --git a/src/common/interfaces.cpp b/src/common/interfaces.cpp index b501493d6bf..3873ca2e864 100644 --- a/src/common/interfaces.cpp +++ b/src/common/interfaces.cpp @@ -2,8 +2,9 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include -#include +#include // IWYU pragma: associated +#include // IWYU pragma: associated + #include #include diff --git a/src/common/messages.cpp b/src/common/messages.cpp index 82ad310bb70..e558442f427 100644 --- a/src/common/messages.cpp +++ b/src/common/messages.cpp @@ -4,16 +4,17 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include + #include #include #include #include +#include #include #include #include #include -#include #include #include #include diff --git a/src/common/messages.h b/src/common/messages.h index 60fdaa18625..6dc3212f8c9 100644 --- a/src/common/messages.h +++ b/src/common/messages.h @@ -13,17 +13,19 @@ #include #include +#include struct bilingual_str; - enum class FeeEstimateMode; enum class FeeReason; + namespace node { enum class TransactionError; } // namespace node namespace common { enum class PSBTError; + bool FeeModeFromString(std::string_view mode_string, FeeEstimateMode& fee_estimate_mode); std::string StringForFeeReason(FeeReason reason); std::string FeeModes(const std::string& delimiter); diff --git a/src/common/netif.cpp b/src/common/netif.cpp index 997db7d5b93..1120ee6057e 100644 --- a/src/common/netif.cpp +++ b/src/common/netif.cpp @@ -6,12 +6,22 @@ #include +#include #include #include #include #include +#include +#include +#include +#include +#include +#include +#include + #if defined(__linux__) +#include #include #elif defined(__FreeBSD__) #include @@ -27,8 +37,6 @@ #include #endif -#include - namespace { //! Return CNetAddr for the specified OS-level network address. diff --git a/src/common/netif.h b/src/common/netif.h index 769bcbccb32..84df00a207d 100644 --- a/src/common/netif.h +++ b/src/common/netif.h @@ -8,6 +8,7 @@ #include #include +#include //! Query the OS for the default gateway for `network`. This only makes sense for NET_IPV4 and NET_IPV6. //! Returns std::nullopt if it cannot be found, or there is no support for this OS. diff --git a/src/common/pcp.cpp b/src/common/pcp.cpp index 7b22e82eda8..96a858213d1 100644 --- a/src/common/pcp.cpp +++ b/src/common/pcp.cpp @@ -4,19 +4,30 @@ #include -#include -#include +#include #include +#include #include #include -#include -#include +#include #include #include -#include #include -#include +#include #include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace { diff --git a/src/common/pcp.h b/src/common/pcp.h index 121349b02a0..c48317f7301 100644 --- a/src/common/pcp.h +++ b/src/common/pcp.h @@ -6,10 +6,16 @@ #define BITCOIN_COMMON_PCP_H #include -#include +#include +#include +#include +#include +#include #include +class CThreadInterrupt; + // RFC6886 NAT-PMP and RFC6887 Port Control Protocol (PCP) implementation. // NAT-PMP and PCP use network byte order (big-endian). diff --git a/src/common/run_command.cpp b/src/common/run_command.cpp index 86f89e17f23..8c57e53bf11 100644 --- a/src/common/run_command.cpp +++ b/src/common/run_command.cpp @@ -14,6 +14,10 @@ #include #endif // ENABLE_EXTERNAL_SIGNER +#include +#include +#include + UniValue RunCommandParseJSON(const std::vector& cmd_args, const std::string& str_std_in) { #ifdef ENABLE_EXTERNAL_SIGNER diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 7d511b574de..eca29becdae 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -2,15 +2,14 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include - #include // IWYU pragma: keep +#include + #include #include #include -#include #include #include #include diff --git a/src/common/settings.h b/src/common/settings.h index bc7b89a9b42..6f2579b128e 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -12,7 +12,9 @@ #include #include -class UniValue; +// Users of this header need to explicitly #include +// IWYU pragma: no_include +class UniValue; // IWYU pragma: keep namespace common { diff --git a/src/common/signmessage.cpp b/src/common/signmessage.cpp index 0f9e1f5e30d..b45951f61e7 100644 --- a/src/common/signmessage.cpp +++ b/src/common/signmessage.cpp @@ -4,15 +4,18 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include + +#include #include #include #include #include #include +#include #include -#include #include +#include #include #include #include diff --git a/src/common/system.cpp b/src/common/system.cpp index ca7b857d983..c33e3564caa 100644 --- a/src/common/system.cpp +++ b/src/common/system.cpp @@ -12,12 +12,13 @@ #include #ifdef WIN32 -#include -#include #include +#include +#include #include #else #include +#include #include #endif @@ -29,6 +30,7 @@ #include #include #include +#include #include #include #include diff --git a/src/common/system.h b/src/common/system.h index a3100fecbc1..6fa6bd44008 100644 --- a/src/common/system.h +++ b/src/common/system.h @@ -7,10 +7,10 @@ #define BITCOIN_COMMON_SYSTEM_H #include // IWYU pragma: keep + #include -#include -#include +#include #include #include diff --git a/src/common/url.cpp b/src/common/url.cpp index 19db4e99dfa..a186c5124fc 100644 --- a/src/common/url.cpp +++ b/src/common/url.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp index 4dbe9b456a1..90510e3dec0 100644 --- a/src/test/util_tests.cpp +++ b/src/test/util_tests.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include