From mboxrd@z Thu Jan 1 00:00:00 1970 Content-type: multipart/alternative; boundary=Apple-Mail-C95F2F7D-5467-411E-9AA5-FAD815EEC89E MIME-version: 1.0 (1.0) From: Brantley Coile In-reply-to: Date: Wed, 25 Nov 2015 13:41:16 -0500 Content-transfer-encoding: 7bit Message-id: References: <20151125160347.GN20646@sigint.cs.purdue.edu> To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Subject: Re: [9fans] Undefined Behaviour in C Topicbox-Message-UUID: 776dc316-ead9-11e9-9d60-3106f5b1d025 --Apple-Mail-C95F2F7D-5467-411E-9AA5-FAD815EEC89E Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Align it to column 7 and it looks like all the code I saw when I started.=20= iPhone email > On Nov 25, 2015, at 12:13 PM, Ryan Gonzalez wrote: >=20 > Neither! It's what happens when you run sed 's/^\s*//' on your whole code b= ase, yielding results like (from cmd/yacc.c): >=20 >=20 > 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; >=20 > 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; >=20 > 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; >=20 > for(t =3D gettok(); t !=3D MARK && t !=3D ENDFILE;) > switch(t) { > case ';': > t =3D gettok(); > break; >=20 > case START: > if(gettok() !=3D IDENTIFIER) > error("bad %%start construction"); > start =3D chfind(1, tokname); > t =3D gettok(); > continue; >=20 > 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; >=20 > case UNION: > /* copy the union declaration to the output */ > cpyunion(); > t =3D gettok(); > continue; >=20 > case LEFT: > case BINARY: > case RIGHT: > i++; >=20 > case TERM: > /* nonzero means new prec. and assoc. */ > lev =3D t-TERM; > ty =3D 0; >=20 > /* get identifiers so defined */ > t =3D gettok(); >=20 > /* there is a type defined */ > if(t =3D=3D TYPENAME) { > ty =3D numbval; > t =3D gettok(); > } > for(;;) { > switch(t) { > case ',': > t =3D gettok(); > continue; >=20 > case ';': > break; >=20 > 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; >=20 > case LCURLY: > defout(0); > cpycode(); > t =3D gettok(); > continue; >=20 > default: > error("syntax error"); > } > if(t =3D=3D ENDFILE) > error("unexpected EOF before %%"); >=20 > /* 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; >=20 > /* added production */ > *mem++ =3D NTBASE; >=20 > /* 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"); >=20 > if(!start) > prdptr[0][1] =3D chfind(1, tokname); >=20 > /* 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(); >=20 > 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) { >=20 > /* action within rule... */ > sprint(actnm, "$$%d", nprod); >=20 > /* make it a nonterminal */ > j =3D chfind(1, actnm); >=20 > /* > * 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; >=20 > /* enter null production for action */ > p =3D prdptr[nprod]; > *p++ =3D j; > *p++ =3D -nprod; >=20 > /* 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; >=20 > /* make the action appear in the original rule */ > *mem++ =3D j; >=20 > /* get some more of the rule */ > goto more_rule; > } > } >=20 > while(t =3D=3D ';') > t =3D gettok(); > *mem++ =3D -nprod; >=20 > /* check that default action is reasonable */ > if(ntypes && !(levprd[nprod]&ACTFLAG) && nontrst[*prdptr[nprod]-NTBASE].va= lue) { >=20 > /* no explicit action, LHS has value */ > int tempty; >=20 > 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; > } >=20 > /* end of all rules */ > defout(1); >=20 > 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); > } >=20 >=20 >> 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 >>=20 >> Is that a class of Python bugs or an awesome name for a Nerdcore band? >=20 >=20 >=20 > --=20 > Ryan > [ERROR]: Your autotools build scripts are 200 lines longer than your progr= am. Something=E2=80=99s wrong. > http://kirbyfan64.github.io/=20 --Apple-Mail-C95F2F7D-5467-411E-9AA5-FAD815EEC89E Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
Align it to column 7 and it looks like all the code I sa= w when I started. 

iPhone email

On Nov 25, 2= 015, at 12:13 PM, Ryan Gonzalez <rymg= 19@gmail.com> wrote:

Neither! It's what happens when you run sed 's/^\s*//' on your w= hole 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;
i= nt 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++;
<= div>ytabc =3D ARGF();
break;
case 's':
stem++;=
stemc =3D ARGF();
break;
case 'S':
= parser =3D PARSERS;
break;
default:
error("ill= egal option: %c", ARGC());
}ARGEND
openup(stemc, dflag, v= flag, ytab, ytabc);
fout =3D dflag?fdefine:ftable;
if(yy= arg){
Bprint(ftable, "#define\tYYARG\t1\n\n");
}
if((fd =3D mkstemp(ttempname)) >=3D 0){
tempname =3D ttempna= me;
ftemp =3D Bfdopen(fd, OWRITE);
}
if((fd =3D= mkstemp(tactname)) >=3D 0){
actname =3D tactname;
fa= ction =3D Bfdopen(fd, OWRITE);
}
if(ftemp =3D=3D 0 || fa= ction =3D=3D 0)
error("cannot open temp file");
if(argc &= lt; 1)
error("no input file");
infile =3D argv[0];
=
if(infile[0] !=3D '/' && getwd(dirbuf, sizeof dirbuf)!=3Dnil){<= /div>
i =3D strlen(infile)+1+strlen(dirbuf)+1+10;
s =3D malloc= (i);
if(s !=3D nil){
snprint(s, i, "%s/%s", dirbuf, infi= le);
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");<= /div>
defin(0, "$unk");
mem =3D mem0;
i =3D 0;
=

for(t =3D gettok(); t !=3D MARK && t !=3D ENDFIL= E;)
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:<= /div>
if((t=3Dchfind(1, tokname)) < NTBASE) {
j =3D TYPE(to= klev[t]);
if(j !=3D 0 && j !=3D ty)
error("type r= edeclaration of token %s",
tokset[t].name);
else
SETTYPE(toklev[t], ty);
} else {
j =3D nontrst[t-NTBA= SE].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;
}
ca= se ',':
continue;
case ';':
t =3D gettok();
default:
break;
}
break;
}
continue;

case UNION:
/* copy th= e union declaration to the output */
cpyunion();
t =3D g= ettok();
continue;

case LEFT:
c= ase BINARY:
case RIGHT:
i++;

ca= se TERM:
/* nonzero means new prec. and assoc. */
lev =3D= t-TERM;
ty =3D 0;

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

/* there is a t= ype defined */
if(t =3D=3D TYPENAME) {
ty =3D numbval;
t =3D gettok();
}
for(;;) {
switch(t)= {
case ',':
t =3D gettok();
continue;

case ';':
break;

case I= DENTIFIER:
j =3D chfind(0, tokname);
if(j >=3D NTBASE= )
error("%s defined earlier as nonterminal", tokname);
i= f(lev) {
if(ASSOC(toklev[j]))
error("redeclaration of pr= ecedence of %s", tokname);
SETASC(toklev[j], lev);
SETPL= EV(toklev[j], i);
}
if(ty) {
if(TYPE(toklev[j]= ))
error("redeclaration of type of %s", tokname);
SETTYP= E(toklev[j],ty);
}
t =3D gettok();
if(t =3D=3D= NUMBER) {
tokset[j].value =3D numbval;
if(j < ndefou= t && j > 3)
error("please define type number of %s earl= ier",
tokset[j].name);
t =3D gettok();
}
=
continue;
}
break;
}
continue;<= /div>

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

d= efault:
error("syntax error");
}
if(t =3D=3D E= NDFILE)
error("unexpected EOF before %%");

/* t is MARK */
if(!yyarg)
Bprint(ftable, "extern int yyerrflag;\n");
Bprint(ftable, "#i= fndef YYMAXDEPTH\n= ");
Bprint(ftable, "#define YYMAXDEPTH 150\n");
Bprint(ftable, "#endif\n" );
if(!ntypes) {<= /div>
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");<= /div>
}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\tyyerr= flag;\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 th= e 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)
e= rror("bad syntax on first rule");

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

/* read ru= les */
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 &= lt; NTBASE)
error("token illegal on LHS of grammar rule");
mem++;
} else
error("illegal rule: missing semicolon o= r | ?");
/* 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 tokle= v[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, " b= reak;");
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 beco= me 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;

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

/* update th= e 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 r= ule */
*mem++ =3D j;

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

<= /div>
while(t =3D=3D ';')
t =3D gettok();
*mem++ =3D= -nprod;

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

/* no explic= it action, LHS has value */
int tempty;

t= empty =3D prdptr[nprod][1];
if(tempty < 0)
error("mus= t 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 n= ontrst[*prdptr[nprod]-NTBASE].value)
error("default action causes p= otential type clash");
}
nprod++;
if(nprod >= ;=3D NPROD)
error("more than %d rules", NPROD);
prdptr[n= prod] =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, inf= ile);
while((c=3DBgetrune(finput)) !=3D Beof)
Bputrune(f= table, c);
}
Bterm(finput);
}
=
= --Apple-Mail-C95F2F7D-5467-411E-9AA5-FAD815EEC89E--