From mboxrd@z Thu Jan 1 00:00:00 1970 MIME-Version: 1.0 In-Reply-To: References: <20151125160347.GN20646@sigint.cs.purdue.edu> Date: Thu, 26 Nov 2015 13:04:16 +1100 Message-ID: From: Prof Brucee To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Content-Type: multipart/alternative; boundary=089e014951fafba557052567fd18 Subject: Re: [9fans] Undefined Behaviour in C Topicbox-Message-UUID: 77764a0e-ead9-11e9-9d60-3106f5b1d025 --089e014951fafba557052567fd18 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable gcc is indeed a very sad tome. The mmap of 0 is disgusting. I like kenc. It just works. My behaviour this afternoon will be undefined but not as stupid as that of some programmers. On 26/11/2015 5:43 AM, "Brantley Coile" wrote: > Align it to column 7 and it looks like all the code I saw when I started. > > iPhone email > > On Nov 25, 2015, at 12:13 PM, Ryan Gonzalez wrote: > > 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? >> >> > > > -- > Ryan > [ERROR]: Your autotools build scripts are 200 lines longer than your > program. Something=E2=80=99s wrong. > http://kirbyfan64.github.io/ > > > --089e014951fafba557052567fd18 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

gcc is indeed a very sad tome. The mmap of 0 is disgusting. = I like kenc. It just works. My behaviour this afternoon will be undefined b= ut not as stupid as that of some programmers.

On 26/11/2015 5:43 AM, "Brantley Coile"= ; <brantleycoile@me.com> = wrote:
Align it to = column 7 and it looks like all the code I saw when I started.=C2=A0<= br>
iPhone email

On Nov 25, 2015, at 12:13 PM, Ryan Gonzal= ez <rymg19@gmail.c= om> wrote:

Neither! It's what happens when you run sed 's/^\s*//' on y= our 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;
c= ase 'S':
parser =3D PARSERS;
break;
d= efault:
error("illegal option: %c", ARGC());
= }ARGEND
openup(stemc, dflag, vflag, ytab, ytabc);
fout = =3D dflag?fdefine:ftable;
if(yyarg){
Bprint(ftable, &qu= ot;#define\tYYARG\t1\n\n");
}
if((fd =3D mkstemp(t= tempname)) >=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)<= /div>
error("cannot open temp file");
if(argc < = 1)
error("no input file");
infile =3D argv[0]= ;
if(infile[0] !=3D '/' && getwd(dirbuf, sizeof d= irbuf)!=3Dnil){
i =3D strlen(infile)+1+strlen(dirbuf)+1+10;
=
s =3D malloc(i);
if(s !=3D nil){
snprint(s, i, &qu= ot;%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;

defi= n(0, "$end");
extval =3D PRIVATE; /* tokens start in unicode 'private use' */<= /div>
defin(0, "error");
defin(1, "$accept&quo= t;);
defin(0, "$unk");
mem =3D mem0;
i =3D 0;

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

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

case TYPEDEF:
=
if(gettok() !=3D TYPENAME)
error("bad syntax in %%type&= quot;);
ty =3D numbval;
for(;;) {
t =3D getto= k();
switch(t) {
case IDENTIFIER:
if((t=3Dchf= ind(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
SETT= YPE(toklev[t], ty);
} else {
j =3D nontrst[t-NTBASE].va= lue;
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 U= NION:
/* copy the union declaration to the output */
cp= yunion();
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;

<= /div>
/* get identifiers so defined */
t =3D gettok();
<= div>
/* there is a type defined */
if(t =3D=3D TYPE= NAME) {
ty =3D numbval;
t =3D gettok();
}
for(;;) {
switch(t) {
case ',':
t =3D gettok();
continue;

case ';&= #39;:
break;

case IDENTIFIER:
= j =3D chfind(0, tokname);
if(j >=3D NTBASE)
error(&q= uot;%s defined earlier as nonterminal", tokname);
if(lev) {<= /div>
if(ASSOC(toklev[j]))
error("redeclaration of prece= dence of %s", tokname);
SETASC(toklev[j], lev);
SE= TPLEV(toklev[j], i);
}
if(ty) {
if(TYPE(tokle= v[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;<= /div>
}
continue;

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

default:
error("syntax erro= r");
}
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");<= /div>
Bprint(ftable, "#endif\n");
}
if(!y= yarg){
Bprint(ftable, "YYSTYPE yylval;\n");
Bprint(ftable, "YYSTYPE yyval;\n");
}else{<= /div>
if(dflag)
Bprint(ftable, "#include \"%s.%s\&q= uot;\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&q= uot;);
Bprint(fout, "\tYYSTYPE\tyylval;\n");
= Bprint(fout, "};\n\n");
}
prdptr[0] =3D mem;<= /div>

/* 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=3Dge= ttok()) =3D=3D LCURLY)
cpycode();
if(t !=3D IDENTCOLON)=
error("bad syntax on first rule");

if(!start)
prdptr[0][1] =3D chfind(1, tokname);
<= br>
/* read rules */
while(t !=3D MARK && t != =3D ENDFILE) {
/* process a rule */
rlines[nprod] =3D l= ineno;
if(t =3D=3D '|')
*mem++ =3D *prdptr[npro= d-1];
else
if(t =3D=3D IDENTCOLON) {
*mem =3D= chfind(1, tokname);
if(*mem < NTBASE)
error("t= oken illegal on LHS of grammar rule");
mem++;
} el= se
error("illegal rule: missing semicolon or | ?");
/* read rule body */
t =3D gettok();

<= div>more_rule:
while(t =3D=3D IDENTIFIER) {
*mem =3D ch= find(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, tokna= me);
if(j >=3D NTBASE)
error("nonterminal %s il= legal after %%prec",
nontrst[j-NTBASE].name);
levp= rd[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 nu= mber nprod+1
* move the contents down, and make room for the null=
*/
for(p =3D mem; p >=3D prdptr[nprod]; --p)
<= div>p[2] =3D *p;
mem +=3D 2;

/* enter nu= ll production for action */
p =3D prdptr[nprod];
*p++ = =3D j;
*p++ =3D -nprod;

/* update the pr= oduction information */
levprd[nprod+1] =3D levprd[nprod] & ~= ACTFLAG;
levprd[nprod] =3D ACTFLAG;
if(++nprod >=3D = NPROD)
error("more than %d rules", NPROD);
pr= dptr[nprod] =3D p;

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

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

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

/* check that def= ault 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&qu= ot;);
else
if(tempty >=3D NTBASE)
tempty = =3D nontrst[tempty-NTBASE].value;
else
tempty =3D TYPE(= toklev[tempty]);
if(tempty !=3D nontrst[*prdptr[nprod]-NTBASE].va= lue)
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);

fina= ct();
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= );
}

<= br>
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 longe= r than your program. Something=E2=80=99s wrong.
--089e014951fafba557052567fd18--