Commit 3c0fc400 authored by Ken Thompson's avatar Ken Thompson

fix unsafe.Sizeof("abc")

R=rsc
OCL=25105
CL=25105
parent 575257d5
...@@ -1525,7 +1525,7 @@ unsafenmagic(Node *l, Node *r) ...@@ -1525,7 +1525,7 @@ unsafenmagic(Node *l, Node *r)
{ {
Node *n; Node *n;
Sym *s; Sym *s;
Type *t; Type *t, *tr;
long v; long v;
Val val; Val val;
...@@ -1541,9 +1541,12 @@ unsafenmagic(Node *l, Node *r) ...@@ -1541,9 +1541,12 @@ unsafenmagic(Node *l, Node *r)
if(strcmp(s->name, "Sizeof") == 0) { if(strcmp(s->name, "Sizeof") == 0) {
walktype(r, Erv); walktype(r, Erv);
if(r->type == T) tr = r->type;
if(r->op == OLITERAL && r->val.ctype == CTSTR)
tr = types[TSTRING];
if(tr == T)
goto no; goto no;
v = r->type->width; v = tr->width;
goto yes; goto yes;
} }
if(strcmp(s->name, "Offsetof") == 0) { if(strcmp(s->name, "Offsetof") == 0) {
...@@ -1555,16 +1558,21 @@ unsafenmagic(Node *l, Node *r) ...@@ -1555,16 +1558,21 @@ unsafenmagic(Node *l, Node *r)
} }
if(strcmp(s->name, "Alignof") == 0) { if(strcmp(s->name, "Alignof") == 0) {
walktype(r, Erv); walktype(r, Erv);
if (r->type == T) tr = r->type;
if(r->op == OLITERAL && r->val.ctype == CTSTR)
tr = types[TSTRING];
if(tr == T)
goto no; goto no;
// make struct { byte; T; } // make struct { byte; T; }
t = typ(TSTRUCT); t = typ(TSTRUCT);
t->type = typ(TFIELD); t->type = typ(TFIELD);
t->type->type = types[TUINT8]; t->type->type = types[TUINT8];
t->type->down = typ(TFIELD); t->type->down = typ(TFIELD);
t->type->down->type = r->type; t->type->down->type = tr;
// compute struct widths // compute struct widths
dowidth(t); dowidth(t);
// the offset of T is its required alignment // the offset of T is its required alignment
v = t->type->down->width; v = t->type->down->width;
goto yes; goto yes;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment