⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lint.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
	register struct lnm *npx, *npy;	for( npx = np2; npx < lnp; ++npx ){		/* is it already there? */		for( npy = np1; npy < np2; ++npy ){			if( npx->lid == npy->lid ){ /* yes */				if( npx->flgs == 0 || npx->flgs == (VALSET|VALUSED) )					;  /* do nothing */				else if( (npx->flgs|npy->flgs)== (VALSET|VALUSED) ||					(npx->flgs&npy->flgs&VALSET) ){#ifndef FLEXNAMES					if( flag ) werror( "%.8s evaluation order undefined", stab[npy->lid].sname );#else					if( flag ) werror( "%s evaluation order undefined", stab[npy->lid].sname );#endif					}				if( npy->flgs == 0 ) npx->flgs = 0;				else npy->flgs |= npx->flgs;				goto foundit;				}			}		/* not there: update entry */		np2->lid = npx->lid;		np2->flgs = npx->flgs;		++np2;		foundit: ;		}	/* all finished: merged list is at np1 */	lnp = np2;	}efcode(){	/* code for the end of a function */	register struct symtab *cfp;	cfp = &stab[curftn];	if( retstat & RETVAL && !(Cflag && cfp->sclass==STATIC) )		outdef( cfp, LRV, DECTY );	if( !vflag ){		vflag = argflag;		argflag = 0;		}	if( retstat == RETVAL+NRETVAL )#ifndef FLEXNAMES		werror( "function %.8s has return(e); and return;", cfp->sname);#else		werror( "function %s has return(e); and return;", cfp->sname);#endif	}aocode(p) struct symtab *p; {	/* called when automatic p removed from stab */	register struct symtab *cfs;	cfs = &stab[curftn];	if(p->suse>0 && !(p->sflags&(SMOS|STAG)) ){		if( p->sclass == PARAM ){#ifndef FLEXNAMES			if( vflag ) werror( "argument %.8s unused in function %.8s",#else			if( vflag ) werror( "argument %s unused in function %s",#endif				p->sname,				cfs->sname );			}		else {#ifndef FLEXNAMES			if( p->sclass != TYPEDEF ) werror( "%.8s unused in function %.8s",#else			if( p->sclass != TYPEDEF ) werror( "%s unused in function %s",#endif				p->sname, cfs->sname );			}		}	if( p->suse < 0 && (p->sflags & (SSET|SREF|SMOS)) == SSET &&		!ISARY(p->stype) && !ISFTN(p->stype) ){#ifndef FLEXNAMES		werror( "%.8s set but not used in function %.8s", p->sname, cfs->sname );#else		werror( "%s set but not used in function %s", p->sname, cfs->sname );#endif		}	if( p->stype == STRTY || p->stype == UNIONTY || p->stype == ENUMTY ){		if( !zflag && dimtab[p->sizoff+1] < 0 )#ifndef FLEXNAMES			werror( "structure %.8s never defined", p->sname );#else			werror( "structure %s never defined", p->sname );#endif		}	}defnam( p ) register struct symtab *p; {	/* define the current location as the name p->sname */	if( p->sclass == STATIC && (p->slevel>1 || Cflag) ) return;	if( !ISFTN( p->stype ) )		if( p->sclass == STATIC ) outdef( p, LST, USUAL );		else outdef( p, libflag?LIB:LDI, USUAL );	}zecode( n ){	/* n integer words of zeros */	OFFSZ temp;	temp = n;	inoff += temp*SZINT;	;	}andable( p ) NODE *p; {  /* p is a NAME node; can it accept & ? */	register r;	if( p->in.op != NAME ) cerror( "andable error" );	if( (r = p->tn.rval) < 0 ) return(1);  /* labels are andable */	if( stab[r].sclass == AUTO || stab[r].sclass == PARAM ) return(0); #ifndef FLEXNAMES	if( stab[r].sclass == REGISTER ) uerror( "can't take & of %.8s", stab[r].sname );#else	if( stab[r].sclass == REGISTER ) uerror( "can't take & of %s", stab[r].sname );#endif	return(1);	}NODE *clocal(p) NODE *p; {	/* this is called to do local transformations on	   an expression tree preparitory to its being	   written out in intermediate code.	*/	/* the major essential job is rewriting the	   automatic variables and arguments in terms of	   REG and OREG nodes */	/* conversion ops which are not necessary are also clobbered here */	/* in addition, any special features (such as rewriting	   exclusive or) are easily handled here as well */	register o;	register unsigned t, tl;	switch( o = p->in.op ){	case SCONV:	case PCONV:		if( p->in.left->in.type==ENUMTY ){			p->in.left = pconvert( p->in.left );			}		/* assume conversion takes place; type is inherited */		t = p->in.type;		tl = p->in.left->in.type;		if( aflag && (tl==LONG||tl==ULONG) && (t!=LONG&&t!=ULONG) ){			werror( "long assignment may lose accuracy" );			}		if( aflag>=2 && (tl!=LONG&&tl!=ULONG) && (t==LONG||t==ULONG) && p->in.left->in.op != ICON ){			werror( "assignment to long may sign-extend incorrectly" );			}		if( ISPTR(tl) && ISPTR(t) ){			tl = DECREF(tl);			t = DECREF(t);			switch( ISFTN(t) + ISFTN(tl) ){			case 0:  /* neither is a function pointer */				if( talign(t,p->fn.csiz) > talign(tl,p->in.left->fn.csiz) ){					if( hflag||pflag ) werror( "possible pointer alignment problem" );					}				break;			case 1:				werror( "questionable conversion of function pointer" );			case 2:				;				}			}		p->in.left->in.type = p->in.type;		p->in.left->fn.cdim = p->fn.cdim;		p->in.left->fn.csiz = p->fn.csiz;		p->in.op = FREE;		return( p->in.left );	case PVCONV:	case PMCONV:		if( p->in.right->in.op != ICON ) cerror( "bad conversion");		p->in.op = FREE;		return( buildtree( o==PMCONV?MUL:DIV, p->in.left, p->in.right ) );		}	return(p);	}NODE *offcon( off, t, d, s ) OFFSZ off; TWORD t;{  /* make a structure offset node */	register NODE *p;	p = bcon(0);	p->tn.lval = off/SZCHAR;	return(p);	}noinit(){	/* storage class for such as "int a;" */	return( pflag ? EXTDEF : EXTERN );	}cinit( p, sz ) NODE *p; { /* initialize p into size sz */	inoff += sz;	if( p->in.op == INIT ){		if( p->in.left->in.op == ICON ) return;		if( p->in.left->in.op == NAME && p->in.left->in.type == MOE ) return;		}	uerror( "illegal initialization" );	}char *exname( p ) char *p; {	/* make a name look like an external name in the local machine */	static char aa[8];	register int i;	if( !pflag ) return(p);	for( i=0; i<6; ++i ){		if( isupper(*p ) ) aa[i] = tolower( *p );		else aa[i] = *p;		if( *p ) ++p;		}	aa[6] = '\0';	return( aa );	}char *strip(s) char *s; {#ifndef FLEXNAMES	static char x[LFNM+1];#else	static char x[BUFSIZ];#endif	register char *p;	static	int	stripping = 0;	if (stripping)		return(s);	stripping++;	for( p=x; *s; ++s ){		if( *s != '"' ){#ifndef FLEXNAMES/* PATCHED by ROBERT HENRY on 8Jul80 to fix 14 character file name bug */			if( p >= &x[LFNM] )#else			if( p >= &x[BUFSIZ] )#endif				cerror( "filename too long" );			*p++ = *s;		}	}	stripping = 0;	*p = '\0';#ifndef FLEXNAMES	return( x );#else	return( hash(x) );#endif	}fsave( s ) char *s; {	static union rec fsname;	s = strip( s );#ifndef FLEXNAMES	if( strncmp( s, fsname.f.fn, LFNM ) ){#else	if (fsname.f.fn == NULL || strcmp(s, fsname.f.fn)) {#endif		/* new one */#ifndef FLEXNAMES		strncpy( fsname.f.fn, s, LFNM );#else		fsname.f.fn = s;#endif		fsname.f.decflag = LFN;		fwrite( (char *)&fsname, sizeof(fsname), 1, stdout );#ifdef FLEXNAMES		/* if generating a library, prefix with the library name */		/* only do this for flexnames */		if( libname ){			fwrite( libname, strlen(libname), 1, stdout );			putchar( ':' );			}		fwrite( fsname.f.fn, strlen(fsname.f.fn)+1, 1, stdout );#endif		}	}where(f){ /* print true location of error */	if( f == 'u' && nerrors > 1 )		--nerrors; /* don't get "too many errors" */	fprintf( stderr, "%s(%d): ", strip(ftitle), lineno);	}	/* a number of dummy routines, unneeded by lint */branch(n){;}defalign(n){;}deflab(n){;}bycode(t,i){;}cisreg(t) TWORD t; {return(1);}  /* everyting is a register variable! */fldty(p) struct symtab *p; {	; /* all types are OK here... */	}fldal(t) unsigned t; { /* field alignment... */	if( t == ENUMTY ) return( ALCHAR );  /* this should be thought through better... */	if( ISPTR(t) ){ /* really for the benefit of honeywell (and someday IBM) */		if( pflag ) uerror( "nonportable field type" );		}	else uerror( "illegal field type" );	return(ALINT);	}main( argc, argv ) char *argv[]; {	char *p;	int i;	/* handle options */	for( i = 1; i < argc; i++ )		for( p=argv[i]; *p; ++p ){			switch( *p ){			case '-':				continue;			case '\0':				break;			case 'b':				brkflag = 1;				continue;			case 'p':				pflag = 1;				continue;			case 'c':				cflag = 1;				continue;			case 's':				/* for the moment, -s triggers -h */			case 'h':				hflag = 1;				continue;			case 'L':				libflag = 1;			case 'v':				vflag = 0;				continue;			case 'x':				xflag = 1;				continue;			case 'a':				++aflag;			case 'u':	/* done in second pass */			case 'n':	/* done in shell script */				continue;			case 'z':				zflag = 1;				continue;			case 't':				werror( "option %c now default: see `man 6 lint'", *p );				continue;			case 'P':	/* debugging, done in second pass */				continue;			case 'C':				Cflag = 1;				if( p[1] ) libname = p + 1;				while( p[1] ) p++;				continue;			default:				uerror( "illegal option: %c", *p );				continue;				}			}	if( !pflag ){  /* set sizes to sizes of target machine */# ifdef gcos		SZCHAR = ALCHAR = 9;# else		SZCHAR = ALCHAR = 8;# endif		SZINT = ALINT = sizeof(int)*SZCHAR;		SZFLOAT = ALFLOAT = sizeof(float)*SZCHAR;		SZDOUBLE = ALDOUBLE = sizeof(double)*SZCHAR;		SZLONG = ALLONG = sizeof(long)*SZCHAR;		SZSHORT = ALSHORT = sizeof(short)*SZCHAR;		SZPOINT = ALPOINT = sizeof(int *)*SZCHAR;		ALSTRUCT = ALINT;		/* now, fix some things up for various machines (I wish we had "alignof") */# ifdef pdp11		ALLONG = ALDOUBLE = ALFLOAT = ALINT;#endif# ifdef ibm		ALSTRUCT = ALCHAR;#endif		}	return( mainp1( argc, argv ) );	}ctype( type ) unsigned type; { /* are there any funny types? */	return( type );	}commdec( i ){	/* put out a common declaration */	if( stab[i].sclass == STATIC ) outdef( &stab[i], LST, USUAL );	else outdef( &stab[i], libflag?LIB:LDC, USUAL );	}/* * isitfloat ( s ) char *s; { *	* s is a character string; *	* if floating point is implemented, set dcon to the value of s * *	* lint version * *	dcon = atof( s ); *	return( FCON ); *	} */ /* Added both return cvtfloat and cvtdouble to replace  * function isitfloat.  Return FCON for floating constant and  * DCON for double constant. lvdp002  */ cvtfloat(s) char *s; {	double atof(); 	fcon =  atof(s); 	return (FCON);}cvtdouble(s) char *s; {	double atof();	dcon = atof(s); 	return (DCON);}fldcon( p ) register NODE *p; {	/* p is an assignment of a constant to a field */	/* check to see if the assignment is going to overflow, or otherwise cause trouble */	register s;	CONSZ v;	if( !hflag & !pflag ) return;	s = UPKFSZ(p->in.left->tn.rval);	v = p->in.right->tn.lval;	switch( p->in.left->in.type ){	case CHAR:	case INT:	case SHORT:	case LONG:	case ENUMTY:		if( v>=0 && (v>>(s-1))==0 ) return;		werror( "precision lost in assignment to (possibly sign-extended) field" );	default:		return;	case UNSIGNED:	case UCHAR:	case USHORT:	case ULONG:		if( v<0 || (v>>s)!=0 ) werror( "precision lost in field assignment" );				return;		}	}outdef( p, lty, mode ) struct symtab *p; {	/* output a definition for the second pass */	/* if mode is > USUAL, it is the number of args */	char *fname;	TWORD t;	int line;	static union rec rc;	if( mode == NOFILE ){		fname = "???";		line = p->suse;		}	else if( mode == SVLINE ){		fname = ftitle;		line = -p->suse;		}	else {		fname = ftitle;		line = lineno;		}	fsave( fname );#ifndef FLEXNAMES	strncpy( rc.l.name, exname(p->sname), LCHNM );#endif	rc.l.decflag = lty;	t = p->stype;	if( mode == DECTY ) t = DECREF(t);	rc.l.type.aty = t;	rc.l.type.extra = 0;	rc.l.type.extra1 = 0;	astype( &rc.l.type, p->sizoff );	rc.l.nargs = (mode>USUAL) ? mode : 0;	rc.l.fline = line;	fwrite( (char *)&rc, sizeof(rc), 1, stdout );#ifdef FLEXNAMES	rc.l.name = exname(p->sname);	fwrite( rc.l.name, strlen(rc.l.name)+1, 1, stdout );#endif	}int proflg;int gdebug;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -