]> andersk Git - splint.git/blob - src/constraintList.c
Runs on test suite wu-ftpd and bind without crashing or producing obvious errors.
[splint.git] / src / constraintList.c
1 /*
2 ** LCLint - annotation-assisted static program checker
3 ** Copyright (C) 1994-2000 University of Virginia,
4 **         Massachusetts Institute of Technology
5 **
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.
10 ** 
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.
15 ** 
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.
19 **
20 ** For information on lclint: lclint-request@cs.virginia.edu
21 ** To report a bug: lclint-bug@cs.virginia.edu
22 ** For more information: http://lclint.cs.virginia.edu
23 */
24 /*
25 ** constraintList.c
26 **
27 ** based on list_template.c
28 **
29 ** where T has T_equal (or change this) and T_unparse
30 */
31
32 # include "lclintMacros.nf"
33 # include "llbasic.h"
34
35
36 /*@iter constraintList_elements_private (sef constraintList x, yield constraint el); @*/
37 # define constraintList_elements_private(x, m_el) \
38    { int m_ind; constraint *m_elements = &((x)->elements[0]); \
39      for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \
40        { constraint m_el = *(m_elements++); 
41
42 # define end_constraintList_elements_private }}
43
44
45 constraintList constraintList_makeNew ()
46 {
47   constraintList s = (constraintList) dmalloc (sizeof (*s));
48
49   s->nelements = 0;
50   s->nspace = constraintListBASESIZE;
51   s->elements = (constraint *)
52     dmalloc (sizeof (*s->elements) * constraintListBASESIZE);
53
54   return (s);
55 }
56
57 static void
58 constraintList_grow (constraintList s)
59 {
60   int i;
61   constraint *newelements; 
62
63   s->nspace += constraintListBASESIZE;
64   newelements = (constraint *) dmalloc (sizeof (*newelements)
65                                      * (s->nelements + s->nspace));
66
67   for (i = 0; i < s->nelements; i++)
68     {
69       newelements[i] = s->elements[i]; 
70     }
71
72   sfree (s->elements); 
73   s->elements = newelements;
74 }
75
76
77 constraintList 
78 constraintList_add (/*@returned@*/ constraintList s, /*@only@*/ constraint el)
79 {
80   /*drl7x */
81   //   el = constraint_simplify (el);
82   if (resolve (el, s) )
83     {
84       constraint_free (el);
85       return s;
86     }
87   
88   if (s->nspace <= 0)
89     constraintList_grow (s);
90
91   s->nspace--;
92   s->elements[s->nelements] = el;
93   s->nelements++;
94   return s;
95 }
96
97 /* frees everything but actual constraints */
98 /* This function should only be used if you have 
99    other references to unshared constraints 
100 */
101 static void constraintList_freeShallow (/*@only@*/ constraintList c)
102 {
103   if (constraintList_isDefined(c) )
104     {
105       free (c->elements);
106       c->elements = NULL;
107       c->nelements = -1;
108       c->nspace = -1;
109     }
110   free (c);
111   c = NULL;
112 }
113
114 /*@only@*/ constraintList constraintList_addList (/*@returned@*/ constraintList s, /*@observer@*/ constraintList new)
115 {
116   llassert(constraintList_isDefined(s) );
117   llassert(constraintList_isDefined(new) );
118
119   if (new == constraintList_undefined)
120     return s;
121   
122   constraintList_elements (new, elem)
123     {
124     s = constraintList_add (s, constraint_copy(elem) );
125     }
126   end_constraintList_elements;
127
128   return s;
129 }
130
131
132
133 /*@only@*/ constraintList constraintList_addListFree (/*@only@*/ constraintList s, /*@only@*/ constraintList new)
134 {
135   llassert(constraintList_isDefined(s) );
136   llassert(constraintList_isDefined(new) );
137
138   if (new == constraintList_undefined)
139     return s;
140   
141   constraintList_elements_private(new, elem)
142     {
143     s = constraintList_add (s, elem);
144     }
145   end_constraintList_elements_private
146
147     constraintList_freeShallow(new);
148     return s;
149 }
150
151 cstring
152 constraintList_print (constraintList s) /*@*/
153 {
154   int i;
155   cstring st = cstring_undefined;
156   bool first = TRUE;
157
158   if (s->nelements == 0)
159     {
160       st = cstring_makeLiteral("<List Empty>");
161       return st;
162     }
163
164   for (i = 0; i < s->nelements; i++)
165     {
166       cstring type = cstring_undefined;
167       constraint current = s->elements[i];
168
169       if (current != NULL)
170         {
171           cstring temp1;
172             if ( context_getFlag (FLG_ORCONSTRAINT) )
173               temp1 = constraint_printOr(current);
174             else
175               temp1 = constraint_print(current);
176           type = message ("%q %q\n", type, temp1 );
177         }
178
179       if (first)
180         {
181           st = type;
182           first = FALSE;
183         }
184       else
185         {
186           st = message ("%q, %q", st, type);
187         }
188     } //end for
189
190   return st;
191 }
192
193 void constraintList_printError (constraintList s, fileloc loc)
194 {
195
196   constraintList_elements (s, elem)
197     {
198       if (elem != NULL)
199         {
200           constraint_printError (elem, loc);
201         }
202     }
203   end_constraintList_elements;
204   return;
205 }
206
207 cstring
208 constraintList_printDetailed (constraintList s)
209 {
210   int i;
211   cstring st = cstring_undefined;
212   bool first = TRUE;
213
214   if (s->nelements == 0)
215     {
216       st = cstring_makeLiteral("<List Empty>");
217       return st;
218     }
219
220   for (i = 0; i < s->nelements; i++)
221     {
222       cstring type = cstring_undefined;
223       constraint current = s->elements[i];
224
225       if (current != NULL)
226         {
227           cstring temp1 = constraint_printDetailed (current);
228           type = message ("%s %s\n", type, temp1 );
229           cstring_free(temp1);
230         }
231
232       if (first)
233         {
234           st = type;
235           first = FALSE;
236         }
237       else
238         {
239           st = message ("%s %s", st, type);
240         }
241     }
242   return st;
243 }
244
245 /*{ x: constraint | (x in l1 -> resolve (x, l2) || (x in l2 -> resolve (x, l1)
246 } */
247
248 constraintList
249 constraintList_logicalOr (/*@observer@*/ constraintList l1, /*@observer@*/ constraintList l2)
250 {
251   constraint temp;
252   constraintList ret;
253   DPRINTF ( (message ("Logical or on %s and %s",
254                       constraintList_print(l1), 
255                       constraintList_print(l2)) ) );
256   
257   ret = constraintList_makeNew();
258   constraintList_elements (l1, el)
259     {
260       temp = substitute (el, l2);
261       
262       if (resolve (el, l2) || resolve(temp,l2) )
263         {   /*avoid redundant constraints*/
264           if (!resolve (el, ret) )
265             {
266               constraint temp2;
267               temp2 = constraint_copy(el);
268               ret = constraintList_add (ret, temp2);
269             }
270         }
271       constraint_free(temp);
272     }
273   end_constraintList_elements;
274
275    constraintList_elements (l2, el)
276     {
277       temp = substitute (el, l1);
278       
279       if (resolve (el, l1) || resolve(temp,l1) )
280         {
281           /*avoid redundant constraints*/
282           if (!resolve (el, ret) )
283             {
284               constraint temp2;
285               temp2 = constraint_copy(el);
286               ret = constraintList_add (ret, temp2);
287             }
288         }
289       constraint_free(temp);
290     }
291   end_constraintList_elements;
292
293   
294   return ret;
295 }
296
297 void
298 constraintList_free (/*@only@*/ constraintList s)
299 {
300   int i;
301
302   llassert(constraintList_isDefined(s) );
303
304   
305   for (i = 0; i < s->nelements; i++)
306     {
307       constraint_free (s->elements[i]); 
308     }
309
310   sfree (s->elements);
311   s->elements = NULL;
312   s->nelements = -1;
313   s->nspace = -1;
314   sfree (s);
315   s = NULL;
316 }
317
318 constraintList
319 constraintList_copy (constraintList s)
320 {
321   constraintList ret = constraintList_makeNew ();
322
323   constraintList_elements (s, el)
324     {
325       ret = constraintList_add (ret, constraint_copy (el));
326     } end_constraintList_elements;
327
328   return ret;
329 }
330
331 constraintList constraintList_preserveOrig (constraintList c)
332 {
333   DPRINTF((message("constraintList_preserveOrig preserving the originial constraints for %s ", constraintList_print (c) ) ));
334
335   constraintList_elements_private (c, el)
336   {
337     el = constraint_preserveOrig (el);
338   }
339   end_constraintList_elements_private;
340   return c;
341 }
342
343 constraintList constraintList_preserveCallInfo (/*@returned@*/ constraintList c, exprNode fcn)
344 {
345   DPRINTF((message("constraintList_preserveOrig preserving the originial constraints for %s ", constraintList_print (c) ) ));
346
347   constraintList_elements_private (c, el)
348   {
349     //  el = constraint_preserveOrig (el);
350     el = constraint_setFcnPre(el);
351     el = constraint_origAddGeneratingExpr (el, fcn);
352   }
353   end_constraintList_elements_private;
354   return c;
355 }
356
357
358
359 constraintList constraintList_addGeneratingExpr (constraintList c, exprNode e)
360 {
361   DPRINTF ((message ("entering constraintList_addGeneratingExpr for %s ", exprNode_unparse(e) ) ));
362   
363   constraintList_elements_private (c, el)
364   {
365     DPRINTF ((message ("setting generatingExpr for %s to %s", constraint_print(el), exprNode_unparse(e) )  ));
366     el = constraint_addGeneratingExpr (el, e);
367   }
368   end_constraintList_elements_private;
369   return c;
370 }
371
372 /*@only@*/ constraintList constraintList_doFixResult (/*@only@*/constraintList postconditions, exprNode fcnCall)
373 {
374   constraintList ret;
375   ret = constraintList_makeNew();
376   constraintList_elements_private (postconditions, el)
377     {
378       ret = constraintList_add (ret, constraint_doFixResult (el, fcnCall) );
379     }
380   end_constraintList_elements_private;
381
382   constraintList_free(postconditions);
383   return ret;
384 }
385
386 /*@only@*/ constraintList constraintList_doSRefFixConstraintParam (constraintList preconditions, exprNodeList arglist)
387 {
388   constraintList ret;
389   ret = constraintList_makeNew();
390
391   constraintList_elements (preconditions, el)
392     {
393       ret = constraintList_add(ret, constraint_doSRefFixConstraintParam (el, arglist) );
394     }
395   end_constraintList_elements;
396
397   constraintList_free (preconditions);
398
399   return ret;
400 }
401 constraintList constraintList_doSRefFixBaseParam (/*@observer@*/ constraintList preconditions, /*@observer@*/
402                                                    exprNodeList arglist)
403 {
404   constraintList ret;
405   constraint temp;
406   ret = constraintList_makeNew();
407
408   constraintList_elements (preconditions, el)
409     {
410       temp = constraint_copy(el);
411       ret = constraintList_add(ret, constraint_doSRefFixBaseParam (temp, arglist) );
412     }
413   end_constraintList_elements;
414
415   return ret;
416 }
417
418 constraintList constraintList_togglePost (/*@returned@*/ constraintList c)
419 {
420   constraintList_elements_private (c, el)
421     {
422       el = constraint_togglePost(el);
423       if (el->orig)
424         {
425           el->orig = constraint_togglePost(el->orig);
426         }
427     }
428   end_constraintList_elements_private;
429   return c;
430 }
431
432
This page took 0.877039 seconds and 5 git commands to generate.