Annotation of src/usr.bin/xlint/README, Revision 1.2
1.1 cloder 1: lint is divided into 3 separate programs: lint, lint1, and
2: lint2 (the latter two programs reside in /usr/libexec).
3:
4: lint calls /usr/libexec/cpp to preprocess the program, then passes
5: the output to lint1, which does most of the work. lint1 then outputs
6: a .ln file, which is parsed by lint2 to do more holistic checks. all
7: of this is driven by /usr/bin/lint, which is like a wrapper program.
8:
9: lint1 implements its own C parser. it is incapable of parsing some
10: weird gcc things, such as __attribute__ and so on. OpenBSD's source
11: tree already does a good job of removing gcc'isms when parsers other
12: than gcc are detected.
13:
14: lint1 keeps a symbol table for the current context, which always
15: includes global symbols for the current translation unit, as well as
16: locals (inside a function definition). When it parses a function
17: definition, it pushes a symbol table context onto the stack, and
1.2 ! jmc 18: then pops it off when the function definition ends.
1.1 cloder 19:
20: lint1 does the vast majority of its checks one expression at a time.
21: It uses the symbol table (which contains types of symbols) and almost
22: nothing else when doing type conversions. All of the checks happen at
23: parse time. lint1 does not really build an abstract syntax tree (AST)
24: to represent the entire program; it only keeps track of the symbols
25: in the current context, and some minimal information about the types
26: of enclosing control blocks (loops, switch statements, etc). When lint1
27: is finished parsing an expression, you will not see any more warnings
28: regarding that expression.
29:
1.2 ! jmc 30: $OpenBSD: README,v 1.1 2006/04/26 16:33:38 cloder Exp $