Merge bitcoin/bitcoin#31308: ci, iwyu: Treat warnings as errors for specific directories

02d2b5a11c921ef71c971ee80eb3dfbc75c8cb0d ci, iwyu: Treat warnings as errors for specific directories (Hennadii Stepanov)
57a3eac387bd26689aed7682b248b648dba42779 refactor: Fix includes in `index` directory (Hennadii Stepanov)
bdb8eadcdc193f398ebad83911d3297b5257e721 refactor: Fix includes in `crypto` directory (Hennadii Stepanov)
56f2a689a2016ba2ae9cc40833447dff648af809 ci: Do not patch `leveldb` to workaround UB in "tidy" CI job (Hennadii Stepanov)

Pull request description:

  This PR is the first step towards treating IWYU warnings as errors. At this stage, it applies only to the `crypto` and `index` directories.

ACKs for top commit:
  maflcko:
    re-ACK 02d2b5a11c921ef71c971ee80eb3dfbc75c8cb0d 💮
  ryanofsky:
    Code review ACK 02d2b5a11c921ef71c971ee80eb3dfbc75c8cb0d. Just rebased and update tidy patch comment again since last review
  willcl-ark:
    ACK 02d2b5a11c921ef71c971ee80eb3dfbc75c8cb0d

Tree-SHA512: 1c966e01c47bf3e7d225faa3b819367f757430e2d71e9582fa82d67307aabe3f0d76f69346ee180192e7f5ab194ecc58d2b8ecf178eab26ba3309a6b55bff4b6
This commit is contained in:
Hennadii Stepanov 2025-10-28 11:51:11 +00:00
commit 24434c1284
No known key found for this signature in database
GPG Key ID: 410108112E7EA81F
33 changed files with 214 additions and 64 deletions

View File

@ -41,7 +41,10 @@ echo "=== BEGIN env ==="
env
echo "=== END env ==="
(
# Don't apply patches in the tidy job, because it relies on the `git diff`
# command to detect IWYU errors. It is safe to skip this patch in the tidy job
# because it doesn't run a UB detector.
if [ "$RUN_TIDY" != "true" ]; then
# compact->outputs[i].file_size is uninitialized memory, so reading it is UB.
# The statistic bytes_written is only used for logging, which is disabled in
# CI, so as a temporary minimal fix to work around UB and CI failures, leave
@ -62,7 +65,7 @@ echo "=== END env ==="
mutex_.Lock();
stats_[compact->compaction->level() + 1].Add(stats);
EOF
)
fi
if [ "$RUN_FUZZ_TESTS" = "true" ]; then
export DIR_FUZZ_IN=${DIR_QA_ASSETS}/fuzz_corpora/
@ -211,14 +214,30 @@ if [ "${RUN_TIDY}" = "true" ]; then
false
fi
# TODO: Consider enforcing IWYU across the entire codebase.
FILES_WITH_ENFORCED_IWYU="/src/(crypto|index)/.*\\.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"
cd "${BASE_ROOT_DIR}"
python3 "/include-what-you-use/iwyu_tool.py" \
-p "${BASE_BUILD_DIR}" "${MAKEJOBS}" \
-- -Xiwyu --cxx17ns -Xiwyu --mapping_file="${BASE_ROOT_DIR}/contrib/devtools/iwyu/bitcoin.core.imp" \
-Xiwyu --max_line_length=160 \
2>&1 | tee /tmp/iwyu_ci.out
cd "${BASE_ROOT_DIR}/src"
python3 "/include-what-you-use/fix_includes.py" --nosafe_headers < /tmp/iwyu_ci.out
run_iwyu() {
mv "${BASE_BUILD_DIR}/$1" "${BASE_BUILD_DIR}/compile_commands.json"
python3 "/include-what-you-use/iwyu_tool.py" \
-p "${BASE_BUILD_DIR}" "${MAKEJOBS}" \
-- -Xiwyu --cxx17ns -Xiwyu --mapping_file="${BASE_ROOT_DIR}/contrib/devtools/iwyu/bitcoin.core.imp" \
-Xiwyu --max_line_length=160 \
2>&1 | tee /tmp/iwyu_ci.out
python3 "/include-what-you-use/fix_includes.py" --nosafe_headers < /tmp/iwyu_ci.out
}
run_iwyu "compile_commands_iwyu_errors.json"
if ! ( git --no-pager diff --exit-code ); then
echo "^^^ ⚠️ Failure generated from IWYU"
false
fi
run_iwyu "compile_commands_iwyu_warnings.json"
git --no-pager diff
fi

View File

@ -1,3 +1,16 @@
# Nothing for now.
[
# Compiler intrinsics.
# See: https://github.com/include-what-you-use/include-what-you-use/issues/1764.
{ "include": [ "<emmintrin.h>", "private", "<immintrin.h>", "public" ] },
{ "include": [ "<smmintrin.h>", "private", "<immintrin.h>", "public" ] },
{ "include": [ "<tmmintrin.h>", "private", "<immintrin.h>", "public" ] },
# libc symbols.
{ "symbol": ["AT_HWCAP", "private", "<sys/auxv.h>", "public"] },
{ "symbol": ["AT_HWCAP2", "private", "<sys/auxv.h>", "public"] },
# Fixed in https://github.com/include-what-you-use/include-what-you-use/pull/1706.
{ "symbol": ["SEEK_CUR", "private", "<cstdio>", "public"] },
{ "symbol": ["SEEK_END", "private", "<cstdio>", "public"] },
{ "symbol": ["SEEK_SET", "private", "<cstdio>", "public"] },
]

View File

@ -8,11 +8,10 @@
#include <crypto/common.h>
#include <crypto/chacha20.h>
#include <support/cleanse.h>
#include <span.h>
#include <algorithm>
#include <bit>
#include <cstring>
#include <cassert>
#define QUARTERROUND(a,b,c,d) \
a += b; d = std::rotl(d ^ a, 16); \

View File

@ -5,12 +5,11 @@
#ifndef BITCOIN_CRYPTO_CHACHA20_H
#define BITCOIN_CRYPTO_CHACHA20_H
#include <span.h>
#include <array>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <iterator>
#include <span>
#include <utility>
// classes for ChaCha20 256-bit stream cipher developed by Daniel J. Bernstein

View File

@ -7,10 +7,10 @@
#include <cstddef>
#include <cstdint>
#include <span>
#include <crypto/chacha20.h>
#include <crypto/poly1305.h>
#include <span.h>
/** The AEAD_CHACHA20_POLY1305 authenticated encryption algorithm from RFC8439 section 2.8. */
class AEADChaCha20Poly1305

View File

@ -5,8 +5,10 @@
#include <crypto/hex_base.h>
#include <array>
#include <cassert>
#include <cstring>
#include <string>
#include <tuple>
namespace {

View File

@ -9,6 +9,7 @@
#include <cstddef>
#include <cstdint>
#include <span>
#include <string>
/**

View File

@ -4,8 +4,9 @@
#include <crypto/hkdf_sha256_32.h>
#include <crypto/hmac_sha256.h>
#include <cassert>
#include <cstring>
CHKDF_HMAC_SHA256_L32::CHKDF_HMAC_SHA256_L32(const unsigned char* ikm, size_t ikmlen, const std::string& salt)
{

View File

@ -5,10 +5,8 @@
#ifndef BITCOIN_CRYPTO_HKDF_SHA256_32_H
#define BITCOIN_CRYPTO_HKDF_SHA256_32_H
#include <crypto/hmac_sha256.h>
#include <cstdint>
#include <cstdlib>
#include <cstddef>
#include <string>
/** A rfc5869 HKDF implementation with HMAC_SHA256 and fixed key output length of 32 bytes (L=32) */
class CHKDF_HMAC_SHA256_L32

View File

@ -4,6 +4,8 @@
#include <crypto/hmac_sha256.h>
#include <crypto/sha256.h>
#include <cstring>
CHMAC_SHA256::CHMAC_SHA256(const unsigned char* key, size_t keylen)

View File

@ -7,8 +7,7 @@
#include <crypto/sha256.h>
#include <cstdint>
#include <cstdlib>
#include <cstddef>
/** A hasher class for HMAC-SHA-256. */
class CHMAC_SHA256

View File

@ -4,6 +4,8 @@
#include <crypto/hmac_sha512.h>
#include <crypto/sha512.h>
#include <cstring>
CHMAC_SHA512::CHMAC_SHA512(const unsigned char* key, size_t keylen)

View File

@ -7,8 +7,7 @@
#include <crypto/sha512.h>
#include <cstdint>
#include <cstdlib>
#include <cstddef>
/** A hasher class for HMAC-SHA-512. */
class CHMAC_SHA512

View File

@ -7,11 +7,12 @@
#include <crypto/chacha20.h>
#include <crypto/common.h>
#include <hash.h>
#include <span.h>
#include <uint256.h>
#include <util/check.h>
#include <bit>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <limits>
namespace {

View File

@ -6,9 +6,12 @@
#define BITCOIN_CRYPTO_MUHASH_H
#include <serialize.h>
#include <uint256.h>
#include <cstddef>
#include <cstdint>
#include <span>
class uint256;
class Num3072
{

View File

@ -5,8 +5,6 @@
#include <crypto/common.h>
#include <crypto/poly1305.h>
#include <cstring>
namespace poly1305_donna {
// Based on the public domain implementation by Andrew Moon

View File

@ -8,8 +8,9 @@
#include <span.h>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <span>
#define POLY1305_BLOCK_SIZE 16

View File

@ -10,7 +10,7 @@
#include <cstring>
#if !defined(DISABLE_OPTIMIZED_SHA256)
#include <compat/cpuid.h>
#include <compat/cpuid.h> // IWYU pragma: keep
#if defined(__linux__) && defined(ENABLE_ARM_SHANI)
#include <sys/auxv.h>

View File

@ -13,7 +13,6 @@
#include <array>
#include <cstdint>
#include <cstddef>
#include <arm_acle.h>
#include <arm_neon.h>
namespace {

View File

@ -5,11 +5,11 @@
// This is a translation to GCC extended asm syntax from YASM code by Intel
// (available at the bottom of this file).
#if defined(__x86_64__) || defined(__amd64__)
#include <cstdint>
#include <cstdlib>
#if defined(__x86_64__) || defined(__amd64__)
namespace sha256_sse4
{
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)

View File

@ -8,6 +8,7 @@
#if defined(ENABLE_SSE41) && defined(ENABLE_X86_SHANI)
#include <cstddef>
#include <cstdint>
#include <immintrin.h>

View File

@ -9,9 +9,9 @@
#include <crypto/common.h>
#include <algorithm>
#include <array>
#include <bit>
#include <cstdint>
#include <cassert>
#include <iterator>
#include <span>
void KeccakF(uint64_t (&st)[25])

View File

@ -5,10 +5,9 @@
#ifndef BITCOIN_CRYPTO_SHA3_H
#define BITCOIN_CRYPTO_SHA3_H
#include <span.h>
#include <cstdint>
#include <cstdlib>
#include <span>
//! The Keccak-f[1600] transform.
void KeccakF(uint64_t (&st)[25]);

View File

@ -4,7 +4,11 @@
#include <crypto/siphash.h>
#include <uint256.h>
#include <bit>
#include <cassert>
#include <span>
#define SIPROUND do { \
v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \

View File

@ -6,9 +6,9 @@
#define BITCOIN_CRYPTO_SIPHASH_H
#include <cstdint>
#include <span>
#include <span.h>
#include <uint256.h>
class uint256;
/** SipHash-2-4 */
class CSipHasher

View File

@ -2,10 +2,13 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <chainparams.h>
#include <common/args.h>
#include <index/base.h>
#include <chain.h>
#include <common/args.h>
#include <dbwrapper.h>
#include <interfaces/chain.h>
#include <interfaces/types.h>
#include <kernel/chain.h>
#include <logging.h>
#include <node/abort.h>
@ -13,20 +16,31 @@
#include <node/context.h>
#include <node/database_args.h>
#include <node/interface_ui.h>
#include <primitives/block.h>
#include <sync.h>
#include <tinyformat.h>
#include <uint256.h>
#include <undo.h>
#include <util/fs.h>
#include <util/string.h>
#include <util/thread.h>
#include <util/threadinterrupt.h>
#include <util/time.h>
#include <util/translation.h>
#include <validation.h>
#include <validationinterface.h>
#include <chrono>
#include <cassert>
#include <compare>
#include <cstdint>
#include <memory>
#include <optional>
#include <span>
#include <stdexcept>
#include <string>
#include <thread>
#include <utility>
#include <vector>
constexpr uint8_t DB_BEST_BLOCK{'B'};

View File

@ -5,29 +5,41 @@
#ifndef BITCOIN_INDEX_BASE_H
#define BITCOIN_INDEX_BASE_H
#include <attributes.h>
#include <dbwrapper.h>
#include <interfaces/chain.h>
#include <interfaces/types.h>
#include <util/string.h>
#include <kernel/cs_main.h>
#include <threadsafety.h>
#include <uint256.h>
#include <util/fs.h>
#include <util/threadinterrupt.h>
#include <validationinterface.h>
#include <atomic>
#include <cstddef>
#include <memory>
#include <optional>
#include <string>
#include <thread>
class CBlock;
class CBlockIndex;
class Chainstate;
class ChainstateManager;
namespace interfaces {
class Chain;
} // namespace interfaces
struct CBlockLocator;
struct IndexSummary {
std::string name;
bool synced{false};
int best_block_height{0};
uint256 best_block_hash;
};
namespace interfaces {
struct BlockRef;
}
namespace util {
template <unsigned int num_params>
struct ConstevalFormatString;
}
/**
* Base class for indices of blockchain data. This implements

View File

@ -2,19 +2,39 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <map>
#include <index/blockfilterindex.h>
#include <clientversion.h>
#include <blockfilter.h>
#include <chain.h>
#include <common/args.h>
#include <dbwrapper.h>
#include <flatfile.h>
#include <hash.h>
#include <index/blockfilterindex.h>
#include <index/base.h>
#include <interfaces/chain.h>
#include <interfaces/types.h>
#include <logging.h>
#include <node/blockstorage.h>
#include <undo.h>
#include <util/fs_helpers.h>
#include <serialize.h>
#include <streams.h>
#include <sync.h>
#include <uint256.h>
#include <util/check.h>
#include <util/fs.h>
#include <util/hasher.h>
#include <util/syserror.h>
#include <cerrno>
#include <exception>
#include <ios>
#include <map>
#include <optional>
#include <span>
#include <stdexcept>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
/* The index database stores three items for each block: the disk location of the encoded filter,
* its dSHA256 hash, and the header. Those belonging to blocks on the active chain are indexed by
* height, and those belonging to blocks that have been reorganized out of the active chain are

View File

@ -6,13 +6,24 @@
#define BITCOIN_INDEX_BLOCKFILTERINDEX_H
#include <attributes.h>
#include <blockfilter.h>
#include <chain.h>
#include <flatfile.h>
#include <index/base.h>
#include <interfaces/chain.h>
#include <sync.h>
#include <uint256.h>
#include <util/hasher.h>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <memory>
#include <optional>
#include <unordered_map>
#include <vector>
class BlockFilter;
class CBlockIndex;
enum class BlockFilterType : uint8_t;
static const char* const DEFAULT_BLOCKFILTERINDEX = "0";

View File

@ -2,20 +2,39 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <index/coinstatsindex.h>
#include <arith_uint256.h>
#include <chain.h>
#include <chainparams.h>
#include <coins.h>
#include <common/args.h>
#include <consensus/amount.h>
#include <crypto/muhash.h>
#include <index/coinstatsindex.h>
#include <dbwrapper.h>
#include <index/base.h>
#include <interfaces/chain.h>
#include <interfaces/types.h>
#include <kernel/coinstats.h>
#include <logging.h>
#include <node/blockstorage.h>
#include <primitives/block.h>
#include <primitives/transaction.h>
#include <script/script.h>
#include <serialize.h>
#include <txdb.h>
#include <uint256.h>
#include <undo.h>
#include <util/check.h>
#include <util/fs.h>
#include <validation.h>
#include <compare>
#include <ios>
#include <limits>
#include <span>
#include <string>
#include <utility>
#include <vector>
using kernel::ApplyCoinHash;
using kernel::CCoinsStats;
using kernel::GetBogoSize;

View File

@ -6,11 +6,18 @@
#define BITCOIN_INDEX_COINSTATSINDEX_H
#include <arith_uint256.h>
#include <consensus/amount.h>
#include <crypto/muhash.h>
#include <index/base.h>
#include <interfaces/chain.h>
#include <uint256.h>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <optional>
class CBlockIndex;
class CDBBatch;
namespace kernel {
struct CCoinsStats;
}

View File

@ -4,14 +4,32 @@
#include <index/txindex.h>
#include <clientversion.h>
#include <common/args.h>
#include <dbwrapper.h>
#include <flatfile.h>
#include <index/base.h>
#include <index/disktxpos.h>
#include <interfaces/chain.h>
#include <logging.h>
#include <node/blockstorage.h>
#include <primitives/transaction_identifier.h>
#include <primitives/block.h>
#include <primitives/transaction.h>
#include <serialize.h>
#include <streams.h>
#include <uint256.h>
#include <util/fs.h>
#include <validation.h>
#include <cassert>
#include <cstdint>
#include <cstdio>
#include <exception>
#include <iterator>
#include <span>
#include <string>
#include <utility>
#include <vector>
constexpr uint8_t DB_TXINDEX{'t'};
std::unique_ptr<TxIndex> g_txindex;

View File

@ -6,6 +6,15 @@
#define BITCOIN_INDEX_TXINDEX_H
#include <index/base.h>
#include <primitives/transaction.h>
#include <cstddef>
#include <memory>
class uint256;
namespace interfaces {
class Chain;
}
static constexpr bool DEFAULT_TXINDEX{false};