lint(1) lint(1)
NAME
lint - a C program checker
SYNOPSIS
lint [-a] [-b] [-c] [-Dname[=def]] [-h] [-Idir] [-lx] [-n]
[-o lib] [-p] [-u] [-Uname] [-v] [-x] ... file ...
DESCRIPTION
lint attempts to detect features of the C program files that
are likely to be bugs, non-portable, or wasteful. It also
checks type usage more strictly than the compilers. Among
the things that are currently detected are unreachable
statements, loops not entered at the top, automatic
variables declared and not used, and logical expressions
whose value is constant. Moreover, the usage of functions
is checked to find functions that return values in some
places and not in others, functions called with varying
numbers or types of arguments, and functions whose values
are not used or whose values are used but none returned.
Arguments whose names end with .c are taken to be C source
files. Arguments whose names end with .ln are taken to be
the result of an earlier invocation of lint with either the
-c or the -o flag option used. The .ln files are analogous
to .o (object) files that are produced by the cc(1) command
when given a .c file as input. Files with other suffixes
are warned about and ignored.
lint will take all the .c, .ln, and llib-lx.ln (specified by
-lx) files and process them in their command line order. By
default, lint appends the standard C lint library (llib-
lc.ln) to the end of the list of files. However, if the -p
flag option is used, the portable C lint library (llib-
port.ln) is appended instead. When the -c flag option is
not used, the second pass of lint checks this list of files
for mutual compatibility. When the -c flag option is used,
the .ln and the llib-lx.ln files are ignored.
Any number of lint flag options may be used, in any order,
intermixed with file-name arguments. The following flag
options are used to suppress certain kinds of complaints:
-a Suppress complaints about assignments of long values
to variables that are not long.
-b Suppress complaints about break statements that
cannot be reached. (Programs produced by lex or
yacc will often result in many such complaints).
-h Do not apply heuristic tests that attempt to intuit
bugs, improve style, and reduce waste.
Page 1 (last mod. 1/16/87)
lint(1) lint(1)
-u Suppress complaints about functions and external
variables used and not defined, or defined and not
used. (This flag option is suitable for running
lint on a subset of files of a larger program).
-v Suppress complaints about unused arguments in
functions.
-x Do not report variables referred to by external
declarations but never used.
The following arguments alter lint's behavior:
-lx Include additional lint library llib-lx.ln. For
example, you can include a lint version of the Math
Library llib-lm.ln by inserting -lm on the command
line. This argument does not suppress the default
use of llib-lc.ln. These lint libraries must be in
the assumed directory. This flag option can be used
to reference local lint libraries and is useful in
the development of multi-file projects. To generate
llib-lX.ln from llib-lX, use:
cc -E -C -Dlint llib-lX | /usr/lib/lint1 -vx
-H/tmp/lint$$ > llib-1X.1n
rm -f /tmp/lint$$
-n Do not check compatibility against either the
standard or the portable lint library.
-p Attempt to check portability to other dialects (IBM
and GCOS) of C. Along with stricter checking, this
option causes all non-external names to be truncated
to eight characters and all external names to be
truncated to six characters and one case.
-c Cause lint to produce a .ln file for every .c file
on the command line. These .ln files are the
product of lint's first pass only, and are not
checked for inter-function compatibility.
-o lib Cause lint to create a lint library with the name
llib-llib.ln. The -c flag option nullifies any use
of the -o flag option. The lint library produced is
the input that is given to lint's second pass. The
-o flag option simply causes this file to be saved
in the named lint library. To produce a llib-
llib.ln without extraneous messages, use of the -x
flag option is suggested. The -v flag option is
useful if the source file(s) for the lint library
are just external interfaces (for example, the way
Page 2 (last mod. 1/16/87)
lint(1) lint(1)
the file llib-lc is written). These flag option
settings are also available through the use of lint
comments (see below).
The -D, -U, and -I flag options of cpp(1) and the -g and -O
flag options of cc(1) are also recognized as separate
arguments. The -g and -O flag options are ignored, but, by
recognizing these flag options, lint's behavior is closer to
that of the cc(1) command. Other flag options are warned
about and ignored. The pre-processor symbol lint is defined
to allow certain questionable code to be altered or removed
for lint. Therefore, the symbol lint should be thought of
as a reserved word for all code that is planned to be
checked by lint.
Certain conventional comments in the C source will change
the behavior of lint:
/*NOTREACHED*/
at appropriate points stops comments about unreachable
code. (This comment is typically placed just after
calls to functions like exit(2)).
/*VARARGSn*/
suppresses the usual checking for variable numbers of
arguments in the following function declaration. The
data types of the first n arguments are checked; a
missing n is taken to be 0.
/*ARGSUSED*/
turns on the -v flag option for the next function.
/*LINTLIBRARY*/
at the beginning of a file shuts off complaints about
unused functions and function arguments in this file.
This is equivalent to using the -v and -x flag options.
lint produces its first output on a per-source-file basis.
Complaints regarding included files are collected and
printed after all source files have been processed.
Finally, if the -c flag option is not used, information
gathered from all input files is collected and checked for
consistency. At this point, if it is not clear whether a
complaint stems from a given source file or from one of its
included files, the source file name will be printed
followed by a question mark.
The behavior of the -c and the -o flag options allows for
incremental use of lint on a set of C source files.
Generally, one invokes lint once for each source file with
the -c flag option. Each of these invocations produces a
.ln file which corresponds to the .c file, and prints all
Page 3 (last mod. 1/16/87)
lint(1) lint(1)
messages that are about just that source file. After all
the source files have been separately run through lint, it
is invoked once more (without the -c flag option), listing
all the .ln files with the needed -lx flag options. This
will print all the inter-file inconsistencies. This scheme
works well with make(1); it allows make to be used to lint
only the source files that have been modified since the last
time the set of source files were linted.
EXAMPLE
lint -b myfile.c
checks the consistency of the file myfile.c. The -b flag
option indicates that unreachable break statements are not
to be checked. This flag option might well be used on files
that lex(1) generates.
FILES
/usr/bin/lint
/usr/lib the directory where the lint libraries
specified by the -lx flag option must
exist
/usr/lib/lint[12 first and second passes
/usr/lib/llib-lc.ln
declarations for C Library functions
(binary format; source is in
/usr/lib/llib-lc)
/usr/lib/llib-port.ln
declarations for portable functions
(binary format; source is in
/usr/lib/llib-port)
/usr/lib/llib-lm.l declarations for Math Library functions
(binary format; source is in
/usr/lib/llib-l
temporaries
SEE ALSO
cc(1), cpp(1), make(1),
``lint Reference'' in Oreo Programming Languages and Tools,
Volume 1.
BUGS
exit(2), longjmp(3C), and other functions that do not return
are not understood; this causes various lies.
Page 4 (last mod. 1/16/87)