lint(1)                        Silicon Graphics                        lint(1)


NAME
     lint - a C program checker

SYNOPSIS
     lint [options] files

DESCRIPTION
     lint detects features of C program files which are likely to be bugs,
     non-portable, or wasteful.  It also checks type usage more strictly than
     the compiler.  lint issues error and warning messages.  Among the things
     it detects are unreachable statements, loops not entered at the top,
     automatic variables declared and not used, and logical expressions whose
     value is constant.  lint checks for 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.

     Note that this version of lint may not be fully backwards compatible with
     older versions of lint.  The older version became rather useless, since
     it did not support the ANSI C features supported by our C compiler cc(1).
     While this is an ANSI C lint, it does not exactly match the ANSI
     conformance modes of cc(1).  In particular, it treats "long long" as
     "long" and emits a warning about the second "long", which is viewed as a
     redundant keyword.  The __LONGLONG macro is not predefined in any of the
     language models (see the -X options) supported by lint.  To get lint like
     warnings with the full cc(1) language and options, we recommend use of
     the cc(1) option -wlint.  Note that the error and warning messages from
     lint contain less detail than the cc(1) versions of these messages.

     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 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 takes all the .c, .ln, and llib-lx.ln (specified by -lx) files and
     processes 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.
     When the -c option is used, the .ln and the llib-lx.ln files are ignored.
     When the -c option is not used, the second pass of lint checks the .ln
     and the llib-lx.ln list of files for mutual compatibility.

     Any number of lint options may be used, in any order, intermixed with
     file-name arguments.  The following options are used to suppress certain
     kinds of complaints:

     -a   Suppress complaints about assignments of long values to variables
          that are not long.


Page 1                           Release 6.4


     -b   Suppress complaints about break statements that cannot be reached.

     -h   Do not apply heuristic tests that attempt to intuit bugs, improve
          style, and reduce waste.

     -m   Suppress complaints about external symbols that could be declared
          static.

     -u   Suppress complaints about functions and external variables used and
          not defined, or defined and not used.  (This 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:

     -Xc  Strict ANSI C mode.  Similar (but not identical) to the -ansi cc(1)
          mode.

     -Xa  Extended ANSI C mode.  Similar (but not identical) to the -xansi
          cc(1) mode.  This is the default mode.

     -Xt  Traditional C mode.  __STDC__ is not predefined in this mode.
          Similar (but not identical) to the -cckr cc(1).  mode.

     -Ydir
          Changes the standard default search directory, which normally is
          /usr/include to be the directory given as an argument to this
          option.

     -Idir
          Search for included header files in the directory dir before
          searching the current directory and/or the standard place.

     -lx  Include the 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 option can be used to reference local lint libraries and is
          useful in the development of multi-file projects.

     -Ldir
          Search for lint libraries in dir before searching the standard
          place.

     -n   Do not check compatibility against the standard C lint library.


Page 2                           Release 6.4


     -p   Attempt to check portability to other dialects 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.

     -s   Produce one-line diagnostics only.  lint occasionally buffers
          messages to produce a compound report.

     -k   Alter the behavior of /*LINTED [message]*/ directives.  Normally,
          lint will suppress warning messages for the code following these
          directives.  Instead of suppressing the messages, lint prints an
          additional message containing the comment inside the directive.

     -y   Specify that the file being linted will be treated as if the
          /*LINTLIBRARY*/ directive had been used.  A lint library is normally
          created by using the /*LINTLIBRARY*/ directive.

     -F   Print pathnames of files.  lint normally prints the filename without
          the path.

     -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.

     -ox  Cause lint to create a lint library with the name llib-lx.ln.  The
          -c option nullifies any use of the -o option.  The lint library
          produced is the input that is given to lint's second pass.  The -o
          option simply causes this file to be saved in the named lint
          library.  To produce a llib-lx.ln without extraneous messages, use
          of the -x option is suggested.  The -v option is useful if the
          source file(s) for the lint library are just external interfaces.
          Some of the above settings are also available through the use of
          "lint comments" (see below).

     -d   Verbose mode, which shows the options, predefined symbols, include
          paths, etc. that are passed to the lint1 and lint2 passes.

     -V   Write to standard error the product name and release.

     lint recognizes the cc(1) command line options -D and -U, silently
     ignores -g and -O, while it ignores and warns about others.  The
     predefined macro lint is defined to allow certain questionable code to be
     altered or removed for lint.  Thus, 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:

          /*ARGSUSEDn*/
               makes lint check only the first n arguments for usage; a
               missing n is taken to be 0 (this option acts like the -v option
               for the next function).


Page 3                           Release 6.4


          /*CONSTCOND*/ or /*CONSTANTCOND*/ or /*CONSTANTCONDITION*/
               suppresses complaints about constant operands for the next
               expression.

          /*EMPTY*/
               suppresses complaints about a null statement consequent on an
               if statement.  This directive should be placed after the test
               expression, and before the semicolon.  This directive is
               supplied to support empty if statements when a valid else
               statement follows.  It suppresses messages on an empty else
               consequent.

          /*FALLTHRU*/ or /*FALLTHROUGH*/
               suppresses complaints about fall through to a case or default
               labeled statement.  This directive should be placed immediately
               preceding the label.

          /*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 options.

          /*LINTED [message]*/
               suppresses any intra-file warning except those dealing with
               unused variables or functions.  This directive should be placed
               on the line immediately preceding where the lint warning
               occurred.  The -k option alters the way in which lint handles
               this directive.  Instead of suppressing messages, lint will
               print an additional message, if any, contained in the comment.
               This directive is useful in conjunction with the -s option for
               post-lint filtering.

          /*NOTREACHED*/
               at appropriate points stops comments about unreachable code.
               [This comment is typically placed just after calls to functions
               like exit(2)].

          /*PRINTFLIKEn*/
               makes lint check the first (n-1) arguments as usual.  The nth
               argument is interpreted as a printf format string that is used
               to check the remaining arguments.

          /*PROTOLIBn*/
               causes lint to treat function declaration prototypes as
               function definitions if n is non-zero.  This directive can only
               be used in conjunction with the
               /* LINTLIBRARY */ directive.  If n is zero, function prototypes
               will be treated normally.

          /*SCANFLIKEn*/
               makes lint check the first (n-1) arguments as usual.  The nth
               argument is interpreted as a scanf format string that is used


Page 4                           Release 6.4


               to check the remaining arguments.

          /*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.
               The use of the ellipsis terminator (...) in the definition is
               suggested in new or updated code.

     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, if -s is not specified.  Finally, if the -c 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 filename will be printed followed by a question mark.

     The behavior of the -c and the -o 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 option.  Each of these invocations produces
     a .ln file that corresponds to the .c file, and prints all 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
     option), listing all the .ln files with the needed -lx options.  This
     will print all the inter-file inconsistencies.  This scheme works well
     with make; 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.

FILES
     ROOT                    the directory used as the root of the default
                             path for finding the lint libraries.

     LPASSDIR                the directory where the executables for passes 1
                             and 2 of lint must exist. If this environment
                             variable is undefined, then the default path
                             /usr/lib/lint will be used to search for lint1
                             and lint2.

     LIBDIR                  the directory where the lint libraries specified
                             by the -lx option must exist.  If this
                             environment variable is undefined, then the
                             default path /usr/lib/lint under ROOT will be
                             used to search for the libraries.

     LPASSDIR/lint[12]       first and second passes of lint

     LIBDIR/llib-lc.ln       declarations for C Library functions (binary
                             format; source is in LIBDIR/llib-lc)


Page 5                           Release 6.4


     LIBDIR/llib-lm.ln       declarations for Math Library functions (binary
                             format; source is in LIBDIR/llib-lm)

     TMPDIR/*lint*           temporaries

     TMPDIR                  usually /var/tmp but can be redefined by setting
                             the environment variable TMPDIR [see tempnam in
                             tmpnam(3S)].

SEE ALSO
     cc(1), cpp(1), make(1).

BUGS
     exit(2), longjmp(3C), and other functions that do not return are not
     understood; this causes various lies.


Page 6                           Release 6.4