1 /*	$OpenBSD: lint2.h,v 1.3 2005/11/20 17:42:50 deraadt Exp $	*/
2 /*	$NetBSD: lint2.h,v 1.2 1995/07/03 21:24:49 cgd Exp $	*/
3 
4 /*
5  * Copyright (c) 1994, 1995 Jochen Pohl
6  * All Rights Reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *      This product includes software developed by Jochen Pohl for
19  *	The NetBSD Project.
20  * 4. The name of the author may not be used to endorse or promote products
21  *    derived from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #include "lint.h"
36 
37 /*
38  * Types are described by structures of type type_t.
39  */
40 typedef	struct type {
41 	tspec_t	t_tspec;	/* type specifier */
42 	u_int	t_const : 1;	/* constant */
43 	u_int	t_volatile : 1;	/* volatile */
44 	u_int	t_vararg : 1;	/* function has variable number of arguments */
45 	u_int	t_isenum : 1;	/* enum type */
46 	u_int	t_proto : 1;	/* this is a prototype */
47 	u_int	t_istag : 1;	/* tag with _t_tag valid */
48 	u_int	t_istynam : 1;	/* tag with _t_tynam valid */
49 	union {
50 		int	_t_dim;		/* if the type is an ARRAY than this
51 					   is the dimension of the array. */
52 		struct	hte *_t_tag;	/* hash table entry of tag if
53 					   t_isenum, STRUCT or UNION */
54 		struct	hte *_t_tynam;	/* hash table entry of typename if
55 					   t_isenum, STRUCT or UNION */
56 		struct	type **_t_args;	/* list of argument types if this
57 					   is a prototype */
58 	} t_u;
59 	struct	type *t_subt;	/* indirected type (array element, pointed to
60 				   type, type of return value) */
61 } type_t;
62 
63 #define	t_dim	t_u._t_dim
64 #define	t_tag	t_u._t_tag
65 #define t_tynam	t_u._t_tynam
66 #define	t_args	t_u._t_args
67 
68 /*
69  * argument information
70  *
71  * Such a structure is created for each argument of a function call
72  * which is an integer constant or a constant string.
73  */
74 typedef	struct arginf {
75 	int	a_num;		/* # of argument (1..) */
76 	u_int	a_zero : 1;	/* argument is 0 */
77 	u_int	a_pcon : 1;	/* msb of argument is not set */
78 	u_int	a_ncon : 1;	/* msb of argument is set */
79 	u_int	a_fmt : 1;	/* a_fstrg points to format string */
80 	char	*a_fstrg;	/* format string */
81 	struct	arginf *a_nxt;	/* information for next const. argument */
82 } arginf_t;
83 
84 /*
85  * Keeps information about position in source file.
86  */
87 typedef	struct {
88 	u_short	p_src;		/* index of name of translation unit
89 				   (the name which was specified at the
90 				   command line) */
91 	u_short	p_line;		/* line number in p_src */
92 	u_short	p_isrc;		/* index of (included) file */
93 	u_short p_iline;	/* line number in p_iline */
94 } pos_t;
95 
96 /*
97  * Used for definitions and declarations
98  *
99  * To save memory, variable sized structures are used. If
100  * all s_va, s_prfl and s_scfl are not set, the memory allocated
101  * for a symbol is only large enough to keep the first member of
102  * struct sym, s_s.
103  */
104 typedef	struct sym {
105 	struct {
106 		pos_t	s_pos;		/* pos of def./decl. */
107 #ifndef lint
108 		u_int	s_def : 3;	/* DECL, TDEF or DEF */
109 #else
110 		def_t	s_def;
111 #endif
112 		u_int	s_rval : 1;	/* function has return value */
113 		u_int	s_osdef : 1;	/* old style function definition */
114 		u_int	s_static : 1;	/* symbol is static */
115 		u_int	s_va : 1;	/* check only first s_nva arguments */
116 		u_int	s_prfl : 1;	/* printflike */
117 		u_int	s_scfl : 1;	/* scanflike */
118 		u_short	s_type;		/* type */
119 		struct	sym *s_nxt;	/* next symbol with same name */
120 	} s_s;
121 	short	s_nva;
122 	short	s_nprfl;
123 	short	s_nscfl;
124 } sym_t;
125 
126 #define s_pos		s_s.s_pos
127 #define s_rval		s_s.s_rval
128 #define s_osdef		s_s.s_osdef
129 #define s_static	s_s.s_static
130 #define s_def		s_s.s_def
131 #define s_va		s_s.s_va
132 #define s_prfl		s_s.s_prfl
133 #define s_scfl		s_s.s_scfl
134 #define s_type		s_s.s_type
135 #define s_nxt		s_s.s_nxt
136 
137 /*
138  * Used to store informations about function calls.
139  */
140 typedef	struct fcall {
141 	pos_t	f_pos;		/* position of call */
142 	u_int	f_rused : 1;	/* return value used */
143 	u_int	f_rdisc : 1;	/* return value discarded (casted to void) */
144 	u_short	f_type;		/* types of expected return value and args */
145 	arginf_t *f_args;	/* information about constant arguments */
146 	struct	fcall *f_nxt;	/* next call of same function */
147 } fcall_t;
148 
149 /*
150  * Used to store information about usage of symbols other
151  * than for function calls.
152  */
153 typedef	struct usym {
154 	pos_t	u_pos;		/* position */
155 	struct	usym *u_nxt;	/* next usage */
156 } usym_t;
157 
158 /*
159  * hash table entry
160  */
161 typedef	struct hte {
162 	const	char *h_name;	/* name */
163 	u_int	h_used : 1;	/* symbol is used */
164 	u_int	h_def : 1;	/* symbol is defined */
165 	u_int	h_static : 1;	/* static symbol */
166 	sym_t	*h_syms;	/* declarations and definitions */
167 	sym_t	**h_lsym;	/* points to s_nxt of last decl./def. */
168 	fcall_t	*h_calls;	/* function calls */
169 	fcall_t	**h_lcall;	/* points to f_nxt of last call */
170 	usym_t	*h_usyms;	/* usage info */
171 	usym_t	**h_lusym;	/* points to u_nxt of last usage info */
172 	struct	hte *h_link;	/* next hte with same hash function */
173 } hte_t;
174 
175 /* maps type indices into pointers to type structs */
176 #define TP(idx)		(tlst[idx])
177 
178 #include "externs2.h"
179