From 72911ada2d254c08181b12d63016976e76f54eb4 Mon Sep 17 00:00:00 2001 From: ISSOtm Date: Sun, 21 Feb 2021 19:13:52 +0100 Subject: [PATCH] Prevent non-numeric symbol from overriding refs Fixes #751 --- src/asm/symbol.c | 26 +++++++++++++++++++++----- test/asm/ref-override-bad.asm | 13 +++++++++++++ test/asm/ref-override-bad.err | 5 +++++ test/asm/ref-override-bad.out | 0 4 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 test/asm/ref-override-bad.asm create mode 100644 test/asm/ref-override-bad.err create mode 100644 test/asm/ref-override-bad.out diff --git a/src/asm/symbol.c b/src/asm/symbol.c index d59b266d..9c07a1e0 100644 --- a/src/asm/symbol.c +++ b/src/asm/symbol.c @@ -365,8 +365,10 @@ void sym_SetCurrentSymbolScope(char const *newScope) * Create a symbol that will be non-relocatable and ensure that it * hasn't already been defined or referenced in a context that would * require that it be relocatable + * @param symbolName The name of the symbol to create + * @param numeric If false, the symbol may not have been referenced earlier */ -static struct Symbol *createNonrelocSymbol(char const *symbolName) +static struct Symbol *createNonrelocSymbol(char const *symbolName, bool numeric) { struct Symbol *symbol = sym_FindExactSymbol(symbolName); @@ -376,6 +378,12 @@ static struct Symbol *createNonrelocSymbol(char const *symbolName) error("'%s' already defined at ", symbolName); dumpFilename(symbol); putc('\n', stderr); + } else if (!numeric) { + // The symbol has already been referenced, but it's not allowed + error("'%s' already referenced at ", symbolName); + dumpFilename(symbol); + putc('\n', stderr); + return NULL; // Don't allow overriding the symbol, that'd be bad! } return symbol; @@ -386,7 +394,10 @@ static struct Symbol *createNonrelocSymbol(char const *symbolName) */ struct Symbol *sym_AddEqu(char const *symName, int32_t value) { - struct Symbol *sym = createNonrelocSymbol(symName); + struct Symbol *sym = createNonrelocSymbol(symName, true); + + if (!sym) + return NULL; sym->type = SYM_EQU; sym->value = value; @@ -408,10 +419,12 @@ struct Symbol *sym_AddEqu(char const *symName, int32_t value) */ struct Symbol *sym_AddString(char const *symName, char const *value) { - struct Symbol *sym = createNonrelocSymbol(symName); + struct Symbol *sym = createNonrelocSymbol(symName, false); + + if (!sym) + return NULL; assignStringSymbol(sym, value); - return sym; } @@ -614,7 +627,10 @@ void sym_Export(char const *symName) */ struct Symbol *sym_AddMacro(char const *symName, int32_t defLineNo, char *body, size_t size) { - struct Symbol *sym = createNonrelocSymbol(symName); + struct Symbol *sym = createNonrelocSymbol(symName, false); + + if (!sym) + return NULL; sym->type = SYM_MACRO; sym->macroSize = size; diff --git a/test/asm/ref-override-bad.asm b/test/asm/ref-override-bad.asm new file mode 100644 index 00000000..709de4e0 --- /dev/null +++ b/test/asm/ref-override-bad.asm @@ -0,0 +1,13 @@ + +SECTION "Bad!", ROM0 + + db W +W equ 0 ; OK + + db X +X equs "0" ; Not OK + + db Y +Y: macro ; Not ok + db 0 +endm diff --git a/test/asm/ref-override-bad.err b/test/asm/ref-override-bad.err new file mode 100644 index 00000000..10354d92 --- /dev/null +++ b/test/asm/ref-override-bad.err @@ -0,0 +1,5 @@ +ERROR: ref-override-bad.asm(8): + 'X' already referenced at ref-override-bad.asm(7) +ERROR: ref-override-bad.asm(13): + 'Y' already referenced at ref-override-bad.asm(10) +error: Assembly aborted (2 errors)! diff --git a/test/asm/ref-override-bad.out b/test/asm/ref-override-bad.out new file mode 100644 index 00000000..e69de29b