.NH Outline of the program .PP The program can be divided into three parts. A first pass, which parses C program files and outputs definitions, a second pass which processes the definitions and a driver, which feeds the set of files to the first pass and directs its output to the second pass. Both passes produce the warnings on standard error output, which are redirected to standard output by the driver. .PP The first pass is based on an existing C front end, called .I cem [3]. .I Cem is part of the Amsterdam Compiler Kit (ACK), as described in [4]. .PP Most of the code of .I cem is left unchanged. This has several reasons. A lot of work, which is done by .I cem , must also be done by .I lint. E.g. the lexical analysis, the macro expansions, the parsing part and the semantical analysis. Only the code generation part is turned off. An advantage of this approach is, that a person who understands .I cem will not have to spend to much time in understanding .I lint. .PP All changes and extensions to .I cem can be turned off by not defining the compiler directive .ft CW LINT. .R Compiling should then result in the original C compiler. .PP The second pass is a much less complex program. It reads simple definitions generated by the first pass and checks their consistency. This second pass gives warnings about wrong usage of function arguments, their results and about external variables, which are used and defined in more than one file. .PP The driver is a shell program, to be executed by the .UX shell .I sh. It executes the two passes and let them communicate through a filter (sort). Actually it is simplex communication: the first pass only talks to the second pass through the filter. .bp