kconfig: warn of unhandled characters in Kconfig commands
v3 cover kconfig: warn of unhandled characters in Kconfig commands
This patchset changes the lexer file to emit a warning if any unhandled characters are found in the input. So far, Kconfig options like
+config FOO
bool
[...](note the wrong '+'!) were parsed without a warning. As simply adding a warning for '.' produces lots of warnings as occasionally '---help---' is used instead of 'help' (and thus '-' is recognized as an unhandled character), we need to handle '---help---' separately.
Changes to v1:
- add '---help---' in zconf.gperf instead of special casing it in zconf.l
Changes to v2:
- Do no constify char parameter to warn_ignored_character
- Shorten rule definitions for '.'
Andreas Ruprecht (2):
kconfig: warn of unhandled characters in Kconfig commands
kconfig: Regenerate shipped zconf.{hash,lex}.c files
scripts/kconfig/zconf.gperf | 1 + scripts/kconfig/zconf.hash.c_shipped | 58 ++++--- scripts/kconfig/zconf.l | 20 ++- scripts/kconfig/zconf.lex.c_shipped | 325 +++++++++++++++++------------------ 4 files changed, 204 insertions(+), 200 deletions(-)
Signature · 1 line
1.9.1
PATCH v3 1/2 kconfig: warn of unhandled characters in Kconfig commands
In Kconfig, definitions of options take the following form:
"<COMMAND> <PARAM> <PARAM> ...". COMMANDs and PARAMs are treated slightly different by the underlying parser.
While commit 2e0d737fc76f ("kconfig: don't silently ignore unhandled characters") introduced a warning for unsupported characters around PARAMs, it does not cover situations where a COMMAND has additional characters before it.
This change makes Kconfig emit a warning if superfluous characters are found before COMMANDs. As the 'help' statement sometimes is written as '---help---', the '-' character would now also be regarded as unhandled and generate a warning. To avoid that, '-' is added to the list of allowed characters, and the token '---help---' is included in the zconf.gperf file.
---
Changes to v1:
- add '---help---' in zconf.gperf instead of special casing it in zconf.l
Changes to v2:
- Do no constify char parameter to warn_ignored_character
- Shorten rule definitions for '.'
scripts/kconfig/zconf.gperf | 1 + scripts/kconfig/zconf.l | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-)
scripts/kconfig/zconf.gperf +1 -0
@@ -22,6 +22,7 @@ comment, T_COMMENT, TF_COMMAND config, T_CONFIG, TF_COMMAND menuconfig, T_MENUCONFIG, TF_COMMAND help, T_HELP, TF_COMMAND +"---help---", T_HELP, TF_COMMAND if, T_IF, TF_COMMAND|TF_PARAM endif, T_ENDIF, TF_COMMAND depends, T_DEPENDS, TF_COMMAND
scripts/kconfig/zconf.l +11 -9
@@ -66,9 +66,16 @@ static void alloc_string(const char *str, int size) memcpy(text, str, size); text[size] = 0; } + +static void warn_ignored_character(char chr) +{ + fprintf(stderr, + "%s:%d:warning: ignoring unsupported character '%c'\n", + zconf_curname(), zconf_lineno(), chr); +} %} -n [A-Za-z0-9_] +n [A-Za-z0-9_-] %% int str = 0;
@@ -106,7 +113,7 @@ n [A-Za-z0-9_] zconflval.string = text; return T_WORD; } - . + . warn_ignored_character(*yytext); \n { BEGIN(INITIAL); current_file->lineno++;
@@ -132,8 +139,7 @@ n [A-Za-z0-9_] BEGIN(STRING); } \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; - --- /* ignore */ - ({n}|[-/.])+ { + ({n}|[/.])+ { const struct kconf_id *id = kconf_id_lookup(yytext, yyleng); if (id && id->flags & TF_PARAM) { zconflval.id = id;
@@ -146,11 +152,7 @@ n [A-Za-z0-9_] #.* /* comment */ \\\n current_file->lineno++; [[:blank:]]+ - . { - fprintf(stderr, - "%s:%d:warning: ignoring unsupported character '%c'\n", - zconf_curname(), zconf_lineno(), *yytext); - } + . warn_ignored_character(*yytext); <<EOF>> { BEGIN(INITIAL); }
Signature · 1 line
1.9.1
One more nitpick (should be the last one):
Quoted 36 lines · Andreas Ruprecht
In
Kconfig, definitions of options take the following form:
"<COMMAND> <PARAM> <PARAM> ...". COMMANDs and PARAMs are treated slightly different by the underlying parser.While commit
2e0d737fc76f("kconfig: don't silently ignore unhandled characters") introduced a warning for unsupported characters around PARAMs, it does not cover situations where a COMMAND has additional characters before it.This change makes
Kconfigemit a warning if superfluous characters are found before COMMANDs. As the 'help' statement sometimes is written as '---help---', the '-' character would now also be regarded as unhandled and generate a warning. To avoid that, '-' is added to the list of allowed characters, and the token '---help---' is included in the zconf.gperf file.Reported-by Valentin Rothberg <[email protected]>Signed-off-by Andreas Ruprecht <[email protected]>---
Changes to v1:
- add '---help---' in zconf.gperf instead of special casing it in zconf.lChanges to v2:
- Do no constify char parameter towarn_ignored_character
- Shorten rule definitions for '.'scripts/kconfig/zconf.gperf | 1 + scripts/kconfig/zconf.l | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-)scripts/kconfig/zconf.gperf +0
-0
scripts/kconfig/zconf.gperf comment, T_COMMENT, TF_COMMAND · line 25
Quoted 4 lines
scripts/kconfig/zconf.gperf +1
-0@@ -22,6 +22,7 @@ comment, T_COMMENT, TF_COMMAND config, T_CONFIG, TF_COMMAND menuconfig, T_MENUCONFIG, TF_COMMAND help, T_HELP, TF_COMMAND +"---help---", T_HELP, TF_COMMAND
I think the quotes are redundant here, and tabs instead of spaces would be consistent with the other entries. Make sure everything lines up with 8-space tabstops.
Quoted 60 lines
scripts/kconfig/zconf.gperf +0
-0if, T_IF, TF_COMMAND|TF_PARAM endif, T_ENDIF, TF_COMMAND depends, T_DEPENDS, TF_COMMANDscripts/kconfig/zconf.l +11
-9@@ -66,9 +66,16 @@ static void alloc_string(const char *str, int size) memcpy(text, str, size); text[size] = 0; } + +static void warn_ignored_character(char chr) +{ + fprintf(stderr, + "%s:%d:warning: ignoring unsupported character '%c'\n", + zconf_curname(), zconf_lineno(), chr); +} %} -n [A-Za-z0-9_] +n [A-Za-z0-9_-] %% int str = 0;@@ -106,7 +113,7 @@ n [A-Za-z0-9_] zconflval.string = text; return T_WORD; } - . + . warn_ignored_character(*yytext); \n { BEGIN(INITIAL); current_file->lineno++;@@ -132,8 +139,7 @@ n [A-Za-z0-9_] BEGIN(STRING); } \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; - --- /* ignore */ - ({n}|[-/.])+ { + ({n}|[/.])+ { const struct kconf_id *id = kconf_id_lookup(yytext, yyleng); if (id && id->flags & TF_PARAM) { zconflval.id = id;@@ -146,11 +152,7 @@ n [A-Za-z0-9_] #.* /* comment */ \\\n current_file->lineno++; [[:blank:]]+ - . { - fprintf(stderr, - "%s:%d:warning: ignoring unsupported character '%c'\n", - zconf_curname(), zconf_lineno(), *yytext); - } + . warn_ignored_character(*yytext); <<EOF>> { BEGIN(INITIAL); }Signature · 1 line
1.9.1
Cheers,
Ulf
PATCH v3 2/2 kconfig: Regenerate shipped zconf.{hash,lex}.c files
In reply to Andreas RuprechtUpdate the shipped files generated by flex and gperf to support the explicit use of "---help---" and to emit warnings for unsupported characters on COMMAND tokens.
As I could not find out which flex/gperf version was used to generate the previous version, I used flex 2.5.35 and gperf 3.0.4 from Ubuntu 14.04 - this also leads to the big number of changed lines in this patch.
--- scripts/kconfig/zconf.hash.c_shipped | 58 ++++--- scripts/kconfig/zconf.lex.c_shipped | 325 +++++++++++++++++------------------ 2 files changed, 192 insertions(+), 191 deletions(-)
scripts/kconfig/zconf.hash.c_shipped +31 -27
@@ -50,7 +50,7 @@ kconf_id_hash (register const char *str, register unsigned int len) 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 0, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
@@ -96,6 +96,7 @@ struct kconf_id_strings_t char kconf_id_strings_str7[sizeof("default")]; char kconf_id_strings_str8[sizeof("tristate")]; char kconf_id_strings_str9[sizeof("endchoice")]; + char kconf_id_strings_str10[sizeof("---help---")]; char kconf_id_strings_str12[sizeof("def_tristate")]; char kconf_id_strings_str13[sizeof("def_bool")]; char kconf_id_strings_str14[sizeof("defconfig_list")];
@@ -132,6 +133,7 @@ static const struct kconf_id_strings_t kconf_id_strings_contents = "default", "tristate", "endchoice", + "---help---", "def_tristate", "def_bool", "defconfig_list",
@@ -172,7 +174,7 @@ kconf_id_lookup (register const char *str, register unsigned int len) { enum { - TOTAL_KEYWORDS = 33, + TOTAL_KEYWORDS = 34, MIN_WORD_LENGTH = 2, MAX_WORD_LENGTH = 14, MIN_HASH_VALUE = 2,
@@ -182,34 +184,36 @@ kconf_id_lookup (register const char *str, register unsigned int len) static const struct kconf_id wordlist[] = { {-1}, {-1}, -#line 25 "scripts/kconfig/zconf.gperf" +#line 26 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_IF, TF_COMMAND|TF_PARAM}, -#line 36 "scripts/kconfig/zconf.gperf" +#line 37 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3, T_TYPE, TF_COMMAND, S_INT}, {-1}, -#line 26 "scripts/kconfig/zconf.gperf" +#line 27 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5, T_ENDIF, TF_COMMAND}, {-1}, -#line 29 "scripts/kconfig/zconf.gperf" +#line 30 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_DEFAULT, TF_COMMAND, S_UNKNOWN}, -#line 31 "scripts/kconfig/zconf.gperf" +#line 32 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_TYPE, TF_COMMAND, S_TRISTATE}, #line 20 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9, T_ENDCHOICE, TF_COMMAND}, - {-1}, {-1}, -#line 32 "scripts/kconfig/zconf.gperf" +#line 25 "scripts/kconfig/zconf.gperf" + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10, T_HELP, TF_COMMAND}, + {-1}, +#line 33 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_TRISTATE}, -#line 35 "scripts/kconfig/zconf.gperf" +#line 36 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, -#line 45 "scripts/kconfig/zconf.gperf" +#line 46 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_OPT_DEFCONFIG_LIST,TF_OPTION}, {-1}, {-1}, -#line 43 "scripts/kconfig/zconf.gperf" +#line 44 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_ON, TF_PARAM}, -#line 28 "scripts/kconfig/zconf.gperf" +#line 29 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_OPTIONAL, TF_COMMAND}, {-1}, {-1}, -#line 42 "scripts/kconfig/zconf.gperf" +#line 43 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_OPTION, TF_COMMAND}, #line 17 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_ENDMENU, TF_COMMAND},
@@ -219,51 +223,51 @@ kconf_id_lookup (register const char *str, register unsigned int len) #line 23 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25, T_MENUCONFIG, TF_COMMAND}, {-1}, -#line 44 "scripts/kconfig/zconf.gperf" +#line 45 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_OPT_MODULES, TF_OPTION}, -#line 47 "scripts/kconfig/zconf.gperf" +#line 48 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_OPT_ALLNOCONFIG_Y,TF_OPTION}, #line 16 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29, T_MENU, TF_COMMAND}, {-1}, -#line 39 "scripts/kconfig/zconf.gperf" +#line 40 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_SELECT, TF_COMMAND}, #line 21 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_COMMENT, TF_COMMAND}, -#line 46 "scripts/kconfig/zconf.gperf" +#line 47 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_OPT_ENV, TF_OPTION}, {-1}, -#line 40 "scripts/kconfig/zconf.gperf" +#line 41 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35, T_RANGE, TF_COMMAND}, #line 19 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36, T_CHOICE, TF_COMMAND}, {-1}, {-1}, -#line 33 "scripts/kconfig/zconf.gperf" +#line 34 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39, T_TYPE, TF_COMMAND, S_BOOLEAN}, {-1}, #line 18 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41, T_SOURCE, TF_COMMAND}, -#line 41 "scripts/kconfig/zconf.gperf" +#line 42 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42, T_VISIBLE, TF_COMMAND}, -#line 37 "scripts/kconfig/zconf.gperf" +#line 38 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43, T_TYPE, TF_COMMAND, S_HEX}, {-1}, {-1}, #line 22 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46, T_CONFIG, TF_COMMAND}, -#line 34 "scripts/kconfig/zconf.gperf" +#line 35 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47, T_TYPE, TF_COMMAND, S_BOOLEAN}, {-1}, {-1}, {-1}, -#line 38 "scripts/kconfig/zconf.gperf" +#line 39 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51, T_TYPE, TF_COMMAND, S_STRING}, {-1}, {-1}, #line 24 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54, T_HELP, TF_COMMAND}, {-1}, -#line 30 "scripts/kconfig/zconf.gperf" +#line 31 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str56, T_PROMPT, TF_COMMAND}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 27 "scripts/kconfig/zconf.gperf" +#line 28 "scripts/kconfig/zconf.gperf" {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str72, T_DEPENDS, TF_COMMAND} };
@@ -285,5 +289,5 @@ kconf_id_lookup (register const char *str, register unsigned int len) } return 0; } -#line 48 "scripts/kconfig/zconf.gperf" +#line 49 "scripts/kconfig/zconf.gperf"
scripts/kconfig/zconf.lex.c_shipped +161 -164
725 lines not on this page · raw message
Signature · 1 line
1.9.1
Quoted 24 lines · Andreas Ruprecht
This patchset changes the lexer file to emit a warning if any unhandled characters are found in the input. So far,
Kconfigoptions like+config FOO
bool [...](note the wrong '+'!) were parsed without a warning. As simply adding a warning for '.' produces lots of warnings as occasionally '---help---' is used instead of 'help' (and thus '-' is recognized as an unhandled character), we need to handle '---help---' separately.
Changes to v1:
- add '---help---' in zconf.gperf instead of special casing it in zconf.lChanges to v2:
- Do no constify char parameter towarn_ignored_character
- Shorten rule definitions for '.'Andreas Ruprecht (2):
kconfig: warn of unhandled characters inKconfigcommands
kconfig: Regenerate shipped zconf.{hash,lex}.c files
Quoted 9 lines
scripts/kconfig/zconf.gperf | 1 + scripts/kconfig/zconf.hash.c_shipped | 58 ++++--- scripts/kconfig/zconf.l | 20 ++- scripts/kconfig/zconf.lex.c_shipped | 325 +++++++++++++++++------------------ 4 files changed, 204 insertions(+), 200 deletions(-)Signature · 1 line
1.9.1
Looks good to me.
I ran the Kconfiglib test suite on it too. Since it simply compares the output of Kconfiglib and the C implementation, it doubles as a good regression test for the C implementation.
Cheers,
Ulf