From nobody Mon Jun 8 05:26:07 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 EE2913AFD0B for ; Sat, 6 Jun 2026 14:00:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780754415; cv=none; b=clOdz00CAoCIvojuUHyhSbUESEbJVPOnwLb70aYtXcennQe5iD0OQoN2f6JMTIoLeL5ucGD3LArXwJLY2pipO2e5cQkDFl32cjEc27qWEVkVsGwnEKrml0zMDn+lnTibyAZOjM12v+Vg6BfYAhBNRLOLZj9naeXYg6Uo6GQqHtc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780754415; c=relaxed/simple; bh=gKNCowxDuzxoxO9SgeSCOyuz85Ulsyzw2t/1XkzpS0k=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=W1T9KHwe/nYE7b17x2/GUwZGybIPkzWGdkGsw/2VveixGTDJdlZsaAlwuyr6nrddYOoSRaZKr1T3i2hl3j4rQdG4r9nXmnfjL2y8tLzV6fZsF3Uo1NgPi9FY+624ba3sPPq6/4X8uWQtfcXG26O4wJSxOb40a1LSu7YHo40WjT8= 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=BPSJFrqF; arc=none smtp.client-ip=209.85.128.49 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="BPSJFrqF" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-490aebf33e9so15626935e9.3 for ; Sat, 06 Jun 2026 07:00:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780754412; x=1781359212; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:sender:from:to:cc:subject:date:message-id:reply-to; bh=Ji0FD+Mn+yCRAHOT89THI9KOaA6S9+m9/n6SqbkdKPQ=; b=BPSJFrqFge5VI6YfjHSPW0z6tU0Jl4bt1jC54Y1P00Er9eY0K14zHxQ7brjj8Vd2f/ E3E0WFg8xgwR5je+CKOrDtyfjbGY2+PSYNvaQzTEc9p7vtKHPmj2YRsl5FXnxDARqbM7 qHnvMaYRz7ReDPLQjAu/wt/4NEt8SAds0eWwM9m/ORzpXtvo6+OMSt+pUHpq+svlf6Eh AtJCd/drqX1zFqFFnkPIHcLBV18myJKppsObR+zz5/gM5rRYaqlTWXs3GaI46FSpIzi9 OcT4rWW6SZ976443Gv3dHCl9auVgxQS3u9kyokAnFQ3zeyS1adMklZYTS37PqFZYEoRz qOKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780754412; x=1781359212; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:sender:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Ji0FD+Mn+yCRAHOT89THI9KOaA6S9+m9/n6SqbkdKPQ=; b=HuhCWYsV9JCj/YQjj7d+tkdU7t8Ip/QtgiSRBeX1py9ZrupI/ABTeViW0/tk0H2F9L TyT1X2Xv2aX7wtJZYCrfYrEX/wfrAciCYYUEcoCS3WY7Ih+cIZiF/S0RKjgrUXoYNnvK 0B3UKZZ704n0/VeeFkOB6BCISSjQab2k5/K7QVoK4EPFxuRY3LiMQDzq0WiQgi5X+bxX jcac4s3KmwowG8kolyukHtln1z3d50DTZberCBT3YcHW+vrutBw9n5hylTVvBfoST/eZ 0Y3wsPP7odywD+KQEIGNaTXzx2RpL/CDTBiKqDgubeoRKUX5ZjUoHlXk2f+bdHq2Lhdr tkDQ== X-Forwarded-Encrypted: i=1; AFNElJ9J/15qktbCvHB7xXsYJZa+DxIhuIweapJw0O1ahXHZwJdzeIQ6ACtXJ3v5rJVm37fMd1BE+oLBY65k6KE=@vger.kernel.org X-Gm-Message-State: AOJu0YxvQ5t63YwNToB0xxTavapzkgrEY5TVY+AnGt8eWJlnzK0oiWNt qYq9cgJ/LgkaZQd9qT5sLDoR6GgGqGRzxOIvV9OUUafcnIJgZBF/e/ie X-Gm-Gg: Acq92OHZ3qkXFjHGD7gnTpRC69cYcCWLehz0tPDMIWJKMYKuaUhC9Cnytab7cPSPYTA P2KSzMpTXWoIbfyMCvLPsvo3/xP7h0Bl7IUHNMUEIHYaehJgjhg5wX/vq3dIw1U3hAYipl3p5Lb dTAoYplK/LZ0ck7yTzU+gweaZAMrXJAjsDtRu2AA1izwCDkX30IoI8HY1hgNbD6C3bbyNRECt1z uYUpzu024dNA1onOIs9JoHnHAEcvPuwmaX9W2bEXq/dqrlzq2XYFP16PVkwDMWpdN7p7FElY2k3 gO3NH4paQ8ppTfwhjrmem2rd/f5QyLO6JCKwuqMhhCCsog8rGFwwvxaNSOTIsIk03VLr4MwycaA MbEOraHRJpiYwYvbEy25TdZxnjcKA5HTIe1AUh/TV2wfOGgjhGCIiBlgFAVSV7R1MygnZWnCVXT yvBFnWmZc98saBKZt5WelFDmxjPjoGhQl6WL28AJmRY6cZh5yAdse1H94TYvUmSc/HByasNdn5J PjHs37NJEmvYpIzG8GOlDYC/w== X-Received: by 2002:a05:600c:1d12:b0:490:afc5:f95d with SMTP id 5b1f17b1804b1-490c2602bdfmr136286235e9.29.1780754412080; Sat, 06 Jun 2026 07:00:12 -0700 (PDT) Received: from nixos-office (195-23-151-163.net.novis.pt. [195.23.151.163]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-490bc3b5b82sm255940725e9.1.2026.06.06.07.00.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Jun 2026 07:00:11 -0700 (PDT) Sender: Julian Braha From: Julian Braha To: nathan@kernel.org, nsc@kernel.org Cc: rdunlap@infradead.org, masahiroy@kernel.org, grahamr@qti.qualcomm.com, nico@fluxnic.net, linux-kernel@vger.kernel.org, linux-kbuild@vger.kernel.org, Julian Braha Subject: [PATCH] kconfig: warn on dead default Date: Sat, 6 Jun 2026 15:00:08 +0100 Message-ID: <20260606140008.271929-1-julianbraha@gmail.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The dead default check was originally introduced with kconfirm: https://lore.kernel.org/all/6ec4df6d-1445-48ca-8f54-1d1a83c4716d@gmail.com/ While I'm still working on that tool, it's not yet ready for inclusion into the tree. I am currently waiting for common distro packagers to package the parsing library before submitting the next RFC iteration. However, the dead default check is more impactful than the other checks: all 4 dead defaults that were detected should not have been dead and could cause misconfiguration bugs. But fortunately, these were just for kunit tests. The 3 patches to fix them have all since been merged: commit aef656a0e6c0 ("powerpc: fix dead default for GUEST_STATE_BUFFER_TEST= ") commit 30cc5e2ad826 ("s390/Kconfig: Cleanup defaults for selftests") commit df75430515c3 ("drm: fix dead default for DRM_TTM_KUNIT_TEST") We can actually check for dead defaults while evaluating Kconfig, which should be even more effective at preventing future instances than keeping it in a static checker. Note that this patch will only trigger a warning when the default values are different, in other words, pure duplicate defaults won't cause a warning, as they are simply redundant. Signed-off-by: Julian Braha --- scripts/kconfig/menu.c | 22 +++++++++- .../kconfig/tests/warn_dead_default/Kconfig | 40 +++++++++++++++++++ .../tests/warn_dead_default/__init__.py | 8 ++++ .../tests/warn_dead_default/expected_stderr | 4 ++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 scripts/kconfig/tests/warn_dead_default/Kconfig create mode 100644 scripts/kconfig/tests/warn_dead_default/__init__.py create mode 100644 scripts/kconfig/tests/warn_dead_default/expected_stderr diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index b2d8d4e11e07..8c280292f9cd 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -242,13 +242,33 @@ static int menu_validate_number(struct symbol *sym, s= truct symbol *sym2) =20 static void sym_check_prop(struct symbol *sym) { - struct property *prop; + struct property *prev, *prop; struct symbol *sym2; char *use; =20 for (prop =3D sym->prop; prop; prop =3D prop->next) { switch (prop->type) { case P_DEFAULT: + for_all_defaults(sym, prev) { + if (prev =3D=3D prop) + break; + if (expr_is_yes(prev->visible.expr)) { + if (!expr_eq(prev->expr, prop->expr)) + prop_warn(prop, + "default for '%s' is unreachable: earlier default at %s:%d is uncon= ditional", + sym->name ? sym->name : "", + prev->filename, prev->lineno); + break; + } + if (expr_eq(prev->visible.expr, prop->visible.expr)) { + if (!expr_eq(prev->expr, prop->expr)) + prop_warn(prop, + "default for '%s' has the same condition as the earlier default at = %s:%d", + sym->name ? sym->name : "", + prev->filename, prev->lineno); + break; + } + } if ((sym->type =3D=3D S_STRING || sym->type =3D=3D S_INT || sym->type = =3D=3D S_HEX) && prop->expr->type !=3D E_SYMBOL) prop_warn(prop, diff --git a/scripts/kconfig/tests/warn_dead_default/Kconfig b/scripts/kcon= fig/tests/warn_dead_default/Kconfig new file mode 100644 index 000000000000..adf421d73dbd --- /dev/null +++ b/scripts/kconfig/tests/warn_dead_default/Kconfig @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: GPL-2.0 + +config A + bool + +config B + bool + +config UNCONDITIONAL + int + default 1 + default 2 + +config CONDITIONAL + int + default 1 if A + default 2 if A + default 3 if B + +config CONDITIONAL_COMMUTATIVE + int + default 1 if A && B + default 2 if B && A + +config CONTROL + int + default 1 if A + default 2 if B + default 3 + +choice + prompt "test choice" + default C + default D + + config C + bool "C" + config D + bool "D" +endchoice diff --git a/scripts/kconfig/tests/warn_dead_default/__init__.py b/scripts/= kconfig/tests/warn_dead_default/__init__.py new file mode 100644 index 000000000000..911b30ce19fe --- /dev/null +++ b/scripts/kconfig/tests/warn_dead_default/__init__.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 +""" +Test detection of dead defaults (different defaults that can never be acti= ve). +""" + +def test(conf): + assert conf.olddefconfig() =3D=3D 0 + assert conf.stderr_contains('expected_stderr') diff --git a/scripts/kconfig/tests/warn_dead_default/expected_stderr b/scri= pts/kconfig/tests/warn_dead_default/expected_stderr new file mode 100644 index 000000000000..baa20bf33910 --- /dev/null +++ b/scripts/kconfig/tests/warn_dead_default/expected_stderr @@ -0,0 +1,4 @@ +Kconfig:12:warning: default for 'UNCONDITIONAL' is unreachable: earlier de= fault at Kconfig:11 is unconditional +Kconfig:17:warning: default for 'CONDITIONAL' has the same condition as th= e earlier default at Kconfig:16 +Kconfig:23:warning: default for 'CONDITIONAL_COMMUTATIVE' has the same con= dition as the earlier default at Kconfig:22 +Kconfig:34:warning: default for '' is unreachable: earlier default= at Kconfig:33 is unconditional --=20 2.53.0