Path: utzoo!utgpu!water!watmath!clyde!rutgers!sri-spam!ames!umd5!mimsy!chris From: chris@mimsy.UUCP (Chris Torek) Newsgroups: comp.lang.c Subject: lint vs `= vs ==' Message-ID: <10190@mimsy.UUCP> Date: 15 Jan 88 05:04:02 GMT Organization: U of Maryland, Dept. of Computer Science, Coll. Pk., MD 20742 Lines: 271 Here, in reverse chronological order, are three related changes to lint. I have tried none of them. The first one (from Ray Butterworth, not Arthur Olson; sorry for any confusion) apparently causes lint to complain about if (a = b) but not if ((a = b) != 0) as well as changing the way `constant in conditional context' errors are flagged. One of ado's changes also changes the way such errors are flagged; which one is best, or whether they are complementary, I have not ascertained. From rbutterworth@watmath.UUCP (Ray Butterworth) Thu Aug 7 10:34:31 1986 Relay-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site maryland.UUCP Path: maryland!umcp-cs!seismo!husc6!harvard!panda!genrad!decvax!watmath!rbutterworth From: rbutterworth@watmath.UUCP (Ray Butterworth) Newsgroups: net.lang.c Subject: Re: expr?(void):(void) WHY I THINK IT'S *OK* ( or should be ) Message-ID: <2278@watmath.UUCP> Date: 7 Aug 86 14:34:31 GMT Date-Received: 10 Aug 86 00:37:29 GMT References: <501@bunny.UUCP> <500@copper.UUCP> <273@watmath.UUCP> <3220@utcsri.UUCP> Distribution: net Organization: U of Waterloo, Ontario Lines: 73 > Lint obviously does *some* analysis of this, since it can say > "constant in conditional context". BTW, I have a program that gives > that error, but the expression is in an ARRAY DIMENSION for crissake. > char foo[ THING1 > THING2 ? THING1 : THING2 ]; > Obviously it's going to be a constant. Any lint authors listening? > Turn that off when a constant expression is called for. While I'm > wishing for things, I wanna see 'assignment in conditional context'. > We all know why by now... ------/usr/src/lib/mip/cgram.y------(look for "con_e:") /* EXPRESSIONS */ con_e: { #ifdef LINT {extern int constexp;} constexp=1; #endif $$=instruct; stwart=instruct=0; } e %prec CM ={ $$ = icons( $2 ); instruct=$1; #ifdef LINT constexp=0; #endif } ; .e: e ------/usr/src/lib/mip/trees.c------(look for warning message) case BRANCH: ccwarn: #ifdef LINT {extern int constexp;} if (hflag&&!constexp) werror("constant in conditional context"); #endif case PLUS: ------/usr/src/usr.bin/lint/lpass1.c------(add to definitions of externals) int constexp=0; ------/usr/src/usr.bin/lint/lpass1.c------(in function contx()) contx( p, down, pl, pr ) register NODE *p; register *pl, *pr; { *pl = *pr = VAL; if (p->in.type==UNDEF) down=VAL; /* (void) cast */ switch( p->in.op ){ case NOT: *pl=down; case ANDAND: case OROR: if (hflag&&(p->in.right->in.op==ASSIGN)) werror("Possible unintended assignment"); case QUEST: *pr = down; case CBRANCH: if (hflag&&(p->in.left->in.op==ASSIGN)) werror("possible unintended assignment"); break; case SCONV: case PCONV: From ado@elsie.UUCP (Arthur David Olson) Sun Aug 18 21:50:55 1985 Relay-Version: version B 2.10.1 6/24/83; site umcp-cs.UUCP Posting-Version: version B 2.10.3 alpha 4/15/85; site elsie.UUCP Path: umcp-cs!cvl!elsie!ado From: ado@elsie.UUCP (Arthur David Olson) Newsgroups: net.lang.c Subject: 4.1bsd lint additions to catch "if (condition) ;" Message-ID: <5205@elsie.UUCP> Date: Sun, 18-Aug-85 21:50:55 EDT Date-Received: Sun, 18-Aug-85 22:30:15 EDT References: <389@phri.UUCP> Distribution: net Organization: NIH-LEC, Bethesda, MD Lines: 84 In article <389@phri.UUCP>, roy@phri.UUCP (Roy Smith) writes: > > Here's one that just got me: > > if (sv > score); <----- note extraneous semi-colon > score = sv; Here are additions to 4.1bsd's "lint" to catch constructs like that above. Warnings are only produced if lint's "-h" flag is used. Two files are involved. In the description below, all code to be added appears between "#ifndef OLDVERSION" and "#endif" directives. As usual, the trade secret status of the code precludes a clearer posting. First, additions to "lint.c". Add this declaration just before the function "ecode": #ifndef OLDVERSION char * gripenull; #endif . . .and, as the last statement in "ecode", add this: #ifndef OLDVERSION gripenull = 0; #endif Second, additions to "cgram.y". Just after the declaration of "fake", add a declaration of "gripenull": #ifndef OLDVERSION extern char * gripenull; #endif In the code handling the "ifprefix statement" variant of a "statement" add this code: | ifprefix statement ={ deflab($1); #ifndef OLDVERSION gripenull = 0; #endif In the code handling the "ifelprefix statement" variant of a "statement" add this code: | ifelprefix statement ={ if( $1 != NOLAB ){ deflab( $1 ); reached = 1; } #ifndef OLDVERSION gripenull = 0; #endif In the code handling the "SM" variant of a "statement" add this code: | SM /* #ifndef OLDVERSION */ ={ if (hflag && gripenull != 0) werror(gripenull); } /* #endif OLDVERSION */ In the code for "ifprefix"es, add this code: ={ ecomp( buildtree( CBRANCH, $3, bcon( $$=getlab()) ) ) ; #ifndef OLDVERSION gripenull = "bodyless if"; #endif And, finally, in the code for "ifelprefix"es, add this code: ={ if( reached ) branch( $$ = getlab() ); else $$ = NOLAB; #ifndef OLDVERSION gripenull = "bodyless else"; #endif -- Lint is an Oscar Madison trademark. -- UUCP: ..decvax!seismo!elsie!ado ARPA: elsie!ado@seismo.ARPA DEC, VAX and Elsie are Digital Equipment and Borden trademarks From cvl!elsie!ado Fri Jul 20 14:20:59 1984 Relay-Version: version B 2.10 5/3/83; site umcp-cs.UUCP Posting-Version: version B 2.10.1 6/24/83; site elsie.UUCP Path: umcp-cs!cvl!elsie!ado From: ado@elsie.UUCP Newsgroups: net.bugs.4bsd Subject: "lint -h" misses constants in conditional contexts (w/changes) Message-ID: <1115@elsie.UUCP> Date: Fri, 20-Jul-84 14:20:59 EDT Article-I.D.: elsie.1115 Posted: Fri Jul 20 14:20:59 1984 Date-Received: Fri, 20-Jul-84 20:38:16 EDT Organization: NIH-LEC, Bethesda, MD Lines: 48 Index-- /usr/src/cmd/mip/trees.c /usr/src/cmd/mip/cgram.y Description-- Use of lint's "-h" option misses some constants in conditional contexts. Repeat by-- Pass this through "lint -h": main() { if (0 + 1) printf("true\n"); else printf("false\n"); printf((0 + 1) ? "true\n" : "false\n"); switch (0 + 1) { case 0: printf("false\n"); case 1: printf("true\n"); } } Note that a diagnostic message is produced for line 3 only. Fix-- ed - /usr/src/cmd/mip/trees.c /QUEST.*ICON/a #ifndef OLDVERSION if( hflag ) werror( "constant in conditional context" ); #endif . w q ed - /usr/src/cmd/mip/cgram.y /switchpart:/+2a #ifndef OLDVERSION if (hflag && ((union ndu *) $3)->in.op == ICON) werror( "constant in conditional context" ); #endif . w q -- ...decvax!allegra!umcp-cs!elsie!ado (301) 496-5688 (DEC, VAX and Elsie are Digital Equipment Corp. and Borden's trademarks) -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163) Domain: chris@mimsy.umd.edu Path: uunet!mimsy!chris