kconfig: Add "def_string", "def_int" and "def_hex"

Kconfig has offered "def_bool" and "def_tristate" as a shorthand for a
type definition plus a default since before the git era, but has never
offered the equivalent for the other three types. Conor Dooley ran into
this gap[1] when fixing a symbol that had been given the wrong type:

  Unfortunately, there is no such thing as "def_string", but in this
  case we can use "default" to propagate the value of ...

Nothing in the grammar requires the restriction. The rule that consumes
a default is already type agnostic. Add the three missing types. No
changes are needed to existing diagnostics. E.g. declaring a symbol
"bool" and then assigning it with "def_string" still reports

  warning: ignoring type redefinition of 'CONFLICT' from 'bool' to 'string'

Added tests for the types.

Build tested ARCH=x86_64 with GCC 16.2.0. Tests pass with "make testconfig".

Link: https://lore.kernel.org/all/20230111104848.2088516-1-conor.dooley@microchip.com/ [1]
Assisted-by: LLM
Signed-off-by: Kees Cook <kees@kernel.org>
Tested-by: Julian Braha <julianbraha@gmail.com>
Reviewed-by: Julian Braha <julianbraha@gmail.com>
Link: https://patch.msgid.link/20260919005929.4077729-1-kees@kernel.org
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
This commit is contained in:
Kees Cook 2026-09-18 17:59:25 -07:00 committed by Nathan Chancellor
parent 9f01cd3a32
commit 651fb291c4
No known key found for this signature in database
GPG Key ID: 1D6B269171C01A96
10 changed files with 90 additions and 2 deletions

View File

@ -113,11 +113,22 @@ applicable everywhere (see syntax).
- type definition + default value::
"def_bool"/"def_tristate" <expr> ["if" <expr>]
"def_bool" <expr> ["if" <expr>]
"def_tristate" <expr> ["if" <expr>]
"def_string" <expr> ["if" <expr>]
"def_int" <expr> ["if" <expr>]
"def_hex" <expr> ["if" <expr>]
This is a shorthand notation for a type definition plus a value.
Optionally dependencies for this default value can be added with "if".
The shorthand supplies the type once, and is otherwise an ordinary
default: it is the first entry of the list described above, so any
further "default" entries still apply when its "if" is not met. Since
that leaves the type definition inside one arm of a list, spelling the
type out on its own line reads better for a symbol with several
defaults.
- dependencies: "depends on" <expr> ["if" <expr>]
This defines a dependency for this menu entry. If multiple

View File

@ -90,7 +90,7 @@ foreach my $file (@files) {
next;
}
if (/^\s*(default|def_bool|def_tristate|select|depends\s+on|imply|visible\s+if|range|if|bool|tristate|int|hex|string|prompt)\s+(.+)\s*$/) {
if (/^\s*(default|def_bool|def_tristate|def_string|def_int|def_hex|select|depends\s+on|imply|visible\s+if|range|if|bool|tristate|int|hex|string|prompt)\s+(.+)\s*$/) {
my $s = $2;
$s =~ s/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'//g;
$s =~ s/#.*//;

View File

@ -105,6 +105,9 @@ n [A-Za-z0-9_-]
"comment" return T_COMMENT;
"config" return T_CONFIG;
"def_bool" return T_DEF_BOOL;
"def_hex" return T_DEF_HEX;
"def_int" return T_DEF_INT;
"def_string" return T_DEF_STRING;
"def_tristate" return T_DEF_TRISTATE;
"default" return T_DEFAULT;
"depends" return T_DEPENDS;

View File

@ -53,6 +53,9 @@ struct menu *current_menu, *current_entry, *current_choice;
%token T_CONFIG
%token T_DEFAULT
%token T_DEF_BOOL
%token T_DEF_HEX
%token T_DEF_INT
%token T_DEF_STRING
%token T_DEF_TRISTATE
%token T_DEPENDS
%token T_ENDCHOICE
@ -309,6 +312,9 @@ type:
default:
T_DEFAULT { $$ = S_UNKNOWN; }
| T_DEF_BOOL { $$ = S_BOOLEAN; }
| T_DEF_HEX { $$ = S_HEX; }
| T_DEF_INT { $$ = S_INT; }
| T_DEF_STRING { $$ = S_STRING; }
| T_DEF_TRISTATE { $$ = S_TRISTATE; }
/* if entry */

View File

@ -0,0 +1,28 @@
# SPDX-License-Identifier: GPL-2.0
# The def_<type> shorthands: a type definition plus a default value.
config MODULES
bool "Enable loadable module support"
modules
default y
config GUARD
bool "Guard symbol"
config DEF_BOOL
def_bool GUARD
config DEF_TRISTATE
def_tristate m if GUARD
config DEF_STRING
def_string "guarded" if GUARD
default "fallback"
config DEF_INT
def_int 64 if GUARD
default 32
config DEF_HEX
def_hex 0xdead if GUARD
default 0x0

View File

@ -0,0 +1,18 @@
# SPDX-License-Identifier: GPL-2.0
"""
Set a symbol's type and its default value in one line.
"def_bool", "def_tristate", "def_string", "def_int" and "def_hex" are
shorthand for a type definition plus a "default" property. Check that
each one sets the type, and that an "if" on the shorthand does not
disturb the usual default cascade: the shorthand is only the first arm
of the list, so a later "default" still applies when its condition is
not met.
"""
def test(conf):
assert conf.olddefconfig(dot_config='guard_y.config') == 0
assert conf.config_matches('expected_guard_y')
assert conf.olddefconfig(dot_config='guard_n.config') == 0
assert conf.config_matches('expected_guard_n')

View File

@ -0,0 +1,9 @@
#
# Automatically generated file; DO NOT EDIT.
# Main menu
#
CONFIG_MODULES=y
# CONFIG_GUARD is not set
CONFIG_DEF_STRING="fallback"
CONFIG_DEF_INT=32
CONFIG_DEF_HEX=0x0

View File

@ -0,0 +1,11 @@
#
# Automatically generated file; DO NOT EDIT.
# Main menu
#
CONFIG_MODULES=y
CONFIG_GUARD=y
CONFIG_DEF_BOOL=y
CONFIG_DEF_TRISTATE=m
CONFIG_DEF_STRING="guarded"
CONFIG_DEF_INT=64
CONFIG_DEF_HEX=0xdead

View File

@ -0,0 +1 @@
# CONFIG_GUARD is not set

View File

@ -0,0 +1 @@
CONFIG_GUARD=y