2 ** Splint - annotation-assisted static program checker
3 ** Copyright (C) 1994-2003 University of Virginia,
4 ** Massachusetts Institute of Technology
6 ** This program is free software; you can redistribute it and/or modify it
7 ** under the terms of the GNU General Public License as published by the
8 ** Free Software Foundation; either version 2 of the License, or (at your
9 ** option) any later version.
11 ** This program is distributed in the hope that it will be useful, but
12 ** WITHOUT ANY WARRANTY; without even the implied warranty of
13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ** General Public License for more details.
16 ** The GNU General Public License is available from http://www.gnu.org/ or
17 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18 ** MA 02111-1307, USA.
20 ** For information on splint: info@splint.org
21 ** To report a bug: splint-bug@splint.org
22 ** For more information: http://www.splint.org
27 ** Qualified types: a type qualifier list, and a ctype.
31 # include "splintMacros.nf"
34 /*@notnull@*/ qtype
qtype_create (ctype c
)
36 qtype q
= (qtype
) dmalloc (sizeof (*q
));
39 q
->quals
= qualList_new ();
43 void qtype_free (/*@only@*/ qtype q
)
45 if (qtype_isDefined (q
))
47 qualList_free (q
->quals
);
52 qtype
qtype_unknown (void)
54 return (qtype_create (ctype_unknown
));
57 qtype
qtype_addQual (qtype qt
, qual q
)
59 DPRINTF (("Add qual: %s / %s", qtype_unparse (qt
), qual_unparse (q
)));
61 if (qtype_isDefined (qt
))
63 qt
->quals
= qualList_add (qt
->quals
, q
);
66 DPRINTF (("==> %s", qtype_unparse (qt
)));
70 qtype
qtype_addQualList (/*@returned@*/ qtype qt
, qualList ql
)
72 if (qtype_isDefined (qt
))
74 qt
->quals
= qualList_appendList (qt
->quals
, ql
);
80 static void checkAltQuals (qtype q
)
82 if (qtype_isDefined (q
))
84 qualList badQuals
= qualList_undefined
;
86 qualList_elements (q
->quals
, qu
)
88 if (!qual_isCQual (qu
) && !qual_isImplied (qu
))
90 badQuals
= qualList_add (badQuals
, qu
);
92 } end_qualList_elements
;
94 if (!qualList_isEmpty (badQuals
))
96 voptgenerror (FLG_SYNTAX
,
98 ("Alternate type cannot use annotations %q: %q",
99 qualList_unparse (badQuals
),
106 qtype
qtype_mergeImplicitAlt (/*@returned@*/ qtype q1
, /*@only@*/ qtype q2
)
108 if (qtype_isDefined (q1
) && qtype_isDefined (q2
))
110 q1
->type
= ctype_makeConj (q1
->type
, q2
->type
);
112 if (!qualList_isEmpty (q2
->quals
))
122 qtype
qtype_mergeAlt (/*@returned@*/ qtype q1
, /*@only@*/ qtype q2
)
124 DPRINTF (("Merge alt: %s + %s", qtype_unparse (q1
), qtype_unparse (q2
)));
126 if (qtype_isDefined (q1
) && qtype_isDefined (q2
))
128 if (context_getFlag (FLG_IMPCONJ
))
130 q1
->type
= ctype_makeConj (q1
->type
, q2
->type
);
134 q1
->type
= ctype_makeExplicitConj (q1
->type
, q2
->type
);
137 if (!qualList_isEmpty (q2
->quals
))
147 qtype
qtype_combine (/*@returned@*/ qtype q1
, ctype ct
)
149 DPRINTF (("Combine: %s %s", qtype_unparse (q1
), ctype_unparse (ct
)));
150 if (qtype_isDefined (q1
))
152 /* ct is modifier (or q1->type is unknown) */
153 q1
->type
= ctype_combine (q1
->type
, ct
);
156 DPRINTF (("Combine: %s %s", qtype_unparse (q1
), ctype_unparse (ct
)));
160 qtype
qtype_resolve (/*@returned@*/ qtype q
)
162 if (qtype_isDefined (q
))
164 DPRINTF (("Resolving: %s", qtype_unparse (q
)));
165 q
->type
= ctype_resolve (q
->type
);
166 DPRINTF (("Resolving: %s", qtype_unparse (q
)));
172 cstring
qtype_unparse (qtype q
)
174 if (qtype_isDefined (q
))
176 return (message ("%q%s", qualList_unparse (q
->quals
),
177 ctype_unparse (q
->type
)));
181 return (cstring_makeLiteral ("<undefined>"));
185 qtype
qtype_newBase (/*@returned@*/ qtype q
, ctype ct
)
187 if (qtype_isDefined (q
))
189 DPRINTF (("new base: %s -> %s", qtype_unparse (q
), ctype_unparse (ct
)));
190 q
->type
= ctype_newBase (ct
, q
->type
);
191 DPRINTF (("new base: %s -> %s", qtype_unparse (q
), ctype_unparse (ct
)));
197 qtype
qtype_newQbase (qtype q1
, qtype q2
)
199 if (qtype_isDefined (q1
) && qtype_isDefined (q2
))
201 q1
->type
= ctype_newBase (q1
->type
, q2
->type
);
202 q1
->quals
= qualList_appendList (q1
->quals
, q2
->quals
);
205 DPRINTF (("new base: %s -> %s", qtype_unparse (q1
), qtype_unparse (q1
)));
209 void qtype_adjustPointers (pointers n
, qtype q
)
211 if (qtype_isDefined (q
))
213 DPRINTF (("Pointers: %s %s", pointers_unparse (n
), qtype_unparse (q
)));
214 q
->type
= ctype_adjustPointers (n
, q
->type
);
220 qtype
qtype_copy (qtype q
)
222 if (qtype_isDefined (q
))
224 qtype r
= qtype_create (q
->type
);
226 qualList_free (r
->quals
);
227 r
->quals
= qualList_copy (q
->quals
);
232 return qtype_undefined
;