driver and manual page added
This commit is contained in:
parent
e66f3adc06
commit
c08c3e5cf6
166
lang/cem/lint/lpass2/lint
Executable file
166
lang/cem/lint/lpass2/lint
Executable file
|
@ -0,0 +1,166 @@
|
|||
#!/bin/sh
|
||||
# (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||
# See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||
#
|
||||
# $Header$
|
||||
|
||||
# L I N T D R I V E R
|
||||
|
||||
PATH=/bin:/usr/bin
|
||||
|
||||
EMLINT=/usr/dick/lint
|
||||
|
||||
LPASS1="$EMLINT/lpass1/lnt -Dmc68000"
|
||||
LPASS2="$EMLINT/lpass2/lpass2"
|
||||
LINTLIB=${LINTLIB-$EMLINT/llib}
|
||||
|
||||
TMP=/usr/tmp/lint1.$$
|
||||
NEW=/usr/tmp/lint2.$$
|
||||
|
||||
trap "rm -f $TMP $NEW; exit 1" 1 2 15
|
||||
trap "rm -f $TMP $NEW; exit 0" 0
|
||||
|
||||
set dummy $LINTFLAGS $@ # dummy as a shield for $LINTFLAGS
|
||||
shift # remove dummy
|
||||
|
||||
LIBRARY=no
|
||||
|
||||
# get the non-library options
|
||||
while test -n "$1"
|
||||
do
|
||||
case "$1" in
|
||||
-l*) # library parameter; start pass 1
|
||||
break
|
||||
;;
|
||||
-KR) # strictly Kernighan & Ritchie, pass 1
|
||||
PARAMS1="$PARAMS1 -R"
|
||||
shift
|
||||
;;
|
||||
-[DUI]*)# Define, Undef and Include; for pass 1 only
|
||||
PARAMS1="$PARAMS1 $1"
|
||||
shift
|
||||
;;
|
||||
-L*) # make a lint library
|
||||
LIBRARY=`expr "$1" : '-L\(llib-l.*\)'`
|
||||
shift
|
||||
;;
|
||||
-*) # for pass 1 or pass 2
|
||||
PARAMS1="$PARAMS1 $1"
|
||||
PARAMS2="$PARAMS2 $1"
|
||||
shift
|
||||
;;
|
||||
*) # input file; start pass 1
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
case "$LIBRARY" in
|
||||
no) # 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
|
||||
STATNR=0 # static scope number
|
||||
|
||||
for F in $*
|
||||
do
|
||||
case $F in
|
||||
-l) # do NOT include llib-lc
|
||||
LIBC=
|
||||
;;
|
||||
-lc) # do include llib-lc
|
||||
LIBC=true
|
||||
;;
|
||||
-l*) # include special lint library
|
||||
cat $LINTLIB/llib$F
|
||||
;;
|
||||
*.c) # a real C-file
|
||||
STATNR=` expr $STATNR + 1 `
|
||||
$LPASS1 -S$STATNR -Dlint $PARAMS1 $F
|
||||
;;
|
||||
*) # a lint library?
|
||||
case `basename $F` in
|
||||
llib-l*) # yes, it is
|
||||
cat $F
|
||||
;;
|
||||
*)
|
||||
echo $0: unknown input $F >&2
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
case "$LIBC" in
|
||||
true) # append llib-lc
|
||||
cat $LINTLIB/llib-lc
|
||||
;;
|
||||
esac
|
||||
) |
|
||||
sort -u |
|
||||
tee /tmp/\#lint.debug |
|
||||
( # pass 2: divert messages to avoid interleaving
|
||||
$LPASS2 $PARAMS2 2>$TMP
|
||||
)
|
||||
) 2>&1 # messages pass 1 to stdout
|
||||
|
||||
# append messages pass 2
|
||||
cat $TMP
|
||||
;;
|
||||
|
||||
*) # making a lint library
|
||||
set -e # stop at first sign of trouble
|
||||
|
||||
case $LIBRARY in
|
||||
llib-l*) # OK
|
||||
;;
|
||||
*)
|
||||
echo "Lint library name does not start with 'llib-l'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if /bin/test ! -r $LIBRARY
|
||||
then cp /dev/null $LIBRARY
|
||||
fi
|
||||
|
||||
# collect pass 1 intermediate output for all input files
|
||||
for F in $@
|
||||
do
|
||||
case $F in
|
||||
*.c) # a C file
|
||||
( echo "/* LINTLIBRARY */"
|
||||
echo "#line 1 \"$F\""
|
||||
cat $F
|
||||
) >$TMP
|
||||
$LPASS1 $PARAMS1 -Dlint -v $TMP
|
||||
;;
|
||||
*) # a library?
|
||||
case `basename $F` in
|
||||
llib-l*) # yes, it is
|
||||
cat $F
|
||||
;;
|
||||
*)
|
||||
echo $0: unknown input $F >&2
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
done >$NEW
|
||||
|
||||
# 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];}
|
||||
}
|
||||
' |
|
||||
sort >$TMP
|
||||
|
||||
cp $TMP $LIBRARY
|
||||
|
||||
esac
|
||||
|
||||
rm -f $TMP $NEW
|
||||
|
154
lang/cem/lint/lpass2/lint.1
Normal file
154
lang/cem/lint/lpass2/lint.1
Normal file
|
@ -0,0 +1,154 @@
|
|||
.TH LINT 1 88/2/22
|
||||
.SH NAME
|
||||
lint \- a C program checker
|
||||
.SH SYNOPSIS
|
||||
.B lint
|
||||
[
|
||||
.B \-abhuvx \-KR
|
||||
]
|
||||
[file | libname
|
||||
.BR \-l xxx
|
||||
] ...
|
||||
.br
|
||||
.B lint
|
||||
.BR \-L libname
|
||||
[file | libname2 ] ...
|
||||
.br
|
||||
.SH DESCRIPTION
|
||||
.I Lint
|
||||
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
|
||||
.BR goto s
|
||||
are not followed and non-termination of functions is not propagated.
|
||||
If, however, no
|
||||
.BR goto s
|
||||
are used, each call to a non-terminating 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
|
||||
that contain the output of the first pass.
|
||||
A library name must start with
|
||||
.B llib\-l
|
||||
and cannot end in
|
||||
.BR .c .
|
||||
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
|
||||
.I lint
|
||||
again as a normal argument.
|
||||
.PP
|
||||
Standard libraries are searched using the
|
||||
.B \-l
|
||||
option; their format is identical to that of the user library files.
|
||||
Possibilities are
|
||||
.BR \-lm ,
|
||||
.B \-ltermcap
|
||||
and
|
||||
.BR \-lcurses .
|
||||
.B \-lc
|
||||
is default; a single
|
||||
.B \-l
|
||||
tells
|
||||
.I lint
|
||||
not to use the standard C library.
|
||||
.PP
|
||||
The
|
||||
.BR \-D ,
|
||||
.B \-U
|
||||
and
|
||||
.B \-I
|
||||
options are recognized as separate arguments. The
|
||||
.B \-KR
|
||||
option tells
|
||||
.I lint
|
||||
to check strictly according to Kernighan & Ritchie; since
|
||||
.I lint
|
||||
is trying to be helpful rather than obnoxious, this is not the default.
|
||||
.PP
|
||||
.I Lint
|
||||
understands the following additional options:
|
||||
.TP
|
||||
.B a
|
||||
Warn about conversions that may cause a loss of precision.
|
||||
.TP
|
||||
.B b
|
||||
Do not report not-reachable
|
||||
.I break
|
||||
statements.
|
||||
This flag may be useful when
|
||||
.I lint
|
||||
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
|
||||
necessary: extern variables that are used in one file only, automatic
|
||||
variables that could be more local.
|
||||
.TP
|
||||
.B u
|
||||
Do not complain about unused and undefined functions and global variables.
|
||||
.TP
|
||||
.B v
|
||||
Do not warn about unused arguments of functions.
|
||||
.TP
|
||||
.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 */
|
||||
.TP
|
||||
/* ARGSUSED */
|
||||
Do not warn about arguments not used in the next function
|
||||
(see also the \-\fBv\fR option).
|
||||
.TP
|
||||
/* NOTREACHED */
|
||||
This tells
|
||||
.I lint
|
||||
that the flow of control "cannot reach" this comment.
|
||||
This is a way to tell
|
||||
.I lint
|
||||
that a statement never "returns".
|
||||
.TP
|
||||
/* LINTLIBRARY */
|
||||
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.
|
||||
.SH FILES
|
||||
.IP ???/lnt 35
|
||||
first pass
|
||||
.IP ???/lpass2/lpass2
|
||||
second pass
|
||||
.IP ???/llib/llib\-l*
|
||||
lint libraries
|
||||
.SH SEE ALSO
|
||||
cem(1)
|
||||
.br
|
||||
Frans Kunst,
|
||||
.I Lint, a C Program Checker
|
||||
.SH BUGS
|
||||
Conflicting options in the command line are not detected.
|
||||
.br
|
||||
After a label, all automatic variables are assumed initialized.
|
||||
.br
|
||||
Initializations hidden inside for statements are sometimes overlooked.
|
||||
.SH AUTHOR
|
||||
Frans Kunst, Vrije Universiteit, Amsterdam.
|
Loading…
Reference in a new issue