aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/cc
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2020-05-30 19:54:27 -0700
committerNicholas Noll <nbnoll@eml.cc>2020-05-30 19:54:27 -0700
commit6bceaa4a60da1f075bdd3133d7d95d8d5d7a06ac (patch)
tree37bb8eb3667c397d1b7e6bd1733aae710abd6dd7 /sys/cmd/cc
parentfc158ab464fd58aec17aa590bc2022f539fefc5a (diff)
fix: many use before initialization bugs
Diffstat (limited to 'sys/cmd/cc')
-rw-r--r--sys/cmd/cc/ast.c37
-rw-r--r--sys/cmd/cc/cc.c12
-rw-r--r--sys/cmd/cc/cc.h3
3 files changed, 49 insertions, 3 deletions
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
@@ -99,6 +99,30 @@ putname(Parser *p, Name *n)
}
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];
};