From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yw1-f169.google.com (mail-yw1-f169.google.com [209.85.128.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 51EFF30FF20 for ; Sun, 17 May 2026 06:10:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.169 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778998229; cv=none; b=Tu5yGkc8ZGkEyddjm4V7u/VZbP88nUTNIrNEK6sGeEp7olSYIZlt9xGgzb79wLhZdHxvYaHC3fzRi4AB7FTkwNAc+NUr6TBJ+jyX9NzMzz6dykvs2tU5zLNy52QZJRFsci0GAkEwrjtypeXpl6/EPYWznaR2fOLcdvZ5CVRxdhk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778998229; c=relaxed/simple; bh=oLbxiEOS9lWW8LguotG7rV1PIyHElDchiSCdjQrlG0Y=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=FY3Lt/aKSPLFAKU5I4JhBu4p/g8Wz1IjuLo/CoOJvsjl2mAOwfgp+SyF9JYclJmIB+s2Tm6h0URWFV9y+0sXJc1BrW4ETWg8ZBT+tSUSj1odrMEQWerFvq1BUO92Hf72y0bV3grYPyxsVRcN3sop4le8slnGC+rUdqZVHskYAnM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JWhBZM+J; arc=none smtp.client-ip=209.85.128.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JWhBZM+J" Received: by mail-yw1-f169.google.com with SMTP id 00721157ae682-7bd5dde63dbso6331827b3.3 for ; Sat, 16 May 2026 23:10:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778998223; x=1779603023; darn=vger.kernel.org; h=in-reply-to:autocrypt:from:content-language:references:cc:to :subject:user-agent:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; bh=YIjfgd4L6MUds2kMM6OSrnv2L/RP7BIlEm4DaN3No0k=; b=JWhBZM+Jj/QOsl2/rh/P3pwV3C81gdlGz7I5HSOCcwTjhAl+1nHpOAcJDRP97nCedD GQOd5jkJ6VqfL8wPWWACaGmButmpYEjf9SlvMrXrzOjO9I3DE6TFe/CCd/AdA+zOPyXq qlrRPrMGm9fPlx0uJZVxr5IcltrTRBUWBsusSoGqVQvXe+rRxNTt4UEAeJvmoOUyyK6a hA1X3hJRSAXXL40AMpasQPc08ONcRr2nmK15FeKtYT3YfusrBqNtHEaNZDi/nMUvgJ20 8vYx0mwiYPDHiMhxMfL9JvbnUdwLzM7HwdLE/mn2KFfYCq/qTRT4cJYETfymzhmcKiYG i8RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778998223; x=1779603023; h=in-reply-to:autocrypt:from:content-language:references:cc:to :subject:user-agent:mime-version:date:message-id:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YIjfgd4L6MUds2kMM6OSrnv2L/RP7BIlEm4DaN3No0k=; b=rG0cJOKXhRiVB3BXedhguYcYTdG6pZm6UKQqwWNYxHK9EllhESCYlfWSnOmOa0KBRl D5kMNnlCgYTOiFlxP7AgQx4EK9OoD0WtbYmqVRIspfh7rbpXvQSzLtRtSW6Zf6P9fmo1 9xU0ZlduNMg8kkKtqgB27l89r8/zZDeMxWXNIl2CHPkHxnz5GDhFkJX7toRSqboTsxeC bdLShw7z7WN7yL02gUptu1ha068yLvHJb72HFZY9fb9sA5znCUJYW8HrpXEU4Ujh/7J8 B9mOYm3qE4HJQNMc/ur+Bg44dF6OFJcKRyYGIY9VKkxcNhz8i7tsWLaL81zf2Mlq0T14 Se5Q== X-Forwarded-Encrypted: i=1; AFNElJ8oRoKDR8N0q87iBH0C9QRSuWI73xUirrBFdSh3v0Qd6cVvrH+fRolcifoBQUNaqyVWQiMixw6pIcc=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+HGApaiM+ZTqhHXogoUo0a6a82zAUCWRlP+D7sNXy6UDa8o7H tPid48BhSTAASiNDkh/g56fF9agDpwfheKLUAubqmrOEJB04SxCNXmUA X-Gm-Gg: Acq92OEoS7JeekM21MEC4b5WuOAX0iuAl1q1a+8YqR3/V8SaTMCKGYWrWGpAKJXPcbL bqf5xwrC5A+rK+61xIfNdtWN7nROlRytQZa6QYCOh9X1OhPWSSyxkTC7MHfOpUePfjpVNWuvR85 9A5jvp5h5FX+dvjWvdrJ5/Pvram1k0W5r+ZuHNG8gUXb2F8LrE2lX7VpTuGpoNVNTiFgZHyUGSC lbqRNbqjT9XZDo5gNm9aU5H5Wyiav8oWzFqm8DruvdLqdznKR4vQygsdcfWTs/YhtFs+YL6JOlY dMQormDpHQYW4Jtwn3Fpgc5rLoOj07L3wNXow8kC8nRZjaDV6svV8q21MwpGW3XJqaxh/StKgsE fp/AlZND3FwXPjyi9gKzg4sSWhZVK0P0upvuu+3StJXRmNnAsKSYaX6xm/xJq/cyh/pGrh8p6AZ YScfd9IcC2vpwWwWr9PpLLMZHwQ2MsjCmg3y5x2ts4JrmslrfqT7KqLRQfiByaFDPz4XgaxQTeG DjaW/yX4EFyfIqhY1yhBrYkL+ESuh2VWTlHW/f00A== X-Received: by 2002:a05:690c:6c87:b0:7c0:8028:11f7 with SMTP id 00721157ae682-7c959b9720amr117545317b3.6.1778998222832; Sat, 16 May 2026 23:10:22 -0700 (PDT) Received: from [10.138.34.110] (h69-131-150-190.cncrtn.broadband.dynamic.tds.net. [69.131.150.190]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7cc9cbb0404sm4771417b3.42.2026.05.16.23.10.19 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 16 May 2026 23:10:20 -0700 (PDT) Message-ID: Date: Sun, 17 May 2026 02:10:04 -0400 Precedence: bulk X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH v3 1/3] scripts: add kconfirm To: Julian Braha , nathan@kernel.org, nsc@kernel.org Cc: jani.nikula@linux.intel.com, akpm@linux-foundation.org, gary@garyguo.net, ljs@kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, masahiroy@kernel.org, ojeda@kernel.org, corbet@lwn.net, qingfang.deng@linux.dev, yann.prono@telecomnancy.net, ej@inai.de, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org References: <20260516215354.449807-1-julianbraha@gmail.com> <20260516215354.449807-2-julianbraha@gmail.com> Content-Language: en-US From: Demi Marie Obenour Autocrypt: addr=demiobenour@gmail.com; keydata= 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 +MYSfkEjBz0E8CLOcAw7JIwAaeBT In-Reply-To: <20260516215354.449807-2-julianbraha@gmail.com> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------XrfVtVa1LPouWVhsakWdKgBS" This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------XrfVtVa1LPouWVhsakWdKgBS Content-Type: multipart/mixed; boundary="------------TqV93QP1ulPRmspZYpcTeGjR"; protected-headers="v1" Message-ID: Date: Sun, 17 May 2026 02:10:04 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH v3 1/3] scripts: add kconfirm To: Julian Braha , nathan@kernel.org, nsc@kernel.org Cc: jani.nikula@linux.intel.com, akpm@linux-foundation.org, gary@garyguo.net, ljs@kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, masahiroy@kernel.org, ojeda@kernel.org, corbet@lwn.net, qingfang.deng@linux.dev, yann.prono@telecomnancy.net, ej@inai.de, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, linux-kbuild@vger.kernel.org References: <20260516215354.449807-1-julianbraha@gmail.com> <20260516215354.449807-2-julianbraha@gmail.com> Content-Language: en-US From: Demi Marie Obenour Autocrypt: addr=demiobenour@gmail.com; keydata= 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 +MYSfkEjBz0E8CLOcAw7JIwAaeBT In-Reply-To: <20260516215354.449807-2-julianbraha@gmail.com> --------------TqV93QP1ulPRmspZYpcTeGjR Content-Type: multipart/mixed; boundary="------------jhmGQRobVkA6ZWilxmc78Uz0" --------------jhmGQRobVkA6ZWilxmc78Uz0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 5/16/26 17:53, Julian Braha wrote: > Add kconfirm into scripts/ >=20 > kconfirm is a static analysis tool with various checks for Kconfig, and= > intended to have zero false alarms by default. These default checks > currently include dead code, constant conditions, and invalid (reverse)= > ranges. >=20 > There are also optional checks for dead links in the help texts, and fo= r > config options that select visible config options. >=20 > Checks are performed on the same architecture as the kernel build, usin= g > a single thread. More architectures can be enabled by passing > `--enable-arch`. Alarms are tagged using the architectures' config opti= ons, > like so: [X86] if specific to x86, or [X86, ARM] if the alarm appears f= or > both x86 and arm. >=20 > Each alarm gets a single line (deduplicated across architectures) and i= s > formatted like this: > [] [, ] config : = >=20 > The tool source contains two Rust packages: kconfirm-lib and > kconfirm-linux. >=20 > kconfirm-lib is the underlying library that analyzes Kconfig code, and > formats alarms for usability. It analyzes the entire Linux Kconfig spec= , > including all architectures. This package exposes the symbol table that= it > constructs so that other tools can import this library, and make use of= it > for their own Kconfig analyses. >=20 > kconfirm-linux imports kconfirm-lib, and provides the CLI, which is > intended for either manual usage, or integration with the Linux build > system so that users can simply run `make kconfirm` from the root. > kconfirm-linux also handles some of the specificities of how Kconfig is= > used in the Linux tree, in contrast to other open source software. E.g.= > the way that each architecture has its own Kconfig and Kconfig.debug > files. >=20 > The tool's dependencies need to be downloaded from crates.io by running= > `cargo vendor` in scripts/kconfirm/ before building and running the too= l. >=20 > Signed-off-by: Julian Braha > --- > Makefile | 15 +- > scripts/Makefile | 2 +- > scripts/kconfirm/.gitignore | 3 + > scripts/kconfirm/Cargo.lock | 60 ++ > scripts/kconfirm/Cargo.toml | 12 + > scripts/kconfirm/Makefile | 14 + > scripts/kconfirm/kconfirm-lib/Cargo.toml | 12 + > scripts/kconfirm/kconfirm-lib/src/analyze.rs | 643 ++++++++++++++++ > scripts/kconfirm/kconfirm-lib/src/checks.rs | 701 ++++++++++++++++++= > scripts/kconfirm/kconfirm-lib/src/curl_ffi.rs | 182 +++++ > .../kconfirm/kconfirm-lib/src/dead_links.rs | 138 ++++ > scripts/kconfirm/kconfirm-lib/src/lib.rs | 62 ++ > scripts/kconfirm/kconfirm-lib/src/output.rs | 111 +++ > .../kconfirm/kconfirm-lib/src/symbol_table.rs | 223 ++++++ > scripts/kconfirm/kconfirm-linux/Cargo.toml | 10 + > .../kconfirm/kconfirm-linux/src/getopt_ffi.rs | 99 +++ > scripts/kconfirm/kconfirm-linux/src/lib.rs | 78 ++ > scripts/kconfirm/kconfirm-linux/src/main.rs | 192 +++++ > 18 files changed, 2552 insertions(+), 5 deletions(-) > create mode 100644 scripts/kconfirm/.gitignore > create mode 100644 scripts/kconfirm/Cargo.lock > create mode 100644 scripts/kconfirm/Cargo.toml > create mode 100644 scripts/kconfirm/Makefile > create mode 100644 scripts/kconfirm/kconfirm-lib/Cargo.toml > create mode 100644 scripts/kconfirm/kconfirm-lib/src/analyze.rs > create mode 100644 scripts/kconfirm/kconfirm-lib/src/checks.rs > create mode 100644 scripts/kconfirm/kconfirm-lib/src/curl_ffi.rs > create mode 100644 scripts/kconfirm/kconfirm-lib/src/dead_links.rs > create mode 100644 scripts/kconfirm/kconfirm-lib/src/lib.rs > create mode 100644 scripts/kconfirm/kconfirm-lib/src/output.rs > create mode 100644 scripts/kconfirm/kconfirm-lib/src/symbol_table.rs > create mode 100644 scripts/kconfirm/kconfirm-linux/Cargo.toml > create mode 100644 scripts/kconfirm/kconfirm-linux/src/getopt_ffi.rs > create mode 100644 scripts/kconfirm/kconfirm-linux/src/lib.rs > create mode 100644 scripts/kconfirm/kconfirm-linux/src/main.rs >=20 > diff --git a/Makefile b/Makefile > index b7b80e84e1eb..99aaed5bdbc5 100644 > --- a/Makefile > +++ b/Makefile > @@ -296,7 +296,7 @@ no-dot-config-targets :=3D $(clean-targets) \ > $(version_h) headers headers_% archheaders archscripts \ > %asm-generic kernelversion %src-pkg dt_binding_check \ > outputmakefile rustavailable rustfmt rustfmtcheck \ > - run-command > + run-command kconfirm > no-sync-config-targets :=3D $(no-dot-config-targets) %install modules_= sign kernelrelease \ > image_name > single-targets :=3D %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.rsi %.s = %/ > @@ -536,6 +536,7 @@ OBJDUMP =3D $(CROSS_COMPILE)objdump > READELF =3D $(CROSS_COMPILE)readelf > STRIP =3D $(CROSS_COMPILE)strip > endif > +CARGO =3D cargo > RUSTC =3D rustc > RUSTDOC =3D rustdoc > RUSTFMT =3D rustfmt > @@ -633,7 +634,7 @@ export RUSTC_BOOTSTRAP :=3D 1 > export CLIPPY_CONF_DIR :=3D $(srctree) > =20 > export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_C= OMPILE LD CC HOSTPKG_CONFIG > -export RUSTC RUSTDOC RUSTFMT RUSTC_OR_CLIPPY_QUIET RUSTC_OR_CLIPPY BIN= DGEN LLVM_LINK > +export CARGO RUSTC RUSTDOC RUSTFMT RUSTC_OR_CLIPPY_QUIET RUSTC_OR_CLIP= PY BINDGEN LLVM_LINK > export HOSTRUSTC KBUILD_HOSTRUSTFLAGS > export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS L= EX YACC AWK INSTALLKERNEL > export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX > @@ -1705,7 +1706,7 @@ MRPROPER_FILES +=3D include/config include/genera= ted \ > vmlinux-gdb.py \ > rpmbuild \ > rust/libmacros.so rust/libmacros.dylib \ > - rust/libpin_init_internal.so rust/libpin_init_internal.dylib > + rust/libpin_init_internal.so rust/libpin_init_internal.dylib \ > =20 > # clean - Delete most, but leave enough to build external modules > # > @@ -2227,7 +2228,7 @@ endif > # Scripts to check various things for consistency > # --------------------------------------------------------------------= ------- > =20 > -PHONY +=3D includecheck versioncheck coccicheck > +PHONY +=3D includecheck versioncheck coccicheck kconfirm > =20 > includecheck: > find $(srctree)/* $(RCS_FIND_IGNORE) \ > @@ -2242,6 +2243,12 @@ versioncheck: > coccicheck: > $(Q)$(BASH) $(srctree)/scripts/$@ > =20 > + > +kconfirm: > + $(Q)$(MAKE) -C $(srctree)/scripts/kconfirm srctree=3D$(abs_srctree) S= RCARCH=3D$(SRCARCH) || \ > + (printf "\n kconfirm failed to compile and run. Have you set up its= dependencies yet?\n See Documentation/dev-tools/kconfirm.rst\n\n" && fa= lse) > +clean-dirs +=3D scripts/kconfirm > + > PHONY +=3D checkstack kernelrelease kernelversion image_name > =20 > # UML needs a little special treatment here. It wants to use the host= > diff --git a/scripts/Makefile b/scripts/Makefile > index 3434a82a119f..460655bd2de1 100644 > --- a/scripts/Makefile > +++ b/scripts/Makefile > @@ -66,4 +66,4 @@ subdir-$(CONFIG_SECURITY_SELINUX) +=3D selinux > subdir-$(CONFIG_SECURITY_IPE) +=3D ipe > =20 > # Let clean descend into subdirs > -subdir- +=3D basic dtc gdb kconfig mod > +subdir- +=3D basic dtc gdb kconfig kconfirm mod > diff --git a/scripts/kconfirm/.gitignore b/scripts/kconfirm/.gitignore > new file mode 100644 > index 000000000000..f63ee0251591 > --- /dev/null > +++ b/scripts/kconfirm/.gitignore > @@ -0,0 +1,3 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +/target > +/vendor > diff --git a/scripts/kconfirm/Cargo.lock b/scripts/kconfirm/Cargo.lock > new file mode 100644 > index 000000000000..d90bc7d2e2a3 > --- /dev/null > +++ b/scripts/kconfirm/Cargo.lock > @@ -0,0 +1,60 @@ > +# This file is automatically @generated by Cargo. > +# It is not intended for manual editing. > +version =3D 4 > + > +[[package]] > +name =3D "bytecount" > +version =3D "0.6.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f= 2cc0365e" > + > +[[package]] > +name =3D "kconfirm-lib" > +version =3D "0.10.0" > +dependencies =3D [ > + "nom-kconfig", > +] > + > +[[package]] > +name =3D "kconfirm-linux" > +version =3D "0.10.0" > +dependencies =3D [ > + "kconfirm-lib", > + "nom-kconfig", > +] > + > +[[package]] > +name =3D "memchr" > +version =3D "2.8.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e= 59ff3f79" > + > +[[package]] > +name =3D "nom" > +version =3D "8.0.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f4= 6c2f9405" > +dependencies =3D [ > + "memchr", > +] > + > +[[package]] > +name =3D "nom-kconfig" > +version =3D "0.11.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5a0220bb2c8e5ad29b06fe0f75a276affeb10c9504726bf46d81fef7= 8d69b1e3" > +dependencies =3D [ > + "nom", > + "nom_locate", > +] > + > +[[package]] > +name =3D "nom_locate" > +version =3D "5.0.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b357= 5c68438d" > +dependencies =3D [ > + "bytecount", > + "memchr", > + "nom", > +] > diff --git a/scripts/kconfirm/Cargo.toml b/scripts/kconfirm/Cargo.toml > new file mode 100644 > index 000000000000..5880b06c4116 > --- /dev/null > +++ b/scripts/kconfirm/Cargo.toml > @@ -0,0 +1,12 @@ > +# SPDX-License-Identifier: GPL-2.0 > +[workspace] > +members =3D ["kconfirm-lib", "kconfirm-linux"] > +resolver =3D "3" > + > +[workspace.package] > +rust-version =3D "1.85.0" > + > +[workspace.dependencies] > +nom-kconfig =3D { version =3D "0.11", default-features =3D false, feat= ures =3D [ > + "display", > +] } > diff --git a/scripts/kconfirm/Makefile b/scripts/kconfirm/Makefile > new file mode 100644 > index 000000000000..6a0b7389103e > --- /dev/null > +++ b/scripts/kconfirm/Makefile > @@ -0,0 +1,14 @@ > +# SPDX-License-Identifier: GPL-2.0 > +# kconfirm makefile > + > +TARGET :=3D kconfirm > + > +# Extra arguments forwarded to kconfirm. > +# Example: make kconfirm KCONFIRM_ARGS=3D"--enable-check dead_links" > +KCONFIRM_ARGS ?=3D > + > +$(TARGET): > + $(CARGO) run --release --offline -p kconfirm-linux -- --linux-path $(= srctree) --enable-arch $(SRCARCH) $(KCONFIRM_ARGS) > + > + > +clean-files +=3D target vendor > diff --git a/scripts/kconfirm/kconfirm-lib/Cargo.toml b/scripts/kconfir= m/kconfirm-lib/Cargo.toml > new file mode 100644 > index 000000000000..dd3d7cb1aa1d > --- /dev/null > +++ b/scripts/kconfirm/kconfirm-lib/Cargo.toml > @@ -0,0 +1,12 @@ > +# SPDX-License-Identifier: GPL-2.0 > +[package] > +name =3D "kconfirm-lib" > +version =3D "0.10.0" > +edition =3D "2024" > +rust-version.workspace =3D true > + > +[dependencies] > +nom-kconfig =3D { workspace =3D true } > + > +[features] > +default =3D [] > diff --git a/scripts/kconfirm/kconfirm-lib/src/analyze.rs b/scripts/kco= nfirm/kconfirm-lib/src/analyze.rs > new file mode 100644 > index 000000000000..24798581dc3d > --- /dev/null > +++ b/scripts/kconfirm/kconfirm-lib/src/analyze.rs > @@ -0,0 +1,643 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +use crate::AnalysisArgs; > +use crate::Check; > +use crate::SymbolTable; > +use crate::dead_links; > +use crate::dead_links::LinkStatus; > +use crate::dead_links::check_link; > +use crate::output::Finding; > +use crate::output::Severity; > +use crate::symbol_table::ChoiceData; > +use nom_kconfig::Attribute::*; > +use nom_kconfig::Entry; > +use nom_kconfig::attribute::DefaultAttribute; > +use nom_kconfig::attribute::Expression; > +use nom_kconfig::attribute::Imply; > +use nom_kconfig::attribute::Select; > +use nom_kconfig::attribute::r#type::Type; > +use nom_kconfig::entry::Choice; > +use nom_kconfig::entry::Config; > +use nom_kconfig::entry::If; > +use nom_kconfig::entry::Menu; > +use nom_kconfig::entry::Source; > +use std::collections::HashSet; > +use std::option::Option; > + > +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] > +enum FunctionalAttributes { > + // only tracking the attributes that affect the semantics, e.g. no= t help texts > + Dependencies, > + Selects, > + Implies, > + Ranges, > + Defaults, > +} > + > +struct AttributeGroupingChecker { > + current_group: Option, > + finished_groups: HashSet, > +} > + > +impl AttributeGroupingChecker { > + fn new() -> Self { > + Self { > + current_group: None, > + finished_groups: HashSet::new(), > + } > + } > + > + // doesn't modify `findings` if the style check is disabled > + fn check( > + &mut self, > + group: FunctionalAttributes, > + args: &AnalysisArgs, > + findings: &mut Vec, > + symbol: &str, > + arch: &String, > + message: String, > + ) { > + if !args.is_enabled(Check::UngroupedAttribute) { > + return; > + } > + > + match self.current_group { > + // still contiguous > + Some(current) if current =3D=3D group =3D> {} > + > + // start of group > + None =3D> { > + self.current_group =3D Some(group); > + } > + > + Some(current) =3D> { > + // the previous group finished > + self.finished_groups.insert(current); > + > + // we've already finished this group, it's ungrouped > + if self.finished_groups.contains(&group) { > + findings.push(Finding { > + severity: Severity::Style, > + check: Check::UngroupedAttribute, > + symbol: Some(symbol.to_string()), > + message, > + arch: arch.to_owned(), > + }); > + } > + > + // switch to the new group > + self.current_group =3D Some(group); > + } > + } > + } > +} > + > +struct DeadLinkChecker { > + visited_links: HashSet, > +} > + > +impl DeadLinkChecker { > + fn new() -> Self { > + Self { > + visited_links: HashSet::new(), > + } > + } > + > + fn check_text( > + &mut self, > + text: &str, > + args: &AnalysisArgs, > + findings: &mut Vec, > + symbol: Option<&str>, > + arch: &String, > + context: &str, > + ) { > + if !args.is_enabled(Check::DeadLink) { > + return; > + } > + > + let links =3D dead_links::find_links(text); > + > + if links.is_empty() { > + return; > + } > + > + for link in links { > + // avoid rechecking identical links > + if !self.visited_links.insert(link.clone()) { > + continue; > + } > + > + let status =3D check_link(&link); > + if status !=3D LinkStatus::Ok && status !=3D LinkStatus::P= robablyBlocked { > + findings.push(Finding { > + severity: Severity::Warning, > + check: Check::DeadLink, > + symbol: symbol.map(|s| s.to_string()), > + message: format!( > + "{} contains link {} with status {:?}", > + context, link, status > + ), > + arch: arch.to_owned(), > + }); > + } > + } > + } > +} > + > +#[derive(Clone)] > +pub struct Context { > + pub arch: String, > + pub definition_condition: Vec, > + pub visibility: Vec>, > + pub dependencies: Vec, > + pub in_choice: bool, > +} > + > +impl Context { > + fn with_arch(arch: String) -> Context { > + Context { > + arch, > + definition_condition: vec![], > + visibility: vec![], > + dependencies: vec![], > + in_choice: false, > + } > + } > + > + fn child(&self) -> Self { > + self.clone() > + } > + > + fn with_dep(mut self, dep: Expression) -> Self { > + self.dependencies.push(dep); > + self > + } > + > + fn with_visibility(mut self, cond: Option) -> Self { > + self.visibility.push(cond); > + self > + } > + > + fn with_definition(mut self, cond: Expression) -> Self { > + self.definition_condition.push(cond); > + self > + } > + > + fn in_choice(mut self) -> Self { > + self.in_choice =3D true; > + self > + } > +} > + > +fn recurse_entries( > + args: &AnalysisArgs, > + symtab: &mut SymbolTable, > + entries: Vec, > + ctx: Context, > + findings: &mut Vec, > +) { > + for entry in entries { > + process_entry(args, symtab, entry, ctx.clone(), findings); > + } > +} > + > +pub fn analyze( > + args: &AnalysisArgs, > + symtab: &mut SymbolTable, > + arch: String, > + entries: Vec, > +) -> Vec { > + let mut findings =3D Vec::new(); > + > + let ctx =3D Context::with_arch(arch); > + > + recurse_entries(args, symtab, entries, ctx, &mut findings); > + > + findings > +} > + > +fn handle_config( > + args: &AnalysisArgs, > + symtab: &mut SymbolTable, > + entry: Config, > + ctx: &Context, > + findings: &mut Vec, > +) { > + let config_symbol =3D entry.symbol; > + > + let mut child_ctx =3D ctx.child(); > + > + let mut config_type =3D None; > + let mut kconfig_dependencies =3D Vec::new(); > + let mut kconfig_selects: Vec