Linux SPARSE checker discussions
 help / color / mirror / Atom feed
* [PATCH 2/2] pre-process: replace use of vla's with heap allocation
@ 2017-07-19 20:13 Ramsay Jones
  2017-07-20 12:02 ` Christopher Li
  0 siblings, 1 reply; 6+ messages in thread
From: Ramsay Jones @ 2017-07-19 20:13 UTC (permalink / raw)
  To: Christopher Li; +Cc: Luc Van Oostenryck, Sparse Mailing-list


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(-)

diff --git a/pre-process.c b/pre-process.c
index 74414df..0063f8b 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -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)
-- 
2.13.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-07-29 16:22 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-19 20:13 [PATCH 2/2] pre-process: replace use of vla's with heap allocation Ramsay Jones
2017-07-20 12:02 ` Christopher Li
2017-07-20 16:44   ` Ramsay Jones
2017-07-29 13:17     ` Luc Van Oostenryck
2017-07-29 16:16       ` Christopher Li
2017-07-29 16:22         ` Luc Van Oostenryck

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox