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 ++++++++++++++++++++++++++++++++++--- sys/cmd/cc/cc.c | 12 ++++++++++++ sys/cmd/cc/cc.h | 3 +++ 3 files changed, 49 insertions(+), 3 deletions(-) (limited to 'sys/cmd/cc') 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; diff --git a/sys/cmd/cc/cc.c b/sys/cmd/cc/cc.c index da4c4ed..3246292 100644 --- a/sys/cmd/cc/cc.c +++ b/sys/cmd/cc/cc.c @@ -277,9 +277,21 @@ freelx(Lexer *lx) void initp(Parser *p) { + /* initialize temporary buffers */ + memset(p->spstk, 0, sizeof(p->spstk)); + memset(p->nmstk, 0, sizeof(p->nmstk)); + memset(p->dtstk, 0, sizeof(p->dtstk)); + memset(p->ptstk, 0, sizeof(p->ptstk)); + p->sp = p->spstk; p->nm = p->nmstk; p->dt = p->dtstk; + p->pt = p->ptstk; + + /* initialize ast */ + p->ast.cap = 0; + p->ast.len = 0; + p->ast.decls = nil; } error diff --git a/sys/cmd/cc/cc.h b/sys/cmd/cc/cc.h index d030b91..de1ec3f 100644 --- a/sys/cmd/cc/cc.h +++ b/sys/cmd/cc/cc.h @@ -728,6 +728,9 @@ struct Parser Name *nm; Name nmstk[40]; + Ptr *pt; + Ptr ptstk[10]; + Dtor *dt; Dtor dtstk[40]; }; -- cgit v1.2.1