From mboxrd@z Thu Jan 1 00:00:00 1970 MIME-Version: 1.0 In-Reply-To: <20151125160347.GN20646@sigint.cs.purdue.edu> References: <20151125160347.GN20646@sigint.cs.purdue.edu> From: Ryan Gonzalez Date: Wed, 25 Nov 2015 11:13:16 -0600 Message-ID: To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Content-Type: multipart/alternative; boundary=001a114551ca2751b6052560947f Subject: Re: [9fans] Undefined Behaviour in C Topicbox-Message-UUID: 77617d2c-ead9-11e9-9d60-3106f5b1d025 --001a114551ca2751b6052560947f Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Neither! It's what happens when you run sed 's/^\s*//' on your whole code base, yielding results like (from cmd/yacc.c): void setup(int argc, char *argv[]) { long c, t; int i, j, fd, lev, ty, ytab, *p; int vflag, dflag, stem; char actnm[8], *stemc, *s, dirbuf[128]; Biobuf *fout; ytab =3D 0; vflag =3D 0; dflag =3D 0; stem =3D 0; stemc =3D "y"; foutput =3D 0; fdefine =3D 0; fdebug =3D 0; ARGBEGIN{ case 'v': case 'V': vflag++; break; case 'D': yydebug =3D ARGF(); break; case 'a': yyarg =3D 1; break; case 'd': dflag++; break; case 'l': yyline =3D 0; break; case 'o': ytab++; ytabc =3D ARGF(); break; case 's': stem++; stemc =3D ARGF(); break; case 'S': parser =3D PARSERS; break; default: error("illegal option: %c", ARGC()); }ARGEND openup(stemc, dflag, vflag, ytab, ytabc); fout =3D dflag?fdefine:ftable; if(yyarg){ Bprint(ftable, "#define\tYYARG\t1\n\n"); } if((fd =3D mkstemp(ttempname)) >=3D 0){ tempname =3D ttempname; ftemp =3D Bfdopen(fd, OWRITE); } if((fd =3D mkstemp(tactname)) >=3D 0){ actname =3D tactname; faction =3D Bfdopen(fd, OWRITE); } if(ftemp =3D=3D 0 || faction =3D=3D 0) error("cannot open temp file"); if(argc < 1) error("no input file"); infile =3D argv[0]; if(infile[0] !=3D '/' && getwd(dirbuf, sizeof dirbuf)!=3Dnil){ i =3D strlen(infile)+1+strlen(dirbuf)+1+10; s =3D malloc(i); if(s !=3D nil){ snprint(s, i, "%s/%s", dirbuf, infile); cleanname(s); infile =3D s; } } finput =3D Bopen(infile, OREAD); if(finput =3D=3D 0) error("cannot open '%s'", argv[0]); cnamp =3D cnames; defin(0, "$end"); extval =3D PRIVATE; /* tokens start in unicode 'private use' */ defin(0, "error"); defin(1, "$accept"); defin(0, "$unk"); mem =3D mem0; i =3D 0; for(t =3D gettok(); t !=3D MARK && t !=3D ENDFILE;) switch(t) { case ';': t =3D gettok(); break; case START: if(gettok() !=3D IDENTIFIER) error("bad %%start construction"); start =3D chfind(1, tokname); t =3D gettok(); continue; case TYPEDEF: if(gettok() !=3D TYPENAME) error("bad syntax in %%type"); ty =3D numbval; for(;;) { t =3D gettok(); switch(t) { case IDENTIFIER: if((t=3Dchfind(1, tokname)) < NTBASE) { j =3D TYPE(toklev[t]); if(j !=3D 0 && j !=3D ty) error("type redeclaration of token %s", tokset[t].name); else SETTYPE(toklev[t], ty); } else { j =3D nontrst[t-NTBASE].value; if(j !=3D 0 && j !=3D ty) error("type redeclaration of nonterminal %s", nontrst[t-NTBASE].name ); else nontrst[t-NTBASE].value =3D ty; } case ',': continue; case ';': t =3D gettok(); default: break; } break; } continue; case UNION: /* copy the union declaration to the output */ cpyunion(); t =3D gettok(); continue; case LEFT: case BINARY: case RIGHT: i++; case TERM: /* nonzero means new prec. and assoc. */ lev =3D t-TERM; ty =3D 0; /* get identifiers so defined */ t =3D gettok(); /* there is a type defined */ if(t =3D=3D TYPENAME) { ty =3D numbval; t =3D gettok(); } for(;;) { switch(t) { case ',': t =3D gettok(); continue; case ';': break; case IDENTIFIER: j =3D chfind(0, tokname); if(j >=3D NTBASE) error("%s defined earlier as nonterminal", tokname); if(lev) { if(ASSOC(toklev[j])) error("redeclaration of precedence of %s", tokname); SETASC(toklev[j], lev); SETPLEV(toklev[j], i); } if(ty) { if(TYPE(toklev[j])) error("redeclaration of type of %s", tokname); SETTYPE(toklev[j],ty); } t =3D gettok(); if(t =3D=3D NUMBER) { tokset[j].value =3D numbval; if(j < ndefout && j > 3) error("please define type number of %s earlier", tokset[j].name); t =3D gettok(); } continue; } break; } continue; case LCURLY: defout(0); cpycode(); t =3D gettok(); continue; default: error("syntax error"); } if(t =3D=3D ENDFILE) error("unexpected EOF before %%"); /* t is MARK */ if(!yyarg) Bprint(ftable, "extern int yyerrflag;\n"); Bprint(ftable, "#ifndef YYMAXDEPTH\n"); Bprint(ftable, "#define YYMAXDEPTH 150\n"); Bprint(ftable, "#endif\n" ); if(!ntypes) { Bprint(ftable, "#ifndef YYSTYPE\n"); Bprint(ftable, "#define YYSTYPE int\n"); Bprint(ftable, "#endif\n"); } if(!yyarg){ Bprint(ftable, "YYSTYPE yylval;\n"); Bprint(ftable, "YYSTYPE yyval;\n"); }else{ if(dflag) Bprint(ftable, "#include \"%s.%s\"\n\n", stemc, FILED); Bprint(fout, "struct Yyarg {\n"); Bprint(fout, "\tint\tyynerrs;\n"); Bprint(fout, "\tint\tyyerrflag;\n"); Bprint(fout, "\tvoid*\targ;\n"); Bprint(fout, "\tYYSTYPE\tyyval;\n"); Bprint(fout, "\tYYSTYPE\tyylval;\n"); Bprint(fout, "};\n\n"); } prdptr[0] =3D mem; /* added production */ *mem++ =3D NTBASE; /* if start is 0, we will overwrite with the lhs of the first rule */ *mem++ =3D start; *mem++ =3D 1; *mem++ =3D 0; prdptr[1] =3D mem; while((t=3Dgettok()) =3D=3D LCURLY) cpycode(); if(t !=3D IDENTCOLON) error("bad syntax on first rule"); if(!start) prdptr[0][1] =3D chfind(1, tokname); /* read rules */ while(t !=3D MARK && t !=3D ENDFILE) { /* process a rule */ rlines[nprod] =3D lineno; if(t =3D=3D '|') *mem++ =3D *prdptr[nprod-1]; else if(t =3D=3D IDENTCOLON) { *mem =3D chfind(1, tokname); if(*mem < NTBASE) error("token illegal on LHS of grammar rule"); mem++; } else error("illegal rule: missing semicolon or | ?"); /* read rule body */ t =3D gettok(); more_rule: while(t =3D=3D IDENTIFIER) { *mem =3D chfind(1, tokname); if(*mem < NTBASE) levprd[nprod] =3D toklev[*mem]; mem++; t =3D gettok(); } if(t =3D=3D PREC) { if(gettok() !=3D IDENTIFIER) error("illegal %%prec syntax"); j =3D chfind(2, tokname); if(j >=3D NTBASE) error("nonterminal %s illegal after %%prec", nontrst[j-NTBASE].name); levprd[nprod] =3D toklev[j]; t =3D gettok(); } if(t =3D=3D '=3D') { levprd[nprod] |=3D ACTFLAG; Bprint(faction, "\ncase %d:", nprod); cpyact(mem-prdptr[nprod]-1); Bprint(faction, " break;"); if((t=3Dgettok()) =3D=3D IDENTIFIER) { /* action within rule... */ sprint(actnm, "$$%d", nprod); /* make it a nonterminal */ j =3D chfind(1, actnm); /* * the current rule will become rule number nprod+1 * move the contents down, and make room for the null */ for(p =3D mem; p >=3D prdptr[nprod]; --p) p[2] =3D *p; mem +=3D 2; /* enter null production for action */ p =3D prdptr[nprod]; *p++ =3D j; *p++ =3D -nprod; /* update the production information */ levprd[nprod+1] =3D levprd[nprod] & ~ACTFLAG; levprd[nprod] =3D ACTFLAG; if(++nprod >=3D NPROD) error("more than %d rules", NPROD); prdptr[nprod] =3D p; /* make the action appear in the original rule */ *mem++ =3D j; /* get some more of the rule */ goto more_rule; } } while(t =3D=3D ';') t =3D gettok(); *mem++ =3D -nprod; /* check that default action is reasonable */ if(ntypes && !(levprd[nprod]&ACTFLAG) && nontrst[*prdptr[nprod]-NTBASE].value) { /* no explicit action, LHS has value */ int tempty; tempty =3D prdptr[nprod][1]; if(tempty < 0) error("must return a value, since LHS has a type"); else if(tempty >=3D NTBASE) tempty =3D nontrst[tempty-NTBASE].value; else tempty =3D TYPE(toklev[tempty]); if(tempty !=3D nontrst[*prdptr[nprod]-NTBASE].value) error("default action causes potential type clash"); } nprod++; if(nprod >=3D NPROD) error("more than %d rules", NPROD); prdptr[nprod] =3D mem; levprd[nprod] =3D 0; } /* end of all rules */ defout(1); finact(); if(t =3D=3D MARK) { Bprint(ftable, "\n"); if(yyline) Bprint(ftable, "#line\t%d\t\"%s\"\n", lineno, infile); while((c=3DBgetrune(finput)) !=3D Beof) Bputrune(ftable, c); } Bterm(finput); } On Wed, Nov 25, 2015 at 10:03 AM, wrote: > On Wed, Nov 25, 2015 at 09:25:55AM -0500, Brantley Coile wrote: > > unindented consequences > > Is that a class of Python bugs or an awesome name for a Nerdcore band? > > --=20 Ryan [ERROR]: Your autotools build scripts are 200 lines longer than your program. Something=E2=80=99s wrong. http://kirbyfan64.github.io/ --001a114551ca2751b6052560947f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Neither! It's what happens when you run sed 's/^\s= *//' on your whole code base, yielding results like (from cmd/yacc.c):<= div>

void
setup(int argc, char = *argv[])
{
long c, t;
int i, j, fd, lev, ty, = ytab, *p;
int vflag, dflag, stem;
char actnm[8], *stemc= , *s, dirbuf[128];
Biobuf *fout;

ytab = =3D 0;
vflag =3D 0;
dflag =3D 0;
stem =3D 0;<= /div>
stemc =3D "y";
foutput =3D 0;
fdefi= ne =3D 0;
fdebug =3D 0;
ARGBEGIN{
case 'v= ':
case 'V':
vflag++;
break;
case 'D':
yydebug =3D ARGF();
break;
case 'a':
yyarg =3D 1;
break;
c= ase 'd':
dflag++;
break;
case 'l&= #39;:
yyline =3D 0;
break;
case 'o':<= /div>
ytab++;
ytabc =3D ARGF();
break;
ca= se 's':
stem++;
stemc =3D ARGF();
bre= ak;
case 'S':
parser =3D PARSERS;
bre= ak;
default:
error("illegal option: %c", ARGC= ());
}ARGEND
openup(stemc, dflag, vflag, ytab, ytabc);<= /div>
fout =3D dflag?fdefine:ftable;
if(yyarg){
Bpr= int(ftable, "#define\tYYARG\t1\n\n");
}
if((f= d =3D mkstemp(ttempname)) >=3D 0){
tempname =3D ttempname;
ftemp =3D Bfdopen(fd, OWRITE);
}
if((fd =3D mkst= emp(tactname)) >=3D 0){
actname =3D tactname;
factio= n =3D Bfdopen(fd, OWRITE);
}
if(ftemp =3D=3D 0 || facti= on =3D=3D 0)
error("cannot open temp file");
= if(argc < 1)
error("no input file");
infil= e =3D argv[0];
if(infile[0] !=3D '/' && getwd(dir= buf, sizeof dirbuf)!=3Dnil){
i =3D strlen(infile)+1+strlen(dirbuf= )+1+10;
s =3D malloc(i);
if(s !=3D nil){
snpr= int(s, i, "%s/%s", dirbuf, infile);
cleanname(s);
=
infile =3D s;
}
}
finput =3D Bopen(infil= e, OREAD);
if(finput =3D=3D 0)
error("cannot open = '%s'", argv[0]);
cnamp =3D cnames;

defin(0, "$end");
extval =3D PRIVATE; /* tokens start in unicode 'pr= ivate use' */
defin(0, "error");
defin(1,= "$accept");
defin(0, "$unk");
mem = =3D mem0;
i =3D 0;

for(t =3D gettok(); t= !=3D MARK && t !=3D ENDFILE;)
switch(t) {
case= ';':
t =3D gettok();
break;

case START:
if(gettok() !=3D IDENTIFIER)
error(&= quot;bad %%start construction");
start =3D chfind(1, tokname= );
t =3D gettok();
continue;

c= ase TYPEDEF:
if(gettok() !=3D TYPENAME)
error("bad= syntax in %%type");
ty =3D numbval;
for(;;) {
t =3D gettok();
switch(t) {
case IDENTIFIER:
if((t=3Dchfind(1, tokname)) < NTBASE) {
j =3D TYPE(tokl= ev[t]);
if(j !=3D 0 && j !=3D ty)
error("t= ype redeclaration of token %s",
tokset[t].name);
e= lse
SETTYPE(toklev[t], ty);
} else {
j =3D no= ntrst[t-NTBASE].value;
if(j !=3D 0 && j !=3D ty)
error("type redeclaration of nonterminal %s",
nontrst= [t-NTBASE].name );
else
nontrst[t-NTBASE].value =3D ty;=
}
case ',':
continue;
case= ';':
t =3D gettok();
default:
break;=
}
break;
}
continue;
case UNION:
/* copy the union declaration to the outp= ut */
cpyunion();
t =3D gettok();
continue;

case LEFT:
case BINARY:
case RI= GHT:
i++;

case TERM:
/* nonzer= o means new prec. and assoc. */
lev =3D t-TERM;
ty =3D = 0;

/* get identifiers so defined */
t = =3D gettok();

/* there is a type defined */
<= div>if(t =3D=3D TYPENAME) {
ty =3D numbval;
t =3D getto= k();
}
for(;;) {
switch(t) {
case &= #39;,':
t =3D gettok();
continue;

case ';':
break;

case ID= ENTIFIER:
j =3D chfind(0, tokname);
if(j >=3D NTBASE= )
error("%s defined earlier as nonterminal", tokname);<= /div>
if(lev) {
if(ASSOC(toklev[j]))
error("re= declaration of precedence of %s", tokname);
SETASC(toklev[j]= , lev);
SETPLEV(toklev[j], i);
}
if(ty) {
if(TYPE(toklev[j]))
error("redeclaration of type of %= s", tokname);
SETTYPE(toklev[j],ty);
}
t= =3D gettok();
if(t =3D=3D NUMBER) {
tokset[j].value = =3D numbval;
if(j < ndefout && j > 3)
err= or("please define type number of %s earlier",
tokset[j]= .name);
t =3D gettok();
}
continue;
}
break;
}
continue;

case LCURLY:
defout(0);
cpycode();
t =3D ge= ttok();
continue;

default:
err= or("syntax error");
}
if(t =3D=3D ENDFILE)
error("unexpected EOF before %%");

/* t is MARK */
if(!yyarg)
Bprint(ftable, "exte= rn int yyerrflag;\n");
Bprint(ftabl= e, "#ifndef YYMAXDEP= TH\n");
Bprint(ftable, "#define YYMAXDEPTH 150\n");
Bprint(ftable, "#endif\n" = );
if(!ntypes) {
Bprint(ftable, "#ifndef YYSTYPE\n");
Bprint= (ftable, "#define YY= STYPE int\n");
=
Bprint(ftable, "#endif\n");
}
if(!yyarg)= {
Bprint(ftable, "YYSTYPE yylval;\n");
Bprint(ftable, "YYSTYPE yyval;\n");
= }else{
if(dflag)
Bprint(ftable, "#include \"%= s.%s\"\n\n", stemc, FILED);
Bprint(fout, "struct Y= yarg {\n");
Bprint(fout, "\tint\tyynerrs;\n");
Bprint(fout, "\tint\tyyerrflag;\n");
Bprint(fout= , "\tvoid*\targ;\n");
Bprint(fout, "\tYYSTYPE\tyyv= al;\n");
Bprint(fout, "\tYYSTYPE\tyylval;\n");
Bprint(fout, "};\n\n");
}
prdptr[0] = =3D mem;

/* added production */
*mem++ = =3D NTBASE;

/* if start is 0, we will overwrite wi= th the lhs of the first rule */
*mem++ =3D start;
*mem+= + =3D 1;
*mem++ =3D 0;
prdptr[1] =3D mem;
whi= le((t=3Dgettok()) =3D=3D LCURLY)
cpycode();
if(t !=3D I= DENTCOLON)
error("bad syntax on first rule");

if(!start)
prdptr[0][1] =3D chfind(1, tokname);

/* read rules */
while(t !=3D MARK &&= amp; t !=3D ENDFILE) {
/* process a rule */
rlines[npro= d] =3D lineno;
if(t =3D=3D '|')
*mem++ =3D *prd= ptr[nprod-1];
else
if(t =3D=3D IDENTCOLON) {
= *mem =3D chfind(1, tokname);
if(*mem < NTBASE)
error= ("token illegal on LHS of grammar rule");
mem++;
<= div>} else
error("illegal rule: missing semicolon or | ?&quo= t;);
/* read rule body */
t =3D gettok();
more_rule:
while(t =3D=3D IDENTIFIER) {
*me= m =3D chfind(1, tokname);
if(*mem < NTBASE)
levprd[n= prod] =3D toklev[*mem];
mem++;
t =3D gettok();
}
if(t =3D=3D PREC) {
if(gettok() !=3D IDENTIFIER)
error("illegal %%prec syntax");
j =3D chfind(2,= tokname);
if(j >=3D NTBASE)
error("nonterminal= %s illegal after %%prec",
nontrst[j-NTBASE].name);
levprd[nprod] =3D toklev[j];
t =3D gettok();
}
<= div>if(t =3D=3D '=3D') {
levprd[nprod] |=3D ACTFLAG;
Bprint(faction, "\ncase %d:", nprod);
cpyact(mem-= prdptr[nprod]-1);
Bprint(faction, " break;");
if((t=3Dgettok()) =3D=3D IDENTIFIER) {

/* action = within rule... */
sprint(actnm, "$$%d", nprod);

/* make it a nonterminal */
j =3D chfind(1, act= nm);

/*
* the current rule will become r= ule number nprod+1
* move the contents down, and make room for th= e null
*/
for(p =3D mem; p >=3D prdptr[nprod]; --p)<= /div>
p[2] =3D *p;
mem +=3D 2;

/* en= ter null production for action */
p =3D prdptr[nprod];
= *p++ =3D j;
*p++ =3D -nprod;

/* update t= he production information */
levprd[nprod+1] =3D levprd[nprod] &a= mp; ~ACTFLAG;
levprd[nprod] =3D ACTFLAG;
if(++nprod >= ;=3D NPROD)
error("more than %d rules", NPROD);
prdptr[nprod] =3D p;

/* make the action appear = in the original rule */
*mem++ =3D j;

/*= get some more of the rule */
goto more_rule;
}
}

while(t =3D=3D ';')
t =3D g= ettok();
*mem++ =3D -nprod;

/* check tha= t default action is reasonable */
if(ntypes && !(levprd[n= prod]&ACTFLAG) && nontrst[*prdptr[nprod]-NTBASE].value) {
=

/* no explicit action, LHS has value */
int t= empty;

tempty =3D prdptr[nprod][1];
if(t= empty < 0)
error("must return a value, since LHS has a ty= pe");
else
if(tempty >=3D NTBASE)
tem= pty =3D nontrst[tempty-NTBASE].value;
else
tempty =3D T= YPE(toklev[tempty]);
if(tempty !=3D nontrst[*prdptr[nprod]-NTBASE= ].value)
error("default action causes potential type clash&q= uot;);
}
nprod++;
if(nprod >=3D NPROD)
error("more than %d rules", NPROD);
prdptr[nprod= ] =3D mem;
levprd[nprod] =3D 0;
}

<= div>/* end of all rules */
defout(1);

fi= nact();
if(t =3D=3D MARK) {
Bprint(ftable, "\n&quo= t;);
if(yyline)
Bprint(ftable, "#line\t%d\t\"= %s\"\n", lineno, infile);
while((c=3DBgetrune(finput)) = !=3D Beof)
Bputrune(ftable, c);
}
Bterm(finpu= t);
}

=
On Wed, Nov 25, 2015 at 10:03 AM, <plannine@sigint.cs.purdue.edu> wrote:
On Wed, Nov 25, 2015 at 09:25:55AM -0500, Brantley Coile wr= ote:
> unindented consequences

Is that a class of Python bugs or an awesome name for a Nerdcore band?




--
Ryan
[ERROR]: Your autotools build= scripts are 200 lines longer than your program. Something=E2=80=99s wrong.=
<= /div>
--001a114551ca2751b6052560947f--