Lint performs the lexical and syntatic portions of the compilation with substantial additional checks, noting when variables had been used before being set, when they were used as a datatype other than that of their definition, and numerous other programming errors.
The name of the program was derived from the notion that it would lead to "cleaner", more desirable programming, by picking the "lint" -- little bits of fluff -- out of one's code.
Many of the forms of analysis performed by Lint are also required by optimising compilers, so nowadays compiler warnings provide many of the features of Lint. Still, Lint can do some analysis which compilers typically don't do, such as cross-module consistency checking, and checking that the code will be portable to other compilers.
See also: splint