From 6bceaa4a60da1f075bdd3133d7d95d8d5d7a06ac Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Sat, 30 May 2020 19:54:27 -0700 Subject: fix: many use before initialization bugs --- sys/cmd/cc/ast.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) (limited to 'sys/cmd/cc/ast.c') diff --git a/sys/cmd/cc/ast.c b/sys/cmd/cc/ast.c index 4c81509..6a3ed9f 100644 --- a/sys/cmd/cc/ast.c +++ b/sys/cmd/cc/ast.c @@ -98,6 +98,30 @@ putname(Parser *p, Name *n) *p->nm-- = (Name){0}; } +static +Ptr* +getptr(Parser *p) +{ + if (p->pt >= arrend(p->ptstk)) + panicf("pointer stack overflow"); + + return p->pt++; +} + +static +void +putptr(Parser *p, Ptr *ptr) +{ + if (p->pt <= p->ptstk) + panicf("pointer stack underflow"); + + while ((ptr = ptr->link)) + putptr(p, ptr); + + *p->pt-- = (Ptr){0}; +} + + static Dtor* getdtor(Parser *p) @@ -106,7 +130,6 @@ getdtor(Parser *p) panicf("dtor stack overflow"); p->dt->name = getname(p); - p->dt->ptr = (Ptr){ 0 }; return p->dt++; } @@ -117,6 +140,10 @@ putdtor(Parser *p, Dtor *dt) if (p->dt <= p->dtstk) panicf("dtor stack underflow"); + /* release the pointer overflow if we had to use it */ + if (p->dt->ptr.link) + putptr(p, p->dt->ptr.link); + /* the dtor could encompass multiple names hierarchically */ putname(p, dt->name); *p->dt-- = (Dtor){0}; @@ -898,8 +925,11 @@ stmt(Parser *p, Lexer *lx) if (sym->kind == Stype) goto Tdecl; - if (sym->kind == Svar) + if (sym->kind == Svar) { + alloc(s); + s->pos.beg = lx->pos; goto Texpr; + } errorat(lx->pos, "bad symbol type used as type identifier"); goto Bad; @@ -1919,6 +1949,7 @@ dtor(Parser *p, Lexer *lx, Dtor *d, int ab) goto Name; goto Bad; } + n = 0; Ptr: ptr->kind |= Bit(n); advance(p, lx); @@ -1937,7 +1968,7 @@ Key: case Astar: if (++n >= 8) { - alloc(x); + x = getptr(p); x->kind = 0; x->link = nil; ptr->link = x; -- cgit v1.2.1