Home | History | Annotate | Line # | Download | only in lint2
      1 /* $NetBSD: lint2.h,v 1.30 2025/05/24 07:38:59 rillig Exp $ */
      2 
      3 /*
      4  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
      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 struct lint2_type {
     38 	tspec_t	t_tspec;	/* type specifier */
     39 	bool	t_const:1;
     40 	bool	t_volatile:1;
     41 	bool	t_vararg:1;	/* function has variable number of arguments */
     42 	bool	t_is_enum:1;
     43 	bool	t_proto:1;	/* function is a prototype */
     44 	bool	t_istag:1;	/* tag with _t_tag valid */
     45 	bool	t_istynam:1;	/* tag with _t_tynam valid */
     46 	bool	t_isuniqpos:1;	/* tag with _t_uniqpos valid */
     47 	union {
     48 		int	_t_dim;		/* if the type is an ARRAY, this
     49 					 * is the dimension of the array. */
     50 		struct hte *_t_tag;	/* hash table entry of tag if
     51 					 * t_is_enum, STRUCT or UNION */
     52 		struct hte *_t_tynam;	/* hash table entry of typename if
     53 					 * t_is_enum, STRUCT or UNION */
     54 		struct {
     55 			int p_line;
     56 			short p_file;
     57 			int p_uniq;
     58 		} _t_uniqpos;		/* unique position, for untagged
     59 					 * untyped STRUCTs, UNIONS, and ENUMs,
     60 					 * if t_isuniqpos */
     61 		const struct lint2_type **_t_args; /* list of argument types if
     62 					 * this is a prototype */
     63 	} t_u;
     64 	struct lint2_type *t_subt;	/*- element type (if ARRAY),
     65 					 * return type (if FUNC),
     66 					 * target type (if PTR) */
     67 };
     68 
     69 #define	t_dim		t_u._t_dim
     70 #define	t_tag		t_u._t_tag
     71 #define	t_tynam		t_u._t_tynam
     72 #define	t_uniqpos	t_u._t_uniqpos
     73 #define	t_args		t_u._t_args
     74 
     75 /*
     76  * argument information
     77  *
     78  * Such a structure is created for each argument of a function call
     79  * which is an integer constant or a constant string.
     80  */
     81 typedef struct arginf {
     82 	int	a_num;		/* # of argument (1..) */
     83 	bool	a_zero:1;	/* argument is 0 */
     84 	bool	a_pcon:1;	/* msb of argument is not set */
     85 	bool	a_ncon:1;	/* msb of argument is set */
     86 	bool	a_fmt:1;	/* a_fstrg points to format string */
     87 	char	*a_fstrg;	/* format string */
     88 	struct arginf *a_next;	/* information for next const. argument */
     89 } arginf_t;
     90 
     91 /*
     92  * Keeps information about position in source file.
     93  */
     94 typedef struct {
     95 	unsigned short p_src;	/* index of name of translation unit (the name
     96 				 * which was specified at the command line) */
     97 	unsigned short p_line;	/* line number in p_src */
     98 	unsigned short p_isrc;	/* index of (included) file */
     99 	unsigned short p_iline;	/* line number in p_iline */
    100 } pos_t;
    101 
    102 /* Used for definitions and declarations. */
    103 typedef struct sym {
    104 	struct {
    105 		pos_t	s_pos;		/* pos of def./decl. */
    106 #if !defined(lint) && !defined(DEBUG)
    107 		unsigned char s_def;	/* DECL, TDEF or DEF */
    108 #else
    109 		def_t	s_def;
    110 #endif
    111 		bool	s_function_has_return_value:1;
    112 		bool	s_inline:1;
    113 		bool	s_old_style_function:1;
    114 		bool	s_static:1;
    115 		bool	s_check_only_first_args:1;
    116 		bool	s_printflike:1;
    117 		bool	s_scanflike:1;
    118 		unsigned short s_type;
    119 		struct sym *s_next;	/* next symbol with same name */
    120 	} s_s;
    121 	/*
    122 	 * To save memory, the remaining members are only allocated if one of
    123 	 * s_check_only_first_args, s_printflike and s_scanflike is set.
    124 	 */
    125 	short	s_check_num_args;	/* if s_check_only_first_args */
    126 	short	s_printflike_arg;	/* if s_printflike */
    127 	short	s_scanflike_arg;	/* if s_scanflike */
    128 } sym_t;
    129 
    130 #define s_pos		s_s.s_pos
    131 #define s_function_has_return_value s_s.s_function_has_return_value
    132 #define s_old_style_function s_s.s_old_style_function
    133 #define s_inline	s_s.s_inline
    134 #define s_static	s_s.s_static
    135 #define s_def		s_s.s_def
    136 #define s_check_only_first_args	s_s.s_check_only_first_args
    137 #define s_printflike	s_s.s_printflike
    138 #define s_scanflike	s_s.s_scanflike
    139 #define s_type		s_s.s_type
    140 #define s_next		s_s.s_next
    141 
    142 /*
    143  * Used to store information about function calls.
    144  */
    145 typedef struct fcall {
    146 	pos_t	f_pos;		/* position of call */
    147 	bool	f_rused:1;	/* return value used */
    148 	bool	f_rdisc:1;	/* return value discarded (casted to void) */
    149 	unsigned short f_type;	/* types of expected return value and args */
    150 	arginf_t *f_args;	/* information about constant arguments */
    151 	struct fcall *f_next;	/* next call of same function */
    152 } fcall_t;
    153 
    154 /*
    155  * Used to store information about usage of symbols other
    156  * than for function calls.
    157  */
    158 typedef struct usym {
    159 	pos_t	u_pos;		/* position */
    160 	struct usym *u_next;	/* next usage */
    161 } usym_t;
    162 
    163 /*
    164  * hash table entry
    165  */
    166 typedef struct hte {
    167 	const char *h_name;	/* name */
    168 	bool	h_used:1;	/* symbol is used */
    169 	bool	h_def:1;	/* symbol is defined */
    170 	bool	h_static:1;	/* static symbol */
    171 	sym_t	*h_syms;	/* declarations and definitions */
    172 	sym_t	**h_lsym;	/* points to s_next of last decl./def. */
    173 	fcall_t	*h_calls;	/* function calls */
    174 	fcall_t	**h_lcall;	/* points to f_next of last call */
    175 	usym_t	*h_usyms;	/* usage info */
    176 	usym_t	**h_lusym;	/* points to u_next of last usage info */
    177 	struct hte *h_link;	/* next hte with same hash function */
    178 	struct hte *h_hte;	/* pointer to other htes (for renames) */
    179 } hte_t;
    180 
    181 #include "externs2.h"
    182 
    183 /* maps type indices into pointers to type structs */
    184 static inline type_t *
    185 TP(unsigned short type_id)
    186 {
    187 	/* force sequence point for newly parsed type_id */
    188 	return tlst[type_id];
    189 }
    190