Re: [PATCH v4 0/5] add kconfirm
From: Julian Braha
Date: Fri Sep 04 2026 - 10:52:53 EST
On 7/27/26 01:16, Julian Braha wrote:
> kconfirm now uses the in-tree parser. Making this migration required a
> modification to the parser that allows us to observe the parse tree before
> its final simplification step, thus allowing us to detect dead code.
>
> Since no external crates are now necessary, I’ve removed the Cargo requirement,
> too.
>
> I believe these changes should resolve the major questions, so I’ve
> removed the RFC tag.
>
> Now, onto the existing patch-set description since the RFCs:
>
> ===
>
> kconfirm is a tool to detect misusage of Kconfig. It detects dead code,
> constant conditions, and invalid (reverse) ranges. There are also optional
> checks to detect config options that select visible config options, and to
> check for dead links in the help texts.
>
> See also kconfirm's original introduction to the mailing list:
> https://lore.kernel.org/all/6ec4df6d-1445-48ca-8f54-1d1a83c4716d@xxxxxxxxx/
>
> False Alarms:
> kconfirm aims for zero false-positives, though this is not completely
> feasible due to macro evaluation from the host environment, primarily
> affecting host compiler-related options. There will also be some false
> positives for dead link checks, as this depends on an internet connection,
> and we do not attempt to bypass bot blocks. For this reason, dead link
> checking is disabled by default, but I've provided an example below of how
> to enable it. Additionally, you can view my previous message to the
> mailing list with hand-verified dead links here:
> https://lore.kernel.org/all/6732bf08-41ee-40c4-83b2-4ae8bc0da7cf@xxxxxxxxx/
>
> Additionally, there is an optional check to detect config options that
> select visible config options, as requested by Jani during the review of
> the first RFC:
> https://lore.kernel.org/all/dcb7439832f0bb35598fba653d922b5f6a4d0058@xxxxxxxxx/
>
> Even after deduplicating across architectures, there are well over 1,000
> instances of these select-visible cases, and I suspect that, despite the
> Kconfig documentation saying select-visible should be avoided, some
> exceptions will be made. So, I have left this check disabled by default,
> keeping in line with the goal of having a low-noise checker. If interested
> in using it, I have included an example below of how to enable this check.
>
> Current State of Alarms:
> With x86-64 on Linux v7.2-rc4 (which this RFC is based), there are 1282
> alarms coming from the default set of checks, and an additional 976 alarms
> if enabling the optional select-visible check. The last time I checked
> linux-next (next-20260427), there were 81 unique dead links.
>
> The most critical check is the dead default statements, which has surfaced
> a few misconfiguration bugs (fortunately, just for kunit tests), see
> examples:
> https://lore.kernel.org/all/20260323124118.1414913-1-julianbraha@xxxxxxxxx/
> and:
> https://lore.kernel.org/all/20260323123536.1413732-1-julianbraha@xxxxxxxxx/
>
> But hopefully kconfirm can ease maintenance and we can prevent more of
> these from making it into the tree in the future.
>
> Use it:
> You can test out kconfirm with this patch series by compiling and running
> kconfirm like this:
>
> `make kconfirm`
>
> To enable the select-visible check:
> `KCONFIRM_ARGS="--enable-check select_visible" make kconfirm`
>
> And to enable dead link checks in the help texts:
> `KCONFIRM_ARGS="--enable-check dead_link" make kconfirm`
>
> kconfirm by default runs on the same architecture as the kernel build
> would. To run kconfirm on another architecture (for example, ARM with an
> X86 host):
> `ARCH=arm make kconfirm`
>
> Thanks,
> Julian Braha
> ---
> Changes since RFC v3:
> - Modify kconfig parser to make raw parse tree viewable to enable analysis
> - Switch from external parser to in-tree kconfig parser (Demi)
> - Add Rust bindings for kconfig
> - Remove Cargo and external crates
> - Make curl an optional dependency for optional dead link check (Arnd)
> - Switch from libcurl to curl CLI for dead link checks (Miguel)
> - Adhere to Rust-for-Linux style (Miguel)
> - Add tests (Miguel)
> - Move kconfirm under scripts/kconfig/ to resolve broken tab autocompletion (Nathan)
> - Remove ungrouped attributes style check
> - Add support for checking liveness of ftp and git URIs in help texts
> - Dropped RFC tag
>
> Link to RFC v3:
> https://lore.kernel.org/all/20260516215354.449807-1-julianbraha@xxxxxxxxx/
>
> Changes since RFC v2:
> - Reduce Rust dependencies significantly (follows Demi's suggestions):
> - from 6 direct dependencies to 1
> - from 107 indirect dependencies to 4
> - Replace ureq crate with usage of system libcurl (thanks Demi)
> - Replace clap crate with FFI bindings to libc's getopt_long (also Demi)
> - Remove crates env_logger, regex
> - Switch from vendoring dependencies to requiring users to first download
> outside of Make (as suggested by Miguel)
> - Various makefile improvements (as pointed out by Nicolas):
> - Fix out-of-tree builds
> - Only delete kconfirm artifacts with 'distclean' and 'mrproper'
> - Add myself as maintainer of kconfirm (as discussed with Nicolas)
> - Remove dedicated code license file (pointed out by Jani)
> - Update documentation to explain tool setup
> - Add hint to users to check documentation and download tool dependencies
> - Address sashiko's many code-level and documentation suggestions:
> - Follow the kernel's rust import style
> - Fix a dead_range/duplicate_range alarm mixup
> - Fix potential duplicates in default value style check
> - Avoid panicking on errors
> - Clarify parse failure check usage in documentation
> - Fix typo in documentation
> - Can now enable architectures and disable the default (host) architecture in the CLI
>
> Link to RFC v2:
> https://lore.kernel.org/all/20260509203808.1142311-1-julianbraha@xxxxxxxxx/
>
> Changes since RFC v1:
> - vendored dependencies instead of requiring an internet connection
> - removed Cargo.lock
> - replaced reqwest dependency with smaller ureq
> - removed rustls, expect user to have openssl instead
> - added select-visible check based on Jani's feature request
> - added invalid (reverse) range check
> - deduplicating alarms that appear for multiple architectures
> - `make clean` no longer deletes kconfirm's build artifacts
> - typo fixes in documentation
> - added patch description for the main "add kconfirm" patch (patch 1/2)
>
> Link to RFC v1:
> https://lore.kernel.org/all/20260427174429.779474-1-julianbraha@xxxxxxxxx/
> ---
>
> Julian Braha (5):
> kconfig: add add another callback to the parser to view raw parse tree
> kconfig: add kconfirm
> kconfirm: add tests
> Documentation: add kconfirm
> MAINTAINERS: add entry for kconfirm
>
> Documentation/dev-tools/index.rst | 1 +
> Documentation/dev-tools/kconfirm.rst | 229 ++++++
> MAINTAINERS | 7 +
> Makefile | 17 +-
> scripts/kconfig/.gitignore | 1 +
> scripts/kconfig/Makefile | 54 ++
> scripts/kconfig/kconfig.rs | 445 +++++++++++
> scripts/kconfig/kconfirm/.gitignore | 2 +
> scripts/kconfig/kconfirm/analyze.rs | 340 ++++++++
> scripts/kconfig/kconfirm/arch.rs | 53 ++
> scripts/kconfig/kconfirm/checks.rs | 748 ++++++++++++++++++
> scripts/kconfig/kconfirm/dead_links.rs | 230 ++++++
> scripts/kconfig/kconfirm/kconfirm-cfg.sh | 57 ++
> scripts/kconfig/kconfirm/kconfirm.rs | 278 +++++++
> scripts/kconfig/kconfirm/output.rs | 87 ++
> scripts/kconfig/kconfirm/symbol_table.rs | 105 +++
> .../kconfig/kconfirm/tests/arch/arm/Kconfig | 9 +
> .../kconfirm/tests/arch/powerpc/Kconfig | 4 +
> .../kconfig/kconfirm/tests/arch/riscv/Kconfig | 9 +
> .../kconfig/kconfirm/tests/arch/sh/Kconfig | 4 +
> .../kconfirm/tests/arch/testarch/Kconfig | 4 +
> .../kconfig/kconfirm/tests/arch/um/Kconfig | 4 +
> .../kconfig/kconfirm/tests/arch/x86/Kconfig | 4 +
> .../kconfirm/tests/architecture.Kconfig | 4 +
> .../tests/architecture_common.Kconfig | 19 +
> .../kconfirm/tests/conditional_prompt.Kconfig | 17 +
> scripts/kconfig/kconfirm/tests/conftest.py | 93 +++
> ...nt_condition_negative_expression_1.Kconfig | 13 +
> ...nt_condition_negative_expression_2.Kconfig | 13 +
> ...nstant_condition_negative_symbol_1.Kconfig | 13 +
> ...nstant_condition_negative_symbol_2.Kconfig | 13 +
> .../kconfig/kconfirm/tests/dead_link.Kconfig | 12 +
> .../tests/default_categorization.Kconfig | 20 +
> scripts/kconfig/kconfirm/tests/pytest.ini | 2 +
> scripts/kconfig/kconfirm/tests/ranges.Kconfig | 39 +
> .../kconfirm/tests/select_imply.Kconfig | 28 +
> .../kconfig/kconfirm/tests/test_kconfirm.py | 358 +++++++++
> scripts/kconfig/lkc_proto.h | 2 +
> scripts/kconfig/parser.y | 21 +
> 39 files changed, 3357 insertions(+), 2 deletions(-)
> create mode 100644 Documentation/dev-tools/kconfirm.rst
> create mode 100644 scripts/kconfig/kconfig.rs
> create mode 100644 scripts/kconfig/kconfirm/.gitignore
> create mode 100644 scripts/kconfig/kconfirm/analyze.rs
> create mode 100644 scripts/kconfig/kconfirm/arch.rs
> create mode 100644 scripts/kconfig/kconfirm/checks.rs
> create mode 100644 scripts/kconfig/kconfirm/dead_links.rs
> create mode 100755 scripts/kconfig/kconfirm/kconfirm-cfg.sh
> create mode 100644 scripts/kconfig/kconfirm/kconfirm.rs
> create mode 100644 scripts/kconfig/kconfirm/output.rs
> create mode 100644 scripts/kconfig/kconfirm/symbol_table.rs
> create mode 100644 scripts/kconfig/kconfirm/tests/arch/arm/Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/arch/powerpc/Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/arch/riscv/Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/arch/sh/Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/arch/testarch/Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/arch/um/Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/arch/x86/Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/architecture.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/architecture_common.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/conditional_prompt.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/conftest.py
> create mode 100644 scripts/kconfig/kconfirm/tests/constant_condition/default_constant_condition_negative_expression_1.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/constant_condition/default_constant_condition_negative_expression_2.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/constant_condition/default_constant_condition_negative_symbol_1.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/constant_condition/default_constant_condition_negative_symbol_2.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/dead_link.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/default_categorization.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/pytest.ini
> create mode 100644 scripts/kconfig/kconfirm/tests/ranges.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/select_imply.Kconfig
> create mode 100644 scripts/kconfig/kconfirm/tests/test_kconfirm.py
>
As I've been getting more comfortable with the in-tree Kconfig
interpreter, I've been wondering if the community might prefer the
gradual integration of lints directly into Kconfig, instead of as a
standalone tool. Similar to a comment by Jani on another patch [1].
Otherwise, I can do a round of self-review and send a v5 for this
series. I already noticed some dumb typos in the subject lines, but any
other feedback on v4 would be welcome if kconfirm is the preferred
route :)
Link:
https://lore.kernel.org/all/f362ddf2e0f3ecf41ed81f03f77577473c3e21bc@xxxxxxxxx/
[1]
- Julian Braha