@@ -709,13 +709,16 @@ static int expand(struct token **list, struct symbol *sym)
struct ident *expanding = token->ident;
struct token **tail;
int nargs = sym->arglist ? sym->arglist->count.normal : 0;
- struct arg args[nargs];
+ struct arg *args = NULL;
if (expanding->tainted) {
token->pos.noexpand = 1;
return 1;
}
+ if (nargs > 0)
+ args = calloc(nargs, sizeof(*args));
+
if (sym->arglist) {
if (!match_op(scan_next(&token->next), '('))
return 1;
@@ -738,6 +741,8 @@ static int expand(struct token **list, struct symbol *sym)
(*list)->pos.whitespace = token->pos.whitespace;
*tail = last;
+ free(args);
+
return 0;
}
@@ -2016,9 +2021,12 @@ struct token * preprocess(struct token *token)
static void dump_macro(struct symbol *sym)
{
int nargs = sym->arglist ? sym->arglist->count.normal : 0;
- struct token *args[nargs];
+ struct token **args = NULL;
struct token *token;
+ if (nargs > 0)
+ args = calloc(nargs, sizeof(*args));
+
printf("#define %s", show_ident(sym->ident));
token = sym->arglist;
if (token) {
@@ -2053,6 +2061,8 @@ static void dump_macro(struct symbol *sym)
token = next;
}
putchar('\n');
+
+ free(args);
}
void dump_macro_definitions(void)
The 'selfcheck' make target issues warnings about using vla's in the pre-processor code, like so: CHECK pre-process.c pre-process.c:712:25: warning: Variable length array is used. pre-process.c:2019:28: warning: Variable length array is used. A Makefile change to pass '-Wno-vla' to sparse when processing this source file (or all source files) may be a better solution than the one given here. Replace the use of vla's with heap allocation. This has performance implications (although it may me safer), due to the dynamic memory allocation and the zero initialisation of the memory (using calloc). I have not done any timing measurements to see if this is a problem in practice. Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com> --- Hi Chris, This is the 'obvious' fix-up, with potential performance problems, that I mentioned yesterday. With these two patches on top of today's sparse-next (@f976ce2), the 'make selfcheck' is clean for me on Linux (x86_64). BTW, I have tested today's 'sparse-next' branch on x86_64 Linux and cygwin (without problems), but not yet i686 Linux. ATB, Ramsay Jones pre-process.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)