From 5122a99e441b1819a2bf47ce6eb4566e724c5800 Mon Sep 17 00:00:00 2001 From: Daniel_Cortez Date: Fri, 28 Jun 2019 20:52:13 +0700 Subject: [PATCH] Fix local variables being able to be self-assigned through initialization --- source/compiler/sc1.c | 3 +++ source/compiler/sc3.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index 2fe3934..52bbc96 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -2359,7 +2359,10 @@ static int declloc(int fstatic) int ctag = tag; /* set to "tag" by default */ int explicit_init=FALSE;/* is the variable explicitly initialized? */ if (matchtoken('=')) { + sym->usage &= ~uDEFINE; /* temporarily mark the variable as undefined to prevent + * possible self-assignment through its initialization expression */ doexpr(FALSE,FALSE,FALSE,FALSE,&ctag,NULL,TRUE); + sym->usage |= uDEFINE; explicit_init=TRUE; } else { ldconst(0,sPRI); /* uninitialized variable, set to zero */ diff --git a/source/compiler/sc3.c b/source/compiler/sc3.c index cf9454d..993e358 100644 --- a/source/compiler/sc3.c +++ b/source/compiler/sc3.c @@ -1833,6 +1833,8 @@ static int primary(value *lval) ldconst(0,sPRI); /* load 0 */ return FALSE; /* return 0 for labels (expression error) */ } /* if */ + if ((sym->usage & uDEFINE)==0) + error_suggest(17,st,NULL,estSYMBOL,esfVARCONST); /* undefined symbol */ lval->sym=sym; lval->ident=sym->ident; lval->tag=sym->tag;