shithub: rgbds

Download patch

ref: 06f7387466eb7d9ee3d9963d3a52a8f455bcaaf2
parent: 21e50eeff1bac67817406cc9df8e5dce5712eb6e
author: ISSOtm <eldredhabert0@gmail.com>
date: Mon Oct 5 23:04:25 EDT 2020

Avoid using VLA in EQUS dumping

MSVC does not support those...
Also add a `develop` warning about VLAs, to avoid future incidents

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -45,7 +45,7 @@
 
   if(MORE_WARNINGS)
     add_compile_options(-Werror -Wextra -Wno-type-limits
-                        -Wno-sign-compare -Wformat -Wformat-security -Wformat-overflow=2
+                        -Wno-sign-compare -Wvla -Wformat -Wformat-security -Wformat-overflow=2
                         -Wformat-truncation=1 -Wformat-y2k -Wswitch-enum -Wunused
                         -Wuninitialized -Wunknown-pragmas -Wstrict-overflow=5
                         -Wstringop-overflow=4 -Walloc-zero -Wduplicated-cond
--- a/Makefile
+++ b/Makefile
@@ -187,7 +187,7 @@
 
 develop:
 	$Qenv $(MAKE) -j WARNFLAGS="-Werror -Wall -Wextra -Wpedantic -Wno-type-limits \
-		-Wno-sign-compare -Wformat -Wformat-security -Wformat-overflow=2 \
+		-Wno-sign-compare -Wvla -Wformat -Wformat-security -Wformat-overflow=2 \
 		-Wformat-truncation=1 -Wformat-y2k -Wswitch-enum -Wunused \
 		-Wuninitialized -Wunknown-pragmas -Wstrict-overflow=5 \
 		-Wstringop-overflow=4 -Walloc-zero -Wduplicated-cond \
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -897,11 +897,14 @@
 {
 	if (!lexerState)
 		return;
-	struct Expansion *stack[nMaxRecursionDepth + 1];
+	struct Expansion **stack = malloc(sizeof(*stack) * (nMaxRecursionDepth + 1));
 	struct Expansion *expansion; /* Temp var for `lookupExpansion` */
 	unsigned int depth = 0;
 	size_t distance = lexerState->expansionOfs;
 
+	if (!stack)
+		fatalerror("Failed to alloc string expansion stack: %s\n", strerror(errno));
+
 #define LOOKUP_PRE_NEST(exp) do { \
 	/* Only register EQUS expansions, not string args */ \
 	if ((exp)->name) \
@@ -915,6 +918,7 @@
 
 	while (depth--)
 		fprintf(stderr, "while expanding symbol \"%s\"\n", stack[depth]->name);
+	free(stack);
 }
 
 /* Function to discard all of a line's comments */