library files now end in .llb
This commit is contained in:
parent
63c0ca38f9
commit
900421f411
|
@ -1,3 +1,8 @@
|
|||
28-Oct-88 Dick Grune (dick) at dick
|
||||
The names of UNIX lint library files start with llib-l..., where the
|
||||
-l is the -l from -lc and -lm, a hack if there ever was one. Our
|
||||
(ACK) lint library files now end in .llb.
|
||||
|
||||
2-Sep-88 Dick Grune (dick) at dick
|
||||
Guided by lint itself, many functions have been declared PRIVATE.
|
||||
|
||||
|
|
|
@ -10,9 +10,11 @@ PATH=/bin:/usr/bin
|
|||
|
||||
EMLINT=/usr/dick/lint
|
||||
|
||||
LPASS1="$EMLINT/lpass1/lnt -Dmc68000"
|
||||
LPASS2="$EMLINT/lpass2/lpass2"
|
||||
LINTLIB=${LINTLIB-$EMLINT/llib}
|
||||
LPASS1="$EMLINT/lpass1/lnt -Dmc68000" # pass 1 program
|
||||
LPASS2="$EMLINT/lpass2/lpass2" # pass 2 program
|
||||
LLLIB="$EMLINT/llib" # lint libraries directory
|
||||
|
||||
LINTLIB=${LINTLIB-$LLLIB}
|
||||
|
||||
TMP=/usr/tmp/lint1.$$
|
||||
NEW=/usr/tmp/lint2.$$
|
||||
|
@ -23,7 +25,7 @@ trap "rm -f $TMP $NEW; exit 0" 0
|
|||
set dummy $LINTFLAGS $@ # dummy as a shield for $LINTFLAGS
|
||||
shift # remove dummy
|
||||
|
||||
LIBRARY=no
|
||||
LIBRARY=
|
||||
|
||||
# get the non-library options
|
||||
while test -n "$1"
|
||||
|
@ -41,7 +43,7 @@ do
|
|||
shift
|
||||
;;
|
||||
-L*) # make a lint library
|
||||
LIBRARY=`expr "$1" : '-L\(llib-l.*\)'`
|
||||
LIBRARY=`expr "$1" : '-L\(.*\)'`
|
||||
shift
|
||||
;;
|
||||
-*) # for pass 1 or pass 2
|
||||
|
@ -56,23 +58,23 @@ do
|
|||
done
|
||||
|
||||
case "$LIBRARY" in
|
||||
no) # normal lint; we want its messages on stdout; this takes some doing
|
||||
'') # normal lint; we want its messages on stdout; this takes some doing
|
||||
( # intermediate file has to go to stdout for pipe connection
|
||||
( # pass 1: messages to stderr
|
||||
LIBC=true # true if llib-lc to be included
|
||||
LIBC=true # true if c.llb to be included
|
||||
STATNR=0 # static scope number
|
||||
|
||||
for F in $*
|
||||
do
|
||||
case $F in
|
||||
-l) # do NOT include llib-lc
|
||||
-l) # do NOT include c.llb
|
||||
LIBC=
|
||||
;;
|
||||
-lc) # do include llib-lc
|
||||
-lc) # do include c.llb
|
||||
LIBC=true
|
||||
;;
|
||||
-l*) # include special lint library
|
||||
cat $LINTLIB/llib$F
|
||||
cat $LINTLIB/`expr $F : '-l\(.*\)'`.llb
|
||||
;;
|
||||
*.c) # a real C-file
|
||||
STATNR=` expr $STATNR + 1 `
|
||||
|
@ -80,7 +82,7 @@ no) # normal lint; we want its messages on stdout; this takes some doing
|
|||
;;
|
||||
*) # a lint library?
|
||||
case `basename $F` in
|
||||
llib-l*) # yes, it is
|
||||
*.llb) # yes, it is
|
||||
cat $F
|
||||
;;
|
||||
*)
|
||||
|
@ -92,8 +94,8 @@ no) # normal lint; we want its messages on stdout; this takes some doing
|
|||
done
|
||||
|
||||
case "$LIBC" in
|
||||
true) # append llib-lc
|
||||
cat $LINTLIB/llib-lc
|
||||
true) # append c.llb
|
||||
cat $LINTLIB/c.llb
|
||||
;;
|
||||
esac
|
||||
) |
|
||||
|
@ -108,15 +110,14 @@ no) # normal lint; we want its messages on stdout; this takes some doing
|
|||
cat $TMP
|
||||
;;
|
||||
|
||||
*) # making a lint library
|
||||
?*) # making a lint library
|
||||
set -e # stop at first sign of trouble
|
||||
|
||||
case $LIBRARY in
|
||||
llib-l*) # OK
|
||||
case "$LIBRARY" in
|
||||
*.llb) # OK
|
||||
;;
|
||||
*)
|
||||
echo "Lint library name does not start with 'llib-l'" >&2
|
||||
exit 1
|
||||
*) # no suffix .llb
|
||||
LIBRARY=$LIBRARY.llb
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -129,15 +130,11 @@ no) # normal lint; we want its messages on stdout; this takes some doing
|
|||
do
|
||||
case $F in
|
||||
*.c) # a C file
|
||||
( echo "/* LINTLIBRARY */"
|
||||
echo "#line 1 \"$F\""
|
||||
cat $F
|
||||
) >$TMP
|
||||
$LPASS1 $PARAMS1 -Dlint -v $TMP
|
||||
$LPASS1 $PARAMS1 -Dlint -L $F
|
||||
;;
|
||||
*) # a library?
|
||||
case `basename $F` in
|
||||
llib-l*) # yes, it is
|
||||
*.llb) # yes, it is
|
||||
cat $F
|
||||
;;
|
||||
*)
|
||||
|
@ -151,12 +148,15 @@ no) # normal lint; we want its messages on stdout; this takes some doing
|
|||
# get the last line for each name and sort them
|
||||
cat $LIBRARY $NEW |
|
||||
awk -F: '
|
||||
{ entry[$1] = $0;
|
||||
}
|
||||
END { for (e in entry) {print entry[e];}
|
||||
}
|
||||
{
|
||||
entry[$1] = $0;
|
||||
}
|
||||
END {
|
||||
for (e in entry) {print entry[e];}
|
||||
}
|
||||
' |
|
||||
sort >$TMP
|
||||
sort |
|
||||
grep -v '^main:' >$TMP
|
||||
|
||||
cp $TMP $LIBRARY
|
||||
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
.TH LINT 1 88/2/22
|
||||
.\" (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||
.\" See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||
.\"
|
||||
.\" $Header$
|
||||
.TH LINT 1 88/10/13
|
||||
.SH NAME
|
||||
lint \- a C program checker
|
||||
.SH SYNOPSIS
|
||||
|
@ -12,7 +16,9 @@ lint \- a C program checker
|
|||
.br
|
||||
.B lint
|
||||
.BR \-L libname
|
||||
[file | libname2 ] ...
|
||||
[file | libname2
|
||||
.BR \-l xxx
|
||||
] ...
|
||||
.br
|
||||
.SH DESCRIPTION
|
||||
.I Lint
|
||||
|
@ -20,32 +26,44 @@ does an extensive consistency and plausibility check on a set of C
|
|||
program files.
|
||||
When it detects a doubtful construction
|
||||
(which need not be an error) it gives a warning.
|
||||
.I Lint
|
||||
does a full flow-of-control check, except that
|
||||
.PP
|
||||
It does a full flow-of-control check, except that
|
||||
.BR goto s
|
||||
are not followed and non-termination of functions is not propagated.
|
||||
are not followed and that the fact that a function does not return
|
||||
is not propagated.
|
||||
If, however, no
|
||||
.BR goto s
|
||||
are used, each call to a non-terminating function is followed by
|
||||
are used, each call of a non-returning function is followed by
|
||||
/*NOTREACHED*/ and each switch has a default clause (possibly consisting
|
||||
of /*NOTREACHED*/), the initialization state of all local variables will
|
||||
be checked correctly.
|
||||
.PP
|
||||
The second command is used to maintain lint libraries; these are ASCII files
|
||||
It checks the types of the arguments implied by the format in a call of
|
||||
.IR printf() ,
|
||||
.IR scanf()
|
||||
and family, if the format-string is a direct argument in the call.
|
||||
Formats of user functions can be indicated using a FORMAT pseudo-comment; see
|
||||
below.
|
||||
.PP
|
||||
.I Libraries
|
||||
.PP
|
||||
The second command (the
|
||||
.BR \-L -option)
|
||||
is used to maintain lint libraries; these are ASCII files
|
||||
that contain the output of the first pass.
|
||||
A library name must start with
|
||||
.B llib\-l
|
||||
and cannot end in
|
||||
.BR .c .
|
||||
A library name ends in
|
||||
.BR .llb .
|
||||
A lint user library can be created and updated by using the
|
||||
.B \-L
|
||||
option. The
|
||||
.I libname
|
||||
must be a local file and can be passed to
|
||||
must be a local file, end in
|
||||
.BR .llb ,
|
||||
and can be passed to
|
||||
.I lint
|
||||
again as a normal argument.
|
||||
.PP
|
||||
Standard libraries are searched using the
|
||||
Standard libraries are searched by default or by explicitly giving the
|
||||
.B \-l
|
||||
option; their format is identical to that of the user library files.
|
||||
Possibilities are
|
||||
|
@ -59,13 +77,19 @@ is default; a single
|
|||
tells
|
||||
.I lint
|
||||
not to use the standard C library.
|
||||
The standard libraries are searched for in the standard lint directory or
|
||||
in the directory given in the environment variable LINTLIB, if present.
|
||||
.PP
|
||||
.I Options
|
||||
.PP
|
||||
The
|
||||
.BR \-D ,
|
||||
.B \-U
|
||||
and
|
||||
.B \-I
|
||||
options are recognized as separate arguments. The
|
||||
options are recognized as separate arguments and conform to those of
|
||||
.IR cc .
|
||||
The
|
||||
.B \-KR
|
||||
option tells
|
||||
.I lint
|
||||
|
@ -88,8 +112,9 @@ This flag may be useful when
|
|||
is run on a generated source file.
|
||||
.TP
|
||||
.B h
|
||||
Signal "null effects", possible pointer alignment problems and unexpected
|
||||
constructs. Report definitions of variables that have a scope wider than
|
||||
Apply several heuristics:
|
||||
signal "null effects", possible pointer alignment problems and odd
|
||||
constructs; report definitions of variables that have a scope wider than
|
||||
necessary: extern variables that are used in one file only, automatic
|
||||
variables that could be more local.
|
||||
.TP
|
||||
|
@ -102,19 +127,10 @@ Do not warn about unused arguments of functions.
|
|||
.B x
|
||||
Complain about unused external variables.
|
||||
.PP
|
||||
In some cases where the programmer knows that a construction is questionable
|
||||
but nevertheless correct, a pseudo-comment can be used to silence
|
||||
.IR lint ;
|
||||
the comments recognized are:
|
||||
.TP
|
||||
/* VARARGS\fIn\fR */
|
||||
The next function can be called with a variable number of
|
||||
arguments.
|
||||
Only check the types of the first \fIn\fR arguments.
|
||||
The \fIn\fR must follow the word VARARGS immediately.
|
||||
.TP
|
||||
/* VARARGS */
|
||||
Same as /* VARARGS0 */
|
||||
.I Pseudo-comments
|
||||
.PP
|
||||
The following pseudo-comments can be used to influence the behaviour of
|
||||
.IR lint:
|
||||
.TP
|
||||
/* ARGSUSED */
|
||||
Do not warn about arguments not used in the next function
|
||||
|
@ -132,12 +148,63 @@ that a statement never "returns".
|
|||
The following definitions are assumed to be part of a library.
|
||||
It suppresses complaints about unused functions and variables
|
||||
and is used in the creation of lint libraries.
|
||||
It implies /* ARGSUSED */.
|
||||
.TP
|
||||
/* VARARGS\fIn\fR */
|
||||
The next function can be called with a variable number of
|
||||
arguments.
|
||||
Only check the types of the first \fIn\fR arguments.
|
||||
The \fIn\fR must follow the word VARARGS immediately.
|
||||
/* VARARGS0 */ may be abbreviated to /* VARARGS */.
|
||||
.TP
|
||||
/* FORMAT\fIn\fR $ ... $ */
|
||||
The \fIn\fP-th argument (counting from 0) of the next function declaration
|
||||
corresponds to a
|
||||
.IR printf -like
|
||||
format string. Details about the format are given between the $$. A missing
|
||||
$$ repeats the latest format.
|
||||
The \fIn\fR must follow the word FORMAT immediately.
|
||||
/* FORMAT\fIn\fR $ ... $ */ implies /* VARARGS\fIn+1\fP */; if the format
|
||||
is followed by more required arguments, a separate /* VARARGS\fIm\fP */
|
||||
must be given after the FORMAT pseudo-comment.
|
||||
.PP
|
||||
.I Formats
|
||||
.PP
|
||||
.I Lint
|
||||
recognizes conversion specifications of the form %[N|*|][.[N|*]]X where X
|
||||
is an arbitrary string, given in the $$-part of the FORMAT pseudo-comment.
|
||||
The latter consists of a list of format specifications, each of the form
|
||||
.IR %X = type ,
|
||||
where
|
||||
.I type
|
||||
is the expected type in "C normal form" (like in a cast, with no superfluous
|
||||
parentheses and without the use of typedefs).
|
||||
.PP
|
||||
Example: the FORMAT pseudo-comment for
|
||||
.I printf()
|
||||
is:
|
||||
.br
|
||||
/* FORMAT0 $
|
||||
.br
|
||||
%[dox] = int %l[dox] = long %[DOX] = long
|
||||
.br
|
||||
%u = unsigned int %lu = unsigned long %U = unsigned long
|
||||
.br
|
||||
%[feg] = double
|
||||
.br
|
||||
%c = int %s = char *
|
||||
.br
|
||||
$ */
|
||||
.SH "ENVIRONMENT VARIABLES"
|
||||
LINTFLAGS additional flag arguments (e.g. LINTFLAGS=\-h)
|
||||
.br
|
||||
LINTLIB directory in which the standard libraries are looked up
|
||||
.SH FILES
|
||||
.IP ???/lnt 35
|
||||
.IP ???/lnt 24
|
||||
first pass
|
||||
.IP ???/lpass2/lpass2
|
||||
second pass
|
||||
.IP ???/llib/llib\-l*
|
||||
.IP ???/llib/*.llb
|
||||
lint libraries
|
||||
.SH SEE ALSO
|
||||
cem(1)
|
||||
|
@ -152,3 +219,6 @@ After a label, all automatic variables are assumed initialized.
|
|||
Initializations hidden inside for statements are sometimes overlooked.
|
||||
.SH AUTHOR
|
||||
Frans Kunst, Vrije Universiteit, Amsterdam.
|
||||
.br
|
||||
Dick Grune, Vrije Universiteit, Amsterdam.
|
||||
.br
|
||||
|
|
Loading…
Reference in a new issue