]> andersk Git - splint.git/blame - src/constraintList.c
*** empty log message ***
[splint.git] / src / constraintList.c
CommitLineData
616915dd 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
d46ce6a4 35
28bf4b0b 36/*@iter constraintList_elements_private_only (sef constraintList x, yield only constraint el); @*/
37# define constraintList_elements_private_only(x, m_el) \
60eced23 38 { if (constraintList_isDefined (x)) { int m_ind; constraint *m_elements = &((x)->elements[0]); \
28bf4b0b 39 for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \
40 { constraint m_el = *(m_elements++);
41
60eced23 42# define end_constraintList_elements_private_only }}}
28bf4b0b 43
44
60eced23 45/*@iter constraintList_elements_private (sef constraintList x, yield constraint el); @*/
d46ce6a4 46# define constraintList_elements_private(x, m_el) \
60eced23 47 { if (constraintList_isDefined (x)) { int m_ind; constraint *m_elements = &((x)->elements[0]); \
d46ce6a4 48 for (m_ind = 0 ; m_ind < (x)->nelements; m_ind++) \
49 { constraint m_el = *(m_elements++);
50
60eced23 51# define end_constraintList_elements_private }}}
d46ce6a4 52
53
03d670b6 54/*@only@*/ constraintList constraintList_makeNew ()
616915dd 55{
56 constraintList s = (constraintList) dmalloc (sizeof (*s));
57
58 s->nelements = 0;
59 s->nspace = constraintListBASESIZE;
60 s->elements = (constraint *)
61 dmalloc (sizeof (*s->elements) * constraintListBASESIZE);
62
63 return (s);
64}
65
66static void
67constraintList_grow (constraintList s)
68{
69 int i;
70 constraint *newelements;
71
60eced23 72 llassert (constraintList_isDefined (s));
73
616915dd 74 s->nspace += constraintListBASESIZE;
75 newelements = (constraint *) dmalloc (sizeof (*newelements)
76 * (s->nelements + s->nspace));
77
78 for (i = 0; i < s->nelements; i++)
79 {
80 newelements[i] = s->elements[i];
81 }
82
83 sfree (s->elements);
84 s->elements = newelements;
85}
86
c3e695ff 87
616915dd 88constraintList
bb25bea6 89constraintList_add (/*@returned@*/ constraintList s, /*@only@*/ constraint el)
616915dd 90{
60eced23 91 llassert (constraintList_isDefined (s));
92
c3e695ff 93 /*drl7x */
94 // el = constraint_simplify (el);
28bf4b0b 95 if (constraintList_resolve (el, s) )
d46ce6a4 96 {
97 constraint_free (el);
98 return s;
99 }
616915dd 100
101 if (s->nspace <= 0)
102 constraintList_grow (s);
103
104 s->nspace--;
105 s->elements[s->nelements] = el;
106 s->nelements++;
107 return s;
108}
109
d46ce6a4 110/* frees everything but actual constraints */
111/* This function should only be used if you have
112 other references to unshared constraints
113*/
114static void constraintList_freeShallow (/*@only@*/ constraintList c)
115{
116 if (constraintList_isDefined(c) )
bb25bea6 117 {
118 free (c->elements);
119 c->elements = NULL;
120 c->nelements = -1;
121 c->nspace = -1;
122 }
d46ce6a4 123 free (c);
bb25bea6 124 c = NULL;
125}
126
28bf4b0b 127/*@only@*/ constraintList constraintList_addList (/*@only@*/ /*@returned@*/ constraintList s, /*@observer@*/ constraintList newList)
bb25bea6 128{
129 llassert(constraintList_isDefined(s) );
28bf4b0b 130 llassert(constraintList_isDefined(newList) );
bb25bea6 131
28bf4b0b 132 if (newList == constraintList_undefined)
bb25bea6 133 return s;
134
28bf4b0b 135 constraintList_elements (newList, elem)
bb25bea6 136 {
137 s = constraintList_add (s, constraint_copy(elem) );
138 }
139 end_constraintList_elements;
140
141 return s;
d46ce6a4 142}
143
28bf4b0b 144constraintList constraintList_addListFree (/*@returned@*/ constraintList s, /*@only@*/ constraintList newList)
616915dd 145{
84c9ffbf 146 llassert(constraintList_isDefined(s) );
28bf4b0b 147 llassert(constraintList_isDefined(newList) );
616915dd 148
28bf4b0b 149 if (constraintList_isUndefined(newList) )
616915dd 150 return s;
151
28bf4b0b 152 constraintList_elements_private_only(newList, elem)
616915dd 153 {
154 s = constraintList_add (s, elem);
155 }
28bf4b0b 156 end_constraintList_elements_private_only
d46ce6a4 157
28bf4b0b 158 constraintList_freeShallow(newList);
616915dd 159 return s;
160}
161
920a3797 162
163extern /*@only@*/ cstring constraintList_unparse ( /*@observer@*/ constraintList s) /*@*/
164{
165 return (constraintList_print(s));
920a3797 166}
167
168
f4ec8018 169
170static /*@only@*/ cstring
171constraintList_printLocation (/*@temp@*/ constraintList s) /*@*/
172{
173 int i;
174 cstring st = cstring_undefined;
175 bool first = TRUE;
176
177 if (!constraintList_isDefined (s))
178 {
179 return cstring_makeLiteral ("<undefined>");
180 }
181
182 if (s->nelements == 0)
183 {
184 st = cstring_makeLiteral("<List Empty>");
185 return st;
186 }
187
188 for (i = 0; i < s->nelements; i++)
189 {
190 cstring type = cstring_undefined;
191 constraint current = s->elements[i];
192
193 if (constraint_isDefined(current) )
194 {
195 cstring temp1;
196 temp1 = constraint_printLocation(current);
197 type = message ("%q %q\n", type, temp1 );
198 }
199
200 if (first)
201 {
202 st = type;
203 first = FALSE;
204 }
205 else
206 {
207 st = message ("%q, %q", st, type);
208 }
209 } //end for
210
211 return st;
212}
213
214
920a3797 215/*@only@*/ cstring
28bf4b0b 216constraintList_print (/*@temp@*/ constraintList s) /*@*/
616915dd 217{
218 int i;
219 cstring st = cstring_undefined;
220 bool first = TRUE;
60eced23 221
222 if (!constraintList_isDefined (s))
223 {
224 return cstring_makeLiteral ("<undefined>");
225 }
616915dd 226
227 if (s->nelements == 0)
d46ce6a4 228 {
229 st = cstring_makeLiteral("<List Empty>");
230 return st;
231 }
232
616915dd 233 for (i = 0; i < s->nelements; i++)
234 {
235 cstring type = cstring_undefined;
236 constraint current = s->elements[i];
237
28bf4b0b 238 if (constraint_isDefined(current) )
616915dd 239 {
90bc41f7 240 cstring temp1;
241 if ( context_getFlag (FLG_ORCONSTRAINT) )
242 temp1 = constraint_printOr(current);
243 else
244 temp1 = constraint_print(current);
616915dd 245 type = message ("%q %q\n", type, temp1 );
246 }
247
248 if (first)
249 {
250 st = type;
251 first = FALSE;
252 }
253 else
254 {
255 st = message ("%q, %q", st, type);
256 }
d46ce6a4 257 } //end for
258
616915dd 259 return st;
260}
261
8f299805 262void constraintList_printErrorPostConditions (constraintList s, fileloc loc)
263{
264
265 constraintList_elements (s, elem)
266 {
28bf4b0b 267 if (constraint_isDefined(elem))
8f299805 268 {
269 constraint_printErrorPostCondition (elem, loc);
270 }
271 }
272 end_constraintList_elements;
273 return;
274}
275
616915dd 276void constraintList_printError (constraintList s, fileloc loc)
277{
278
bb25bea6 279 constraintList_elements (s, elem)
616915dd 280 {
28bf4b0b 281 if (constraint_isDefined(elem) )
616915dd 282 {
84380658 283 if (constraint_isPost(elem) )
284 constraint_printErrorPostCondition (elem, loc);
285 else
286 constraint_printError (elem, loc);
616915dd 287 }
288 }
bb25bea6 289 end_constraintList_elements;
616915dd 290 return;
291}
292
8f299805 293
616915dd 294cstring
295constraintList_printDetailed (constraintList s)
296{
297 int i;
298 cstring st = cstring_undefined;
299 bool first = TRUE;
300
60eced23 301 if (!constraintList_isDefined (s))
302 {
303 return cstring_makeLiteral ("<undefined>");
304 }
305
616915dd 306 if (s->nelements == 0)
d46ce6a4 307 {
308 st = cstring_makeLiteral("<List Empty>");
309 return st;
310 }
311
616915dd 312 for (i = 0; i < s->nelements; i++)
313 {
314 cstring type = cstring_undefined;
315 constraint current = s->elements[i];
316
28bf4b0b 317 if (constraint_isDefined(current ) )
616915dd 318 {
319 cstring temp1 = constraint_printDetailed (current);
320 type = message ("%s %s\n", type, temp1 );
d46ce6a4 321 cstring_free(temp1);
616915dd 322 }
323
324 if (first)
325 {
326 st = type;
327 first = FALSE;
920a3797 328 type = NULL;
616915dd 329 }
330 else
331 {
920a3797 332 st = message ("%q %q", st, type);
616915dd 333 }
334 }
335 return st;
336}
337
338/*{ x: constraint | (x in l1 -> resolve (x, l2) || (x in l2 -> resolve (x, l1)
339} */
340
341constraintList
bb25bea6 342constraintList_logicalOr (/*@observer@*/ constraintList l1, /*@observer@*/ constraintList l2)
616915dd 343{
344 constraint temp;
345 constraintList ret;
bb25bea6 346 DPRINTF ( (message ("Logical or on %s and %s",
616915dd 347 constraintList_print(l1),
348 constraintList_print(l2)) ) );
349
c3e695ff 350 ret = constraintList_makeNew();
bb25bea6 351 constraintList_elements (l1, el)
616915dd 352 {
28bf4b0b 353 temp = constraint_substitute (el, l2);
616915dd 354
28bf4b0b 355 if (constraintList_resolve (el, l2) || constraintList_resolve(temp,l2) )
616915dd 356 { /*avoid redundant constraints*/
28bf4b0b 357 if (!constraintList_resolve (el, ret) )
bb25bea6 358 {
359 constraint temp2;
360 temp2 = constraint_copy(el);
361 ret = constraintList_add (ret, temp2);
362 }
616915dd 363 }
d46ce6a4 364 constraint_free(temp);
616915dd 365 }
bb25bea6 366 end_constraintList_elements;
616915dd 367
bb25bea6 368 constraintList_elements (l2, el)
616915dd 369 {
28bf4b0b 370 temp = constraint_substitute (el, l1);
616915dd 371
28bf4b0b 372 if (constraintList_resolve (el, l1) || constraintList_resolve(temp,l1) )
616915dd 373 {
374 /*avoid redundant constraints*/
28bf4b0b 375 if (!constraintList_resolve (el, ret) )
bb25bea6 376 {
377 constraint temp2;
378 temp2 = constraint_copy(el);
379 ret = constraintList_add (ret, temp2);
380 }
616915dd 381 }
d46ce6a4 382 constraint_free(temp);
616915dd 383 }
bb25bea6 384 end_constraintList_elements;
616915dd 385
386
387 return ret;
388}
389
390void
bb25bea6 391constraintList_free (/*@only@*/ constraintList s)
616915dd 392{
393 int i;
bb25bea6 394
395 llassert(constraintList_isDefined(s) );
396
397
616915dd 398 for (i = 0; i < s->nelements; i++)
399 {
bb25bea6 400 constraint_free (s->elements[i]);
616915dd 401 }
402
403 sfree (s->elements);
bb25bea6 404 s->elements = NULL;
405 s->nelements = -1;
406 s->nspace = -1;
616915dd 407 sfree (s);
bb25bea6 408 s = NULL;
616915dd 409}
410
411constraintList
03d670b6 412constraintList_copy (/*@observer@*/ /*@temp@*/ constraintList s)
616915dd 413{
c3e695ff 414 constraintList ret = constraintList_makeNew ();
616915dd 415
bb25bea6 416 constraintList_elements (s, el)
616915dd 417 {
418 ret = constraintList_add (ret, constraint_copy (el));
bb25bea6 419 } end_constraintList_elements;
616915dd 420
421 return ret;
422}
423
424constraintList constraintList_preserveOrig (constraintList c)
425{
d46ce6a4 426 DPRINTF((message("constraintList_preserveOrig preserving the originial constraints for %s ", constraintList_print (c) ) ));
427
428 constraintList_elements_private (c, el)
616915dd 429 {
430 el = constraint_preserveOrig (el);
431 }
d46ce6a4 432 end_constraintList_elements_private;
616915dd 433 return c;
434}
435
03d670b6 436constraintList constraintList_preserveCallInfo (/*@returned@*/ constraintList c,/*@observer@*/ /*@dependent@*/ /*@observer@*/ exprNode fcn)
4ab867d6 437{
dc7f6a51 438 DPRINTF((message("constraintList_preserveCallInfo %s ", constraintList_print (c) ) ));
4ab867d6 439
440 constraintList_elements_private (c, el)
441 {
442 // el = constraint_preserveOrig (el);
443 el = constraint_setFcnPre(el);
444 el = constraint_origAddGeneratingExpr (el, fcn);
445 }
446 end_constraintList_elements_private;
447 return c;
448}
449
3814599d 450constraintList constraintList_single (constraint c)
451{
452 constraintList res;
453 res = constraintList_makeNew();
454 res = constraintList_add (res, c);
455 return res;
456}
4ab867d6 457
28bf4b0b 458constraintList constraintList_addGeneratingExpr (constraintList c,/*@dependent@*/ exprNode e)
9280addf 459{
460 DPRINTF ((message ("entering constraintList_addGeneratingExpr for %s ", exprNode_unparse(e) ) ));
461
d46ce6a4 462 constraintList_elements_private (c, el)
9280addf 463 {
464 DPRINTF ((message ("setting generatingExpr for %s to %s", constraint_print(el), exprNode_unparse(e) ) ));
465 el = constraint_addGeneratingExpr (el, e);
466 }
d46ce6a4 467 end_constraintList_elements_private;
9280addf 468 return c;
469}
470
d46ce6a4 471/*@only@*/ constraintList constraintList_doFixResult (/*@only@*/constraintList postconditions, exprNode fcnCall)
616915dd 472{
473 constraintList ret;
c3e695ff 474 ret = constraintList_makeNew();
d46ce6a4 475 constraintList_elements_private (postconditions, el)
616915dd 476 {
477 ret = constraintList_add (ret, constraint_doFixResult (el, fcnCall) );
478 }
d46ce6a4 479 end_constraintList_elements_private;
616915dd 480
d46ce6a4 481 constraintList_free(postconditions);
616915dd 482 return ret;
483}
484
28bf4b0b 485/*@only@*/ constraintList constraintList_doSRefFixConstraintParam (constraintList preconditions, /*@temp@*/ /*@observer@*/ exprNodeList arglist)
616915dd 486{
487 constraintList ret;
c3e695ff 488 ret = constraintList_makeNew();
616915dd 489
bb25bea6 490 constraintList_elements (preconditions, el)
616915dd 491 {
492 ret = constraintList_add(ret, constraint_doSRefFixConstraintParam (el, arglist) );
493 }
bb25bea6 494 end_constraintList_elements;
d46ce6a4 495
496 constraintList_free (preconditions);
616915dd 497
498 return ret;
499}
28bf4b0b 500constraintList constraintList_doSRefFixBaseParam (constraintList preconditions, /*@observer@*/
616915dd 501 exprNodeList arglist)
502{
503 constraintList ret;
bb25bea6 504 constraint temp;
c3e695ff 505 ret = constraintList_makeNew();
616915dd 506
bb25bea6 507 constraintList_elements (preconditions, el)
616915dd 508 {
bb25bea6 509 temp = constraint_copy(el);
510 ret = constraintList_add(ret, constraint_doSRefFixBaseParam (temp, arglist) );
616915dd 511 }
bb25bea6 512 end_constraintList_elements;
616915dd 513
514 return ret;
515}
516
517constraintList constraintList_togglePost (/*@returned@*/ constraintList c)
518{
d46ce6a4 519 constraintList_elements_private (c, el)
616915dd 520 {
84c9ffbf 521 el = constraint_togglePost(el);
2934b455 522 if (constraint_hasOrig(el) )
4ab867d6 523 {
2934b455 524 el = constraint_togglePostOrig (el);
4ab867d6 525 }
616915dd 526 }
d46ce6a4 527 end_constraintList_elements_private;
616915dd 528 return c;
529}
530
920a3797 531/*@only@*/ constraintList constraintList_undump (FILE *f)
532{
533 constraintList ret;
534 char *s = mstring_create (MAX_DUMP_LINE_LENGTH);
535 char *os;
536
537 ret = constraintList_makeNew();
538
539 os = s;
540 s = fgets (os, MAX_DUMP_LINE_LENGTH, f);
541
542 while (s != NULL && *s != ';')
543 {
544 constraint temp;
545 char * c;
546
28bf4b0b 547 c = reader_getWord(&s);
920a3797 548
549 if (strcmp (c, "C") != 0)
550 {
551 llfatalbug(message("Error reading library. File may be corrupted"));
552 }
553
554 temp = constraint_undump (f);
555 ret = constraintList_add (ret, temp);
556 s = fgets (os, MAX_DUMP_LINE_LENGTH, f);
557 free(c);
558 }
559 free(s);
560
561 return ret;
562}
563
564
565void constraintList_dump (/*@observer@*/ constraintList c, FILE *f)
566{
567 constraintList_elements (c, el)
568 {
569 fprintf(f, "C\n");
570 constraint_dump (el, f);
571 }
572 end_constraintList_elements; ;
573}
574
616915dd 575
02984642 576constraintList constraintList_sort (/*@returned@*/ constraintList ret)
577{
f4ec8018 578
579 DPRINTF(( message("Before constraint_sort %q", constraintList_printLocation(ret) ) ));
580
02984642 581 qsort (ret->elements, (size_t) ret->nelements,
582 (sizeof (*ret->elements) ), constraint_compare);
f4ec8018 583
584 DPRINTF((message("After constraint_sort %q", constraintList_printLocation(ret) ) ));
585
586 DPRINTF((message("onstraint_sort returning") ));
02984642 587 return ret;
588}
f4ec8018 589
590
This page took 0.144702 seconds and 5 git commands to generate.