2015-07-07 10:31:42

by Andreas Ruprecht

[permalink] [raw]
Subject: [PATCH v2 0/2] 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.


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 | 18 ++++--
scripts/kconfig/zconf.lex.c_shipped | 120 +++++++++++++++++++----------------
4 files changed, 110 insertions(+), 87 deletions(-)

--
1.9.1


2015-07-07 10:32:04

by Andreas Ruprecht

[permalink] [raw]
Subject: [PATCH v2 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 around it.

This change makes Kconfig emit a warning if superfluous characters
are found around 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]>
---
scripts/kconfig/zconf.gperf | 1 +
scripts/kconfig/zconf.l | 18 ++++++++++++------
2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf
index b6ac02d..7aceb7b 100644
--- a/scripts/kconfig/zconf.gperf
+++ b/scripts/kconfig/zconf.gperf
@@ -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
diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l
index 200a3fe..3078244 100644
--- a/scripts/kconfig/zconf.l
+++ b/scripts/kconfig/zconf.l
@@ -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(const 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,9 @@ n [A-Za-z0-9_]
zconflval.string = text;
return T_WORD;
}
- .
+ . {
+ warn_ignored_character(*yytext);
+ }
\n {
BEGIN(INITIAL);
current_file->lineno++;
@@ -132,7 +141,6 @@ n [A-Za-z0-9_]
BEGIN(STRING);
}
\n BEGIN(INITIAL); current_file->lineno++; return T_EOL;
- --- /* ignore */
({n}|[-/.])+ {
const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
if (id && id->flags & TF_PARAM) {
@@ -147,9 +155,7 @@ n [A-Za-z0-9_]
\\\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);
--
1.9.1

2015-07-07 10:31:55

by Andreas Ruprecht

[permalink] [raw]
Subject: [PATCH v2 2/2] kconfig: Regenerate shipped zconf.{hash,lex}.c files

Update 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.

Signed-off-by: Andreas Ruprecht <[email protected]>
---
scripts/kconfig/zconf.hash.c_shipped | 58 +++++++++--------
scripts/kconfig/zconf.lex.c_shipped | 120 +++++++++++++++++++----------------
2 files changed, 97 insertions(+), 81 deletions(-)

diff --git a/scripts/kconfig/zconf.hash.c_shipped b/scripts/kconfig/zconf.hash.c_shipped
index c77a8ef..0af8a04 100644
--- a/scripts/kconfig/zconf.hash.c_shipped
+++ b/scripts/kconfig/zconf.hash.c_shipped
@@ -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"

diff --git a/scripts/kconfig/zconf.lex.c_shipped b/scripts/kconfig/zconf.lex.c_shipped
index dd4e86c..d688aa0 100644
--- a/scripts/kconfig/zconf.lex.c_shipped
+++ b/scripts/kconfig/zconf.lex.c_shipped
@@ -72,7 +72,6 @@ typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */

/* Limits of integral types. */
#ifndef INT8_MIN
@@ -103,6 +102,8 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif

+#endif /* ! C99 */
+
#endif /* ! FLEXINT_H */

#ifdef __cplusplus
@@ -159,7 +160,15 @@ typedef unsigned int flex_uint32_t;

/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
#endif

/* The state buf must be large enough to hold one state per character in the main buffer.
@@ -384,12 +393,12 @@ static yyconst flex_int16_t yy_nxt[][19] =

{
11, 16, 16, 17, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 18, 16, 16, 16, 16, 16
+ 16, 18, 16, 18, 16, 16, 16, 16, 16
},

{
11, 16, 16, 17, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 18, 16, 16, 16, 16, 16
+ 16, 18, 16, 18, 16, 16, 16, 16, 16

},

@@ -462,7 +471,7 @@ static yyconst flex_int16_t yy_nxt[][19] =

{
11, -18, -18, -18, -18, -18, -18, -18, -18, -18,
- -18, -18, -18, 47, -18, -18, -18, -18, -18
+ -18, 47, -18, 47, -18, -18, -18, -18, -18
},

{
@@ -556,7 +565,7 @@ static yyconst flex_int16_t yy_nxt[][19] =

{
11, -36, -36, -36, -36, -36, -36, -36, -36, -36,
- -36, 61, 61, 61, -36, -36, -36, -36, -36
+ -36, 60, 61, 61, -36, -36, -36, -36, -36
},

{
@@ -613,7 +622,7 @@ static yyconst flex_int16_t yy_nxt[][19] =

{
11, -47, -47, -47, -47, -47, -47, -47, -47, -47,
- -47, -47, -47, 47, -47, -47, -47, -47, -47
+ -47, 47, -47, 47, -47, -47, -47, -47, -47
},

{
@@ -681,12 +690,12 @@ static yyconst flex_int16_t yy_nxt[][19] =

{
11, -60, -60, -60, -60, -60, -60, -60, -60, -60,
- -60, 66, 61, 61, -60, -60, -60, -60, -60
+ -60, 60, 61, 61, -60, -60, -60, -60, -60
},

{
11, -61, -61, -61, -61, -61, -61, -61, -61, -61,
- -61, 61, 61, 61, -61, -61, -61, -61, -61
+ -61, 60, 61, 61, -61, -61, -61, -61, -61
},

{
@@ -710,11 +719,6 @@ static yyconst flex_int16_t yy_nxt[][19] =
-65, -65, -65, -65, -65, -65, -65, -65, -65
},

- {
- 11, -66, -66, -66, -66, -66, -66, -66, -66, -66,
- -66, 61, 61, 61, -66, -66, -66, -66, -66
- },
-
} ;

static yy_state_type yy_get_previous_state (void );
@@ -732,8 +736,8 @@ static void yy_fatal_error (yyconst char msg[] );
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;

-#define YY_NUM_RULES 38
-#define YY_END_OF_BUFFER 39
+#define YY_NUM_RULES 37
+#define YY_END_OF_BUFFER 38
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -741,15 +745,15 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[67] =
+static yyconst flex_int16_t yy_accept[66] =
{ 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 39, 5, 4, 2, 3, 7, 8, 6, 37, 34,
- 36, 29, 33, 32, 31, 27, 26, 21, 13, 20,
- 24, 27, 11, 12, 23, 23, 18, 14, 19, 27,
- 27, 4, 2, 3, 3, 1, 6, 37, 34, 36,
- 35, 29, 28, 31, 30, 26, 15, 24, 9, 23,
- 23, 16, 17, 25, 10, 22
+ 38, 5, 4, 2, 3, 7, 8, 6, 36, 33,
+ 35, 28, 32, 31, 30, 26, 25, 21, 13, 20,
+ 23, 26, 11, 12, 22, 22, 18, 14, 19, 26,
+ 26, 4, 2, 3, 3, 1, 6, 36, 33, 35,
+ 34, 28, 27, 30, 29, 25, 15, 23, 9, 22,
+ 22, 16, 17, 24, 10
} ;

static yyconst flex_int32_t yy_ec[256] =
@@ -861,6 +865,13 @@ static void alloc_string(const char *str, int size)
text[size] = 0;
}

+static void warn_ignored_character(const char chr)
+{
+ fprintf(stderr,
+ "%s:%d:warning: ignoring unsupported character '%c'\n",
+ zconf_curname(), zconf_lineno(), chr);
+}
+
#define INITIAL 0
#define COMMAND 1
#define HELP 2
@@ -944,7 +955,12 @@ static int input (void );

/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
#endif

/* Copy whatever the last rule matched to the standard output. */
@@ -952,7 +968,7 @@ static int input (void );
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
*/
-#define ECHO fwrite( zconftext, zconfleng, 1, zconfout )
+#define ECHO do { if (fwrite( zconftext, zconfleng, 1, zconfout )) {} } while (0)
#endif

/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
@@ -1132,7 +1148,9 @@ YY_RULE_SETUP
YY_BREAK
case 7:
YY_RULE_SETUP
-
+{
+ warn_ignored_character(*zconftext);
+ }
YY_BREAK
case 8:
/* rule 8 can match eol */
@@ -1203,10 +1221,6 @@ BEGIN(INITIAL); current_file->lineno++; return T_EOL;
YY_BREAK
case 22:
YY_RULE_SETUP
-/* ignore */
- YY_BREAK
-case 23:
-YY_RULE_SETUP
{
const struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
if (id && id->flags & TF_PARAM) {
@@ -1218,25 +1232,23 @@ YY_RULE_SETUP
return T_WORD;
}
YY_BREAK
-case 24:
+case 23:
YY_RULE_SETUP
/* comment */
YY_BREAK
-case 25:
-/* rule 25 can match eol */
+case 24:
+/* rule 24 can match eol */
YY_RULE_SETUP
current_file->lineno++;
YY_BREAK
-case 26:
+case 25:
YY_RULE_SETUP

YY_BREAK
-case 27:
+case 26:
YY_RULE_SETUP
{
- fprintf(stderr,
- "%s:%d:warning: ignoring unsupported character '%c'\n",
- zconf_curname(), zconf_lineno(), *zconftext);
+ warn_ignored_character(*zconftext);
}
YY_BREAK
case YY_STATE_EOF(PARAM):
@@ -1245,8 +1257,8 @@ case YY_STATE_EOF(PARAM):
}
YY_BREAK

-case 28:
-/* rule 28 can match eol */
+case 27:
+/* rule 27 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up zconftext again */
@@ -1257,14 +1269,14 @@ YY_RULE_SETUP
return T_WORD_QUOTE;
}
YY_BREAK
-case 29:
+case 28:
YY_RULE_SETUP
{
append_string(zconftext, zconfleng);
}
YY_BREAK
-case 30:
-/* rule 30 can match eol */
+case 29:
+/* rule 29 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up zconftext again */
@@ -1275,13 +1287,13 @@ YY_RULE_SETUP
return T_WORD_QUOTE;
}
YY_BREAK
-case 31:
+case 30:
YY_RULE_SETUP
{
append_string(zconftext + 1, zconfleng - 1);
}
YY_BREAK
-case 32:
+case 31:
YY_RULE_SETUP
{
if (str == zconftext[0]) {
@@ -1292,8 +1304,8 @@ YY_RULE_SETUP
append_string(zconftext, 1);
}
YY_BREAK
-case 33:
-/* rule 33 can match eol */
+case 32:
+/* rule 32 can match eol */
YY_RULE_SETUP
{
printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
@@ -1308,7 +1320,7 @@ case YY_STATE_EOF(STRING):
}
YY_BREAK

-case 34:
+case 33:
YY_RULE_SETUP
{
ts = 0;
@@ -1333,8 +1345,8 @@ YY_RULE_SETUP
}
}
YY_BREAK
-case 35:
-/* rule 35 can match eol */
+case 34:
+/* rule 34 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up zconftext again */
@@ -1345,15 +1357,15 @@ YY_RULE_SETUP
return T_HELPTEXT;
}
YY_BREAK
-case 36:
-/* rule 36 can match eol */
+case 35:
+/* rule 35 can match eol */
YY_RULE_SETUP
{
current_file->lineno++;
append_string("\n", 1);
}
YY_BREAK
-case 37:
+case 36:
YY_RULE_SETUP
{
while (zconfleng) {
@@ -1384,7 +1396,7 @@ case YY_STATE_EOF(COMMAND):
yyterminate();
}
YY_BREAK
-case 38:
+case 37:
YY_RULE_SETUP
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
@@ -2114,8 +2126,8 @@ YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr )

/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
* scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
*
* @return the newly allocated buffer state object.
*/
--
1.9.1

2015-07-08 20:14:40

by Ulf Magnusson

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] kconfig: warn of unhandled characters in Kconfig commands

On Tue, Jul 7, 2015 at 12:31 PM, Andreas Ruprecht
<[email protected]> wrote:
> 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 around it.
>
> This change makes Kconfig emit a warning if superfluous characters
> are found around 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]>
> ---
> scripts/kconfig/zconf.gperf | 1 +
> scripts/kconfig/zconf.l | 18 ++++++++++++------
> 2 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf
> index b6ac02d..7aceb7b 100644
> --- a/scripts/kconfig/zconf.gperf
> +++ b/scripts/kconfig/zconf.gperf
> @@ -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
> diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l
> index 200a3fe..3078244 100644
> --- a/scripts/kconfig/zconf.l
> +++ b/scripts/kconfig/zconf.l
> @@ -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(const char chr)
> +{
> + fprintf(stderr,
> + "%s:%d:warning: ignoring unsupported character '%c'\n",
> + zconf_curname(), zconf_lineno(), chr);
> +}

Was the 'const' on the non-pointer 'chr' parameter intended here?

> %}
>
> -n [A-Za-z0-9_]
> +n [A-Za-z0-9_-]
>
> %%
> int str = 0;
> @@ -106,7 +113,9 @@ n [A-Za-z0-9_]
> zconflval.string = text;
> return T_WORD;
> }
> - .
> + . {
> + warn_ignored_character(*yytext);
> + }
> \n {
> BEGIN(INITIAL);
> current_file->lineno++;
> @@ -132,7 +141,6 @@ n [A-Za-z0-9_]
> BEGIN(STRING);
> }
> \n BEGIN(INITIAL); current_file->lineno++; return T_EOL;
> - --- /* ignore */
> ({n}|[-/.])+ {

Removing '-' from [-/.] too works fine on my system (Flex 2.5.39, Bison 3.0.2,
as shipped with Ubuntu 15.04). What problems did you run into?

> const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
> if (id && id->flags & TF_PARAM) {
> @@ -147,9 +155,7 @@ n [A-Za-z0-9_]
> \\\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);
> --
> 1.9.1
>

Cheers,
Ulf

2015-07-09 17:52:59

by Ulf Magnusson

[permalink] [raw]
Subject: Re: [PATCH v2 1/2] kconfig: warn of unhandled characters in Kconfig commands

One more nitpick:

On Tue, Jul 07, 2015 at 12:31:16PM +0200, Andreas Ruprecht wrote:
> 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 around it.
>
> This change makes Kconfig emit a warning if superfluous characters
> are found around 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]>
> ---
> scripts/kconfig/zconf.gperf | 1 +
> scripts/kconfig/zconf.l | 18 ++++++++++++------
> 2 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf
> index b6ac02d..7aceb7b 100644
> --- a/scripts/kconfig/zconf.gperf
> +++ b/scripts/kconfig/zconf.gperf
> @@ -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
> diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l
> index 200a3fe..3078244 100644
> --- a/scripts/kconfig/zconf.l
> +++ b/scripts/kconfig/zconf.l
> @@ -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(const 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,9 @@ n [A-Za-z0-9_]
> zconflval.string = text;
> return T_WORD;
> }
> - .
> + . {
> + warn_ignored_character(*yytext);
> + }

I'd shorten this to just

. warn_ignored_character(*yytext);

Not that the rest of zonf.l is very consistent.

> \n {
> BEGIN(INITIAL);
> current_file->lineno++;
> @@ -132,7 +141,6 @@ n [A-Za-z0-9_]
> BEGIN(STRING);
> }
> \n BEGIN(INITIAL); current_file->lineno++; return T_EOL;
> - --- /* ignore */
> ({n}|[-/.])+ {
> const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
> if (id && id->flags & TF_PARAM) {
> @@ -147,9 +155,7 @@ n [A-Za-z0-9_]
> \\\n current_file->lineno++;
> [[:blank:]]+
> . {
> - fprintf(stderr,
> - "%s:%d:warning: ignoring unsupported character '%c'\n",
> - zconf_curname(), zconf_lineno(), *yytext);
> + warn_ignored_character(*yytext);
> }

Ditto.

> <<EOF>> {
> BEGIN(INITIAL);
> --
> 1.9.1
>

Cheers,
Ulf