]> andersk Git - splint.git/blame - src/constraintGeneration.c
*** empty log message ***
[splint.git] / src / constraintGeneration.c
CommitLineData
616915dd 1
2/*
3** constraintGeneration.c
4*/
5
6//#define DEBUGPRINT 1
7
8# include <ctype.h> /* for isdigit */
9# include "lclintMacros.nf"
10# include "basic.h"
920a3797 11
616915dd 12# include "cgrammar_tokens.h"
13
14# include "exprChecks.h"
616915dd 15# include "exprNodeSList.h"
16
920a3797 17//# include "exprDataQuite.i"
616915dd 18
84c9ffbf 19/*@access exprNode @*/
20
470b7798 21
28bf4b0b 22static bool exprNode_handleError(/*@dependent@*/ exprNode p_e);
616915dd 23
24//static cstring exprNode_findConstraints ( exprNode p_e);
28bf4b0b 25static bool exprNode_isMultiStatement(/*@dependent@*/ exprNode p_e);
26static void exprNode_multiStatement (/*@dependent@*/ exprNode p_e);
84c9ffbf 27
616915dd 28//static void exprNode_constraintPropagateUp (exprNode p_e);
616915dd 29
28bf4b0b 30static constraintList exprNode_traversTrueEnsuresConstraints (/*@dependent@*/ exprNode p_e);
31static constraintList exprNode_traversFalseEnsuresConstraints (/*@dependent@*/ exprNode p_e);
616915dd 32
28bf4b0b 33static exprNode makeDataTypeConstraints (/*@returned@*/ exprNode p_e);
34
35static void checkArgumentList (/*@out@*/ exprNode p_temp, exprNodeList p_arglist, fileloc p_sequencePoint) /*@modifies p_temp @*/;
36
37static constraintList checkCall (/*@dependent@*/ exprNode p_fcn, exprNodeList p_arglist);
4ab867d6 38
920a3797 39//constraintList constraintList_makeFixedArrayConstraints (sRefSet s);
616915dd 40
41//bool exprNode_testd()
42//{
43 /* if ( ( (exprNode_isError ) ) )
44 {
45 }
46 if ( ( (e_1 ) ) )
47 {
48 }
49 */
50//}
51
28bf4b0b 52static bool exprNode_isUnhandled (/*@dependent@*/ /*@obsever@*/ exprNode e)
616915dd 53{
54 llassert( exprNode_isDefined(e) );
55 switch (e->kind)
56 {
57 case XPR_INITBLOCK:
58 case XPR_EMPTY:
59 case XPR_LABEL:
60 case XPR_CONST:
61 case XPR_VAR:
62 case XPR_BODY:
63 case XPR_OFFSETOF:
64 case XPR_ALIGNOFT:
65 case XPR_ALIGNOF:
66 case XPR_VAARG:
67 case XPR_ITERCALL:
68 case XPR_ITER:
616915dd 69 case XPR_GOTO:
70 case XPR_CONTINUE:
71 case XPR_BREAK:
72 case XPR_COMMA:
73 case XPR_COND:
74 case XPR_TOK:
75 case XPR_FTDEFAULT:
76 case XPR_DEFAULT:
77 case XPR_SWITCH:
78 case XPR_FTCASE:
79 case XPR_CASE:
80 // case XPR_INIT:
81 case XPR_NODE:
82 DPRINTF((message ("Warning current constraint generation does not handle expression %s", exprNode_unparse(e)) ) );
83 return TRUE;
84 /*@notreached@*/
85 break;
86 default:
87 return FALSE;
88
89 }
90 /*not reached*/
91 return FALSE;
92}
93
94bool exprNode_handleError( exprNode e)
95{
96 if (exprNode_isError (e) || exprNode_isUnhandled(e) )
97 {
98 static /*@only@*/ cstring error = cstring_undefined;
99
100 if (!cstring_isDefined (error))
101 {
102 error = cstring_makeLiteral ("<error>");
103 }
104
105 /*@-unqualifiedtrans*/ return TRUE; /*@=unqualifiedtrans*/
106 }
107 return FALSE;
108}
109
28bf4b0b 110bool /*@alt void@*/ exprNode_generateConstraints (/*@dependent@*/ exprNode e)
616915dd 111{
112 if (exprNode_isError (e) )
113 return FALSE;
bb25bea6 114 /*
c3e695ff 115 e->requiresConstraints = constraintList_makeNew();
116 e->ensuresConstraints = constraintList_makeNew();
117 e->trueEnsuresConstraints = constraintList_makeNew();
118 e->falseEnsuresConstraints = constraintList_makeNew();
bb25bea6 119 */
9280addf 120
616915dd 121 if (exprNode_isUnhandled (e) )
122 {
123 DPRINTF( (message("Warning ignoring %s", exprNode_unparse (e) ) ) );
9280addf 124 return FALSE;
616915dd 125 }
126
127
128 // e = makeDataTypeConstraints (e);
129
130 DPRINTF((message ("exprNode_generateConstraints Analysising %s at %s", exprNode_unparse( e),
131 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
132
133 if (exprNode_isMultiStatement ( e) )
134 {
135 exprNode_multiStatement(e);
136 }
137 else
138 {
9280addf 139 fileloc loc;
140
141 loc = exprNode_getNextSequencePoint(e);
142 exprNode_exprTraverse(e, FALSE, FALSE, loc);
143
bb25bea6 144 fileloc_free(loc);
616915dd 145 return FALSE;
146 }
147
148 {
149 constraintList c;
150
151 c = constraintList_makeFixedArrayConstraints (e->uses);
28bf4b0b 152 e->requiresConstraints = constraintList_reflectChangesFreePre (e->requiresConstraints, c);
616915dd 153
154 // e->ensuresConstraints = constraintList_mergeEnsures(c, e->ensuresConstraints);
155
bb25bea6 156 constraintList_free(c);
616915dd 157 }
158
bb25bea6 159 DPRINTF ( (message ("e->requiresConstraints %s", constraintList_printDetailed (e->requiresConstraints) ) ) );
616915dd 160 return FALSE;
161}
162
163
164/* handles multiple statements */
165
166bool exprNode_isMultiStatement(exprNode e)
167{
168if (exprNode_handleError (e) != NULL)
169 return FALSE;
170
171 switch (e->kind)
172 {
173 case XPR_FOR:
174 case XPR_FORPRED:
175 case XPR_IF:
176 case XPR_IFELSE:
177 case XPR_WHILE:
178 case XPR_WHILEPRED:
179 case XPR_DOWHILE:
180 case XPR_BLOCK:
181 case XPR_STMT:
182 case XPR_STMTLIST:
183 return TRUE;
184 default:
185 return FALSE;
186 }
187
188}
189
28bf4b0b 190static void exprNode_stmt ( /*@dependent@*/ exprNode e)
616915dd 191{
192 exprNode snode;
193 fileloc loc;
d46ce6a4 194 cstring s;
9280addf 195
616915dd 196 if (exprNode_isError(e) )
197 {
84c9ffbf 198 return; // FALSE;
616915dd 199 }
bb25bea6 200 /*e->requiresConstraints = constraintList_makeNew();
201 e->ensuresConstraints = constraintList_makeNew(); */
616915dd 202 // e = makeDataTypeConstraints(e);
203
204
205 DPRINTF(( "STMT:") );
9280addf 206 s = exprNode_unparse(e);
207 // DPRINTF ( ( message("STMT: %s ") ) );
208
616915dd 209 if (e->kind == XPR_INIT)
210 {
bb25bea6 211 constraintList tempList;
616915dd 212 DPRINTF (("Init") );
213 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
214 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
84c9ffbf 215 exprNode_exprTraverse (e, FALSE, FALSE, loc);
bb25bea6 216 fileloc_free(loc);
217
218 tempList = e->requiresConstraints;
616915dd 219 e->requiresConstraints = exprNode_traversRequiresConstraints(e);
bb25bea6 220 constraintList_free(tempList);
221
222 tempList = e->ensuresConstraints;
616915dd 223 e->ensuresConstraints = exprNode_traversEnsuresConstraints(e);
bb25bea6 224 constraintList_free(tempList);
84c9ffbf 225 return; // notError;
616915dd 226 }
227
228 if (e->kind != XPR_STMT)
229 {
230
231 DPRINTF (("Not Stmt") );
232 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
233 if (exprNode_isMultiStatement (e) )
234 {
235 return exprNode_multiStatement (e );
236 }
84c9ffbf 237 DPRINTF( (message ("Ignoring non-statement %s", exprNode_unparse(e) ) ) );
238 return; //TRUE;
616915dd 239 // llassert(FALSE);
240 }
241
242 DPRINTF (("Stmt") );
243 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
244
245 snode = exprData_getUopNode (e->edata);
246
247 /* could be stmt involving multiple statements:
248 i.e. if, while for ect.
249 */
250
251 if (exprNode_isMultiStatement (snode))
252 {
84c9ffbf 253 exprNode_multiStatement (snode);
254 (void) exprNode_copyConstraints (e, snode);
255 return;
616915dd 256 }
257
258 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
84c9ffbf 259 //notError =
260 exprNode_exprTraverse (snode, FALSE, FALSE, loc);
bb25bea6 261
262 fileloc_free(loc);
263
264 constraintList_free (e->requiresConstraints);
616915dd 265 e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
266 // printf ("For: %s \n", exprNode_unparse (e) );
267 // printf ("%s\n", constraintList_print(e->requiresConstraints) );
bb25bea6 268
269 constraintList_free (e->ensuresConstraints);
616915dd 270 e->ensuresConstraints = exprNode_traversEnsuresConstraints(snode);
271 // printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
272 // llassert(notError);
bb25bea6 273
274 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
275 constraintList_print(e->requiresConstraints),
276 constraintList_print(e->ensuresConstraints) ) ) );
277
84c9ffbf 278 return; // notError;
616915dd 279
280}
281
282
28bf4b0b 283static void exprNode_stmtList (/*@dependent@*/ exprNode e)
616915dd 284{
285 exprNode stmt1, stmt2;
286 if (exprNode_isError (e) )
287 {
84c9ffbf 288 return; // FALSE;
616915dd 289 }
290
bb25bea6 291 /*
292 e->requiresConstraints = constraintList_makeNew();
293 e->ensuresConstraints = constraintList_makeNew();
294 */
616915dd 295 // e = makeDataTypeConstraints(e);
296
297 /*Handle case of stmtList with only one statement:
298 The parse tree stores this as stmt instead of stmtList*/
299 if (e->kind != XPR_STMTLIST)
300 {
84c9ffbf 301 exprNode_stmt(e);
302 return;
616915dd 303 }
304 llassert (e->kind == XPR_STMTLIST);
305 DPRINTF(( "STMTLIST:") );
306 DPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
307 stmt1 = exprData_getPairA (e->edata);
308 stmt2 = exprData_getPairB (e->edata);
309
310
311 DPRINTF((" stmtlist ") );
312 DPRINTF ((message("XW%s | %s", exprNode_unparse(stmt1), exprNode_unparse(stmt2) ) ) );
313
314 exprNode_stmt (stmt1);
315 DPRINTF(("\nstmt after stmtList call " ));
316
317 exprNode_stmt (stmt2);
28bf4b0b 318 exprNode_mergeResolve (e, stmt1, stmt2 );
616915dd 319
320 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
321 constraintList_print(e->requiresConstraints),
322 constraintList_print(e->ensuresConstraints) ) ) );
84c9ffbf 323 return; // TRUE;
a8e557d3 324}
325
28bf4b0b 326static exprNode doIf (/*@returned@*/ exprNode e, /*@dependent@*/ exprNode test, /*@dependent@*/ exprNode body)
616915dd 327{
bb25bea6 328 constraintList temp;
329
616915dd 330 DPRINTF ((message ("doIf: %s ", exprNode_unparse(e) ) ) );
470b7798 331
a8e557d3 332 llassert(exprNode_isDefined(test) );
84c9ffbf 333 llassert (exprNode_isDefined (e) );
334 llassert (exprNode_isDefined (body) );
bb25bea6 335
616915dd 336
bb25bea6 337 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
338
339 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
340
341 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
342
343 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
344
345
346
347 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
348
349 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
350
351 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->trueEnsuresConstraints) ) ));
352
353 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->falseEnsuresConstraints) ) ));
354
355
356
357 temp = test->trueEnsuresConstraints;
358 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
359 constraintList_free(temp);
360
361 temp = test->ensuresConstraints;
616915dd 362 test->ensuresConstraints = exprNode_traversEnsuresConstraints (test);
bb25bea6 363 constraintList_free(temp);
364
365 temp = test->requiresConstraints;
470b7798 366 test->requiresConstraints = exprNode_traversRequiresConstraints (test);
bb25bea6 367 constraintList_free(temp);
616915dd 368
bb25bea6 369
370 test->trueEnsuresConstraints = constraintList_substituteFreeTarget(test->trueEnsuresConstraints, test->ensuresConstraints);
c3e695ff 371
372 DPRINTF ((message ("doIf: test ensures %s ", constraintList_print(test->ensuresConstraints) ) ) );
373
374 DPRINTF ((message ("doIf: test true ensures %s ", constraintList_print(test->trueEnsuresConstraints) ) ) );
bb25bea6 375
376 constraintList_free(e->requiresConstraints);
28bf4b0b 377 e->requiresConstraints = constraintList_reflectChanges(body->requiresConstraints, test->trueEnsuresConstraints);
bb25bea6 378
28bf4b0b 379 e->requiresConstraints = constraintList_reflectChangesFreePre (e->requiresConstraints,
616915dd 380 test->ensuresConstraints);
bb25bea6 381 temp = e->requiresConstraints;
470b7798 382 e->requiresConstraints = constraintList_mergeRequires (e->requiresConstraints, test->requiresConstraints);
bb25bea6 383 constraintList_free(temp);
384
385
28bf4b0b 386//drl possible problem : warning bad
bb25bea6 387 constraintList_free(e->ensuresConstraints);
616915dd 388 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
90bc41f7 389
390 if (exprNode_mayEscape (body) )
391 {
392 DPRINTF (( message("doIf: the if statement body %s returns or exits", exprNode_unparse(body) ) ));
bb25bea6 393 e->ensuresConstraints = constraintList_mergeEnsuresFreeFirst (e->ensuresConstraints,
470b7798 394 test->falseEnsuresConstraints);
90bc41f7 395 }
396
9280addf 397 DPRINTF ((message ("doIf: if requiers %s ", constraintList_print(e->requiresConstraints) ) ) );
398
616915dd 399 return e;
400}
401
470b7798 402/*drl added 3/4/2001
403 Also used for condition i.e. ?: operation
404
405 Precondition
406 This function assumes that p, trueBranch, falseBranch have have all been traversed
407 for constraints i.e. we assume that exprNode_traversEnsuresConstraints,
408 exprNode_traversRequiresConstraints, exprNode_traversTrueEnsuresConstraints,
409 exprNode_traversFalseEnsuresConstraints have all been run
410*/
411
412
28bf4b0b 413static exprNode doIfElse (/*@returned@*/ exprNode e, /*@dependent@*/ exprNode p, /*@dependent@*/ exprNode trueBranch, /*@dependent@*/ exprNode falseBranch)
470b7798 414{
415
bb25bea6 416 constraintList c1, cons, t, t2, f, f2;
417
418 DPRINTF ((message ("doIfElse: %s ", exprNode_unparse(e) ) ) );
470b7798 419
420 // do requires clauses
421 c1 = constraintList_copy (p->ensuresConstraints);
422
28bf4b0b 423 t = constraintList_reflectChanges(trueBranch->requiresConstraints, p->trueEnsuresConstraints);
424 t = constraintList_reflectChangesFreePre (t, p->ensuresConstraints);
470b7798 425
28bf4b0b 426 cons = constraintList_reflectChanges(falseBranch->requiresConstraints, p->falseEnsuresConstraints);
427 cons = constraintList_reflectChangesFreePre (cons, c1);
470b7798 428
bb25bea6 429 constraintList_free(e->requiresConstraints);
430 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (t, cons);
431 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (e->requiresConstraints, p->requiresConstraints);
470b7798 432
433 // do ensures clauses
434 // find the the ensures lists for each subbranch
435 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
bb25bea6 436 t2 = t;
470b7798 437 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
bb25bea6 438 constraintList_free(t2);
439
470b7798 440 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
bb25bea6 441 f2 = f;
470b7798 442 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
bb25bea6 443 constraintList_free(f2);
470b7798 444
445 // find ensures for whole if/else statement
446
bb25bea6 447 constraintList_free(e->ensuresConstraints);
448
470b7798 449 e->ensuresConstraints = constraintList_logicalOr (t, f);
450
bb25bea6 451 constraintList_free(t);
452 constraintList_free(f);
453 constraintList_free(cons);
454 constraintList_free(c1);
455
456 DPRINTF ((message ("doIfElse: if requires %q ", constraintList_print(e->requiresConstraints) ) ) );
457 DPRINTF ((message ("doIfElse: if ensures %q ", constraintList_print(e->ensuresConstraints) ) ) );
458
470b7798 459 return e;
460}
9280addf 461
28bf4b0b 462static exprNode doWhile (/*@returned@*/ exprNode e, /*@dependent@*/ exprNode test, /*@dependent@*/ exprNode body)
9280addf 463{
464 DPRINTF ((message ("doWhile: %s ", exprNode_unparse(e) ) ) );
465 return doIf (e, test, body);
466}
467
920a3797 468/*@only@*/ constraintList constraintList_makeFixedArrayConstraints (/*@observer@*/ sRefSet s)
616915dd 469{
470 constraintList ret;
470b7798 471 constraint con;
c3e695ff 472 ret = constraintList_makeNew();
616915dd 473
474 sRefSet_elements (s, el)
475 {
476 // llassert (el);
477 if (sRef_isFixedArray(el) )
478 {
84c9ffbf 479 long int size;
470b7798 480 DPRINTF( (message("%s is a fixed array",
481 sRef_unparse(el)) ) );
482 //if (el->kind == SK_DERIVED)
483 // break; //hack until I find the real problem
84c9ffbf 484 size = sRef_getArraySize(el);
616915dd 485 DPRINTF( (message("%s is a fixed array with size %d",
84c9ffbf 486 sRef_unparse(el), (int)size) ) );
487 con = constraint_makeSRefSetBufferSize (el, (size - 1));
488 //con = constraint_makeSRefWriteSafeInt (el, (size - 1));
616915dd 489 ret = constraintList_add(ret, con);
490 }
491 else
492 {
493 DPRINTF( (message("%s is not a fixed array",
494 sRef_unparse(el)) ) );
470b7798 495
496
497 if (sRef_isExternallyVisible (el) )
498 {
499 /*DPRINTF( (message("%s is externally visible",
500 sRef_unparse(el) ) ));
501 con = constraint_makeSRefWriteSafeInt(el, 0);
502 ret = constraintList_add(ret, con);
503
504 con = constraint_makeSRefReadSafeInt(el, 0);
505
506 ret = constraintList_add(ret, con);*/
507 }
616915dd 508 }
509 }
510 end_sRefSet_elements
511
470b7798 512 DPRINTF(( message("constraintList_makeFixedArrayConstraints returning %s",
513 constraintList_print(ret) ) ));
616915dd 514 return ret;
515}
516
4ab867d6 517exprNode makeDataTypeConstraints (/*@returned@*/ exprNode e)
616915dd 518{
519 constraintList c;
520 DPRINTF(("makeDataTypeConstraints"));
521
522 c = constraintList_makeFixedArrayConstraints (e->uses);
523
4ab867d6 524 e->ensuresConstraints = constraintList_addListFree (e->ensuresConstraints, c);
616915dd 525
526 return e;
527}
528
28bf4b0b 529static void doFor (/*@dependent@*/ exprNode e, /*@dependent@*/ exprNode forPred, /*@dependent@*/ exprNode forBody)
616915dd 530{
531 exprNode init, test, inc;
532 //merge the constraints: modle as if statement
533 /* init
534 if (test)
535 for body
536 inc */
537 init = exprData_getTripleInit (forPred->edata);
538 test = exprData_getTripleTest (forPred->edata);
539 inc = exprData_getTripleInc (forPred->edata);
540
541 if ( ( (exprNode_isError (test) /*|| (exprNode_isError(init) )*/ ) || (exprNode_isError (inc) ) ) )
542 {
543 DPRINTF ((message ("strange for statement:%s, ignoring it", exprNode_unparse(e) ) ) );
544 return;
545 }
546
28bf4b0b 547 exprNode_forLoopHeuristics(e, forPred, forBody);
616915dd 548
bb25bea6 549 constraintList_free(e->requiresConstraints);
28bf4b0b 550 e->requiresConstraints = constraintList_reflectChanges(forBody->requiresConstraints, test->ensuresConstraints);
551 e->requiresConstraints = constraintList_reflectChangesFreePre (e->requiresConstraints, test->trueEnsuresConstraints);
552 e->requiresConstraints = constraintList_reflectChangesFreePre (e->requiresConstraints, forPred->ensuresConstraints);
616915dd 553
554 if (!forBody->canBreak)
555 {
4ab867d6 556 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints, constraintList_copy(forPred->ensuresConstraints) );
557 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints,constraintList_copy( test->falseEnsuresConstraints));
bb25bea6 558 // forPred->ensuresConstraints = constraintList_undefined;
559 // test->falseEnsuresConstraints = constraintList_undefined;
616915dd 560 }
561 else
562 {
563 DPRINTF(("Can break") );
564 }
565
566}
567
bb25bea6 568static exprNode doSwitch (/*@returned@*/ exprNode e)
470b7798 569{
570 exprNode body;
571 exprData data;
572
573 data = e->edata;
574 llassert(FALSE);
90bc41f7 575 //DPRINTF (( message ("doSwitch for: switch (%s) %s",
470b7798 576 // exprNode_unparse (exprData_getPairA (data)),
577 // exprNode_unparse (exprData_getPairB (data))) ));
578
579 body = exprData_getPairB (data);
580
581 // exprNode_generateConstraints(body);
582
583 // e->requiresConstraints = constraintList_copy ( body->requiresConstraints );
584 //e->ensuresConstraints = constraintList_copy ( body->ensuresConstraints );
585
586 return e;
587}
9280addf 588
589
28bf4b0b 590void exprNode_multiStatement (/*@dependent@*/ exprNode e)
616915dd 591{
592
593 bool ret;
594 exprData data;
595 exprNode e1, e2;
596 exprNode p, trueBranch, falseBranch;
597 exprNode forPred, forBody;
470b7798 598 exprNode test;
bb25bea6 599
600 constraintList temp;
601
470b7798 602 // constraintList t, f;
bb25bea6 603 /*e->requiresConstraints = constraintList_makeNew();
c3e695ff 604 e->ensuresConstraints = constraintList_makeNew();
605 e->trueEnsuresConstraints = constraintList_makeNew();
606 e->falseEnsuresConstraints = constraintList_makeNew();
bb25bea6 607 */
616915dd 608 // e = makeDataTypeConstraints(e);
609
610 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
611 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
612
613 if (exprNode_handleError (e))
614 {
84c9ffbf 615 return; // FALSE;
616915dd 616 }
617
618 data = e->edata;
619
620 ret = TRUE;
621
622 switch (e->kind)
623 {
624
625 case XPR_FOR:
626 // ret = message ("%s %s",
627 forPred = exprData_getPairA (data);
628 forBody = exprData_getPairB (data);
629
630 //first generate the constraints
631 exprNode_generateConstraints (forPred);
632 exprNode_generateConstraints (forBody);
633
634
635 doFor (e, forPred, forBody);
636
637 break;
638
639 case XPR_FORPRED:
640 // ret = message ("for (%s; %s; %s)",
641 exprNode_generateConstraints (exprData_getTripleInit (data) );
642 test = exprData_getTripleTest (data);
643 exprNode_exprTraverse (test,FALSE, FALSE, exprNode_loc(e));
9280addf 644 exprNode_generateConstraints (exprData_getTripleInc (data) );
645
616915dd 646 if (!exprNode_isError(test) )
bb25bea6 647 {
648 constraintList temp2;
649 temp2 = test->trueEnsuresConstraints;
650 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
651 constraintList_free(temp2);
652 }
653
616915dd 654 exprNode_generateConstraints (exprData_getTripleInc (data));
655 break;
9280addf 656
657 case XPR_WHILE:
658 e1 = exprData_getPairA (data);
659 e2 = exprData_getPairB (data);
660
661 exprNode_exprTraverse (e1,
662 FALSE, FALSE, exprNode_loc(e1));
663
664 exprNode_generateConstraints (e2);
665
666 e = doWhile (e, e1, e2);
667
668 break;
669
616915dd 670 case XPR_IF:
671 DPRINTF(( "IF:") );
672 DPRINTF ((exprNode_unparse(e) ) );
673 // ret = message ("if (%s) %s",
674 e1 = exprData_getPairA (data);
675 e2 = exprData_getPairB (data);
676
677 exprNode_exprTraverse (e1,
678 FALSE, FALSE, exprNode_loc(e1));
679
680 exprNode_generateConstraints (e2);
616915dd 681 e = doIf (e, e1, e2);
682
683
684 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
685 break;
9280addf 686
687
616915dd 688 case XPR_IFELSE:
689 DPRINTF(("Starting IFELSE"));
690 // ret = message ("if (%s) %s else %s",
691 p = exprData_getTriplePred (data);
692 trueBranch = exprData_getTripleTrue (data);
693 falseBranch = exprData_getTripleFalse (data);
694
695 exprNode_exprTraverse (p,
696 FALSE, FALSE, exprNode_loc(p));
697 exprNode_generateConstraints (trueBranch);
698 exprNode_generateConstraints (falseBranch);
699
bb25bea6 700 temp = p->ensuresConstraints;
9280addf 701 p->ensuresConstraints = exprNode_traversEnsuresConstraints (p);
bb25bea6 702 constraintList_free(temp);
703
704 temp = p->requiresConstraints;
470b7798 705 p->requiresConstraints = exprNode_traversRequiresConstraints (p);
bb25bea6 706 constraintList_free(temp);
707
708 temp = p->trueEnsuresConstraints;
9280addf 709 p->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(p);
bb25bea6 710 constraintList_free(temp);
711
712 temp = p->falseEnsuresConstraints;
470b7798 713 p->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(p);
bb25bea6 714 constraintList_free(temp);
616915dd 715
470b7798 716 e = doIfElse (e, p, trueBranch, falseBranch);
616915dd 717 DPRINTF( ("Done IFELSE") );
718 break;
9280addf 719
616915dd 720 case XPR_DOWHILE:
470b7798 721
722 e2 = (exprData_getPairB (data));
723 e1 = (exprData_getPairA (data));
724
725 DPRINTF((message ("do { %s } while (%s)", exprNode_unparse(e2), exprNode_unparse(e1) ) ));
726 exprNode_generateConstraints (e2);
727 exprNode_generateConstraints (e1);
728 e = exprNode_copyConstraints (e, e2);
729 DPRINTF ((message ("e = %s ", constraintList_print(e->requiresConstraints) ) ));
730
616915dd 731 break;
732
733 case XPR_BLOCK:
734 // ret = message ("{ %s }",
735 exprNode_generateConstraints (exprData_getSingle (data));
bb25bea6 736
737 constraintList_free(e->requiresConstraints);
616915dd 738 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
bb25bea6 739
740 constraintList_free(e->ensuresConstraints);
616915dd 741 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
742 // e->constraints = (exprData_getSingle (data))->constraints;
743 break;
744
470b7798 745 case XPR_SWITCH:
746 e = doSwitch (e);
747 break;
616915dd 748 case XPR_STMT:
749 case XPR_STMTLIST:
84c9ffbf 750 exprNode_stmtList (e);
751 return ;
616915dd 752 /*@notreached@*/
753 break;
754 default:
755 ret=FALSE;
756 }
84c9ffbf 757 return; // ret;
616915dd 758}
759
bb25bea6 760static bool lltok_isBoolean_Op (lltok tok)
616915dd 761{
762 /*this should really be a switch statement but
763 I don't want to violate the abstraction
764 maybe this should go in lltok.c */
765
766 if (lltok_isEq_Op (tok) )
767 {
768 return TRUE;
769 }
770 if (lltok_isAnd_Op (tok) )
771
772 {
773
774 return TRUE;
775 }
776 if (lltok_isOr_Op (tok) )
777 {
778 return TRUE;
779 }
780
781 if (lltok_isGt_Op (tok) )
782 {
783 return TRUE;
784 }
785 if (lltok_isLt_Op (tok) )
786 {
787 return TRUE;
788 }
789
790 if (lltok_isLe_Op (tok) )
791 {
792 return TRUE;
793 }
794
795 if (lltok_isGe_Op (tok) )
796 {
797 return TRUE;
798 }
799
800 return FALSE;
801
802}
803
804
28bf4b0b 805static void exprNode_booleanTraverse (/*@dependent@*/ exprNode e, /*@unused@*/ bool definatelv, /*@unused@*/ bool definaterv, fileloc sequencePoint)
616915dd 806{
807 constraint cons;
808exprNode t1, t2;
809exprData data;
810lltok tok;
bb25bea6 811constraintList tempList, temp;
616915dd 812data = e->edata;
813
814tok = exprData_getOpTok (data);
815
816
817t1 = exprData_getOpA (data);
818t2 = exprData_getOpB (data);
819
820
920a3797 821 tempList = constraintList_undefined;
822
616915dd 823/* arithmetic tests */
824
825if (lltok_isEq_Op (tok) )
826{
827 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
828 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
829}
830
831
832 if (lltok_isLt_Op (tok) )
833 {
834 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
835 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
836 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
837 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
838 }
839
840
841if (lltok_isGe_Op (tok) )
842{
843
844 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
845 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
846
847 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
848 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
849
850}
851
852
853 if (lltok_isGt_Op (tok) )
854{
855 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
856 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
857 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
858 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
859}
860
861if (lltok_isLe_Op (tok) )
862{
863 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
864 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
865
866 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
867 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
868}
869
870
871
872/*Logical operations */
873
920a3797 874
616915dd 875 if (lltok_isAnd_Op (tok) )
876
877 {
878 //true ensures
879 tempList = constraintList_copy (t1->trueEnsuresConstraints);
880 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
4ab867d6 881 e->trueEnsuresConstraints = constraintList_addListFree(e->trueEnsuresConstraints, tempList);
616915dd 882
883 //false ensures: fens t1 or tens t1 and fens t2
884 tempList = constraintList_copy (t1->trueEnsuresConstraints);
885 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
bb25bea6 886 temp = tempList;
616915dd 887 tempList = constraintList_logicalOr (tempList, t1->falseEnsuresConstraints);
bb25bea6 888 constraintList_free(temp);
889
616915dd 890 e->falseEnsuresConstraints =constraintList_addList(e->falseEnsuresConstraints, tempList);
891
892 }
84c9ffbf 893 else if (lltok_isOr_Op (tok) )
894 {
616915dd 895 //false ensures
896 tempList = constraintList_copy (t1->falseEnsuresConstraints);
897 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
4ab867d6 898 e->falseEnsuresConstraints = constraintList_addListFree(e->falseEnsuresConstraints, tempList);
616915dd 899
900 //true ensures: tens t1 or fens t1 and tens t2
901 tempList = constraintList_copy (t1->falseEnsuresConstraints);
902 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
bb25bea6 903
904 temp = tempList;
616915dd 905 tempList = constraintList_logicalOr (tempList, t1->trueEnsuresConstraints);
bb25bea6 906 constraintList_free(temp);
907
908
4ab867d6 909 e->trueEnsuresConstraints =constraintList_addListFree(e->trueEnsuresConstraints, tempList);
920a3797 910 tempList = constraintList_undefined;
911
616915dd 912
913 }
84c9ffbf 914 else
915 {
916 DPRINTF((message("%s is not a boolean operation", lltok_unparse(tok) ) ));
917 }
616915dd 918
919}
920
28bf4b0b 921void exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, /*@observer@*/ /*@temp@*/ fileloc sequencePoint)
616915dd 922{
9280addf 923 exprNode t1, t2, fcn;
616915dd 924 lltok tok;
925 bool handledExprNode;
926 exprData data;
927 constraint cons;
928
bb25bea6 929 constraintList temp;
930
470b7798 931 if (exprNode_isError(e) )
932 {
84c9ffbf 933 return; // FALSE;
470b7798 934 }
935
936 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
616915dd 937 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
470b7798 938
bb25bea6 939 /*e->requiresConstraints = constraintList_makeNew();
c3e695ff 940 e->ensuresConstraints = constraintList_makeNew();
941 e->trueEnsuresConstraints = constraintList_makeNew();;
942 e->falseEnsuresConstraints = constraintList_makeNew();;
bb25bea6 943 */
470b7798 944 if (exprNode_isUnhandled (e) )
616915dd 945 {
84c9ffbf 946 return; // FALSE;
616915dd 947 }
948 // e = makeDataTypeConstraints (e);
949
950 handledExprNode = TRUE;
951
952 data = e->edata;
953
954 switch (e->kind)
955 {
616915dd 956 case XPR_WHILEPRED:
957 t1 = exprData_getSingle (data);
958 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint);
959 e = exprNode_copyConstraints (e, t1);
960 break;
961
962 case XPR_FETCH:
963
964 if (definatelv )
965 {
966 t1 = (exprData_getPairA (data) );
967 t2 = (exprData_getPairB (data) );
968 cons = constraint_makeWriteSafeExprNode (t1, t2);
969 }
970 else
971 {
972 t1 = (exprData_getPairA (data) );
973 t2 = (exprData_getPairB (data) );
974 cons = constraint_makeReadSafeExprNode (t1, t2 );
975 }
976
977 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
978 cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
979 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
980
9280addf 981 cons = constraint_makeEnsureLteMaxRead (t2, t1);
616915dd 982 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
983
984 // cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
985 // e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
d46ce6a4 986
616915dd 987 exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
988 exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
989
990 /*@i325 Should check which is array/index. */
991 break;
992
993 case XPR_PARENS:
994 exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
995 // e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
996 break;
997 case XPR_INIT:
920a3797 998 {
999 /*
1000 idDecl t;
1001
1002 uentry ue;
1003 exprNode lhs;
1004
1005 t = exprData_getInitId (data);
1006 ue = usymtab_lookup (idDecl_observeId (t));
1007 lhs = exprNode_createId (ue);
1008 */
1009 t2 = exprData_getInitNode (data);
1010
1011 /* DPRINTF(( (message("initialization: %s = %s",
1012 exprNode_unparse(lhs),
1013 exprNode_unparse(t2)
1014 )
1015 ) )); */
1016
1017 //exprNode_exprTraverse (t1, TRUE, FALSE, sequencePoint );
1018
1019 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1020
1021 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
616915dd 1022 if ( (!exprNode_isError (e)) && (!exprNode_isError(t2)) )
920a3797 1023 {
1024 cons = constraint_makeEnsureEqual (e, t2, sequencePoint);
1025 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1026 }
1027 }
616915dd 1028
1029 break;
1030 case XPR_ASSIGN:
1031 t1 = exprData_getOpA (data);
1032 t2 = exprData_getOpB (data);
1033 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
84c9ffbf 1034 //lltok_unparse (exprData_getOpTok (data));
920a3797 1035
616915dd 1036 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1037
1038 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
1039 if ( (!exprNode_isError (t1)) && (!exprNode_isError(t2)) )
1040 {
1041 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
1042 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1043 }
1044 break;
1045 case XPR_OP:
1046 t1 = exprData_getOpA (data);
1047 t2 = exprData_getOpB (data);
616915dd 1048 tok = exprData_getOpTok (data);
2934b455 1049
920a3797 1050
2934b455 1051 if (tok.tok == ADD_ASSIGN)
1052 {
920a3797 1053 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1054 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1055
2934b455 1056 cons = constraint_makeAddAssign (t1, t2, sequencePoint );
1057 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1058 }
920a3797 1059 else if (tok.tok == SUB_ASSIGN)
2934b455 1060 {
920a3797 1061 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1062 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1063
2934b455 1064 cons = constraint_makeSubtractAssign (t1, t2, sequencePoint );
1065 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1066 }
920a3797 1067 else
1068 {
1069 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1070 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1071 }
2934b455 1072
616915dd 1073 if (lltok_isBoolean_Op (tok) )
1074 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
1075
1076 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
1077 break;
1078 case XPR_SIZEOFT:
28bf4b0b 1079 //drl possible problem : warning make sure the case can be ignored..
616915dd 1080
1081 break;
1082
1083 case XPR_SIZEOF:
1084 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1085 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
1086 break;
1087
1088 case XPR_CALL:
9280addf 1089 fcn = exprData_getFcn(data);
1090
1091 exprNode_exprTraverse (fcn, definatelv, definaterv, sequencePoint );
9280addf 1092 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(fcn), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
616915dd 1093
4ab867d6 1094 fcn->requiresConstraints = constraintList_addListFree (fcn->requiresConstraints,
9280addf 1095 checkCall (fcn, exprData_getArgs (data) ) );
616915dd 1096
4ab867d6 1097 fcn->ensuresConstraints = constraintList_addListFree (fcn->ensuresConstraints,
28bf4b0b 1098 exprNode_getPostConditions(fcn, exprData_getArgs (data),e ) );
9280addf 1099
1100 t1 = exprNode_createNew (exprNode_getType (e) );
1101
1102 checkArgumentList (t1, exprData_getArgs(data), sequencePoint);
616915dd 1103
9280addf 1104
28bf4b0b 1105 exprNode_mergeResolve (e, t1, fcn);
920a3797 1106
1107 exprNode_free(t1);
9280addf 1108
616915dd 1109 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
920a3797 1110
616915dd 1111 break;
1112
1113 case XPR_RETURN:
1114 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1115 break;
1116
1117 case XPR_NULLRETURN:
84c9ffbf 1118
616915dd 1119 break;
1120
1121
1122 case XPR_FACCESS:
1123 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
616915dd 1124 break;
1125
1126 case XPR_ARROW:
1127 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
616915dd 1128 break;
1129
1130 case XPR_STRINGLITERAL:
84c9ffbf 1131
616915dd 1132 break;
1133
1134 case XPR_NUMLIT:
84c9ffbf 1135
616915dd 1136 break;
1137
1138 case XPR_PREOP:
1139 t1 = exprData_getUopNode(data);
1140 tok = (exprData_getUopTok (data));
1141 //lltok_unparse (exprData_getUopTok (data));
1142 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1143 /*handle * pointer access */
1144 if (lltok_isInc_Op (tok) )
1145 {
1146 DPRINTF(("doing ++(var)"));
1147 t1 = exprData_getUopNode (data);
1148 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1149 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1150 }
1151 else if (lltok_isDec_Op (tok) )
1152 {
1153 DPRINTF(("doing --(var)"));
1154 t1 = exprData_getUopNode (data);
1155 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1156 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1157 }
84c9ffbf 1158 else if (lltok_isMult( tok ) )
616915dd 1159 {
1160 if (definatelv)
1161 {
1162 cons = constraint_makeWriteSafeInt (t1, 0);
1163 }
1164 else
1165 {
1166 cons = constraint_makeReadSafeInt (t1, 0);
1167 }
1168 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
1169 }
84c9ffbf 1170 else if (lltok_isNot_Op (tok) )
1171 /* ! expr */
616915dd 1172 {
bb25bea6 1173 constraintList_free(e->trueEnsuresConstraints);
1174
616915dd 1175 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
bb25bea6 1176 constraintList_free(e->falseEnsuresConstraints);
616915dd 1177 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
1178 }
bb25bea6 1179
84c9ffbf 1180 else if (lltok_isAmpersand_Op (tok) )
1181 {
1182 break;
1183 }
bb25bea6 1184 else if (lltok_isMinus_Op (tok) )
1185 {
1186 break;
1187 }
4ab867d6 1188 else if ( lltok_isExcl_Op (tok) )
1189 {
1190 break;
1191 }
1192 else if (lltok_isTilde_Op (tok) )
1193 {
1194 break;
1195 }
84c9ffbf 1196 else
1197 {
1198 llcontbug((message("Unsupported preop in %s", exprNode_unparse(e) ) ));
1199 BADEXIT;
1200 }
616915dd 1201 break;
1202
1203 case XPR_POSTOP:
1204
1205 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
84c9ffbf 1206
616915dd 1207 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
1208 {
1209 DPRINTF(("doing ++"));
1210 t1 = exprData_getUopNode (data);
1211 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1212 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1213 }
1214 if (lltok_isDec_Op (exprData_getUopTok (data) ) )
1215 {
1216 DPRINTF(("doing --"));
1217 t1 = exprData_getUopNode (data);
1218 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1219 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1220 }
1221 break;
470b7798 1222 case XPR_CAST:
920a3797 1223 {
1224 t2 = exprData_getCastNode (data);
1225 DPRINTF (( message ("Examining cast (%q)%s",
1226 qtype_unparse (exprData_getCastType (data)),
1227 exprNode_unparse (t2) )
1228 ));
1229 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1230 }
470b7798 1231 break;
920a3797 1232
470b7798 1233 case XPR_COND:
1234 {
28bf4b0b 1235 exprNode pred, trueBranch, falseBranch;
470b7798 1236 llassert(FALSE);
1237 pred = exprData_getTriplePred (data);
28bf4b0b 1238 trueBranch = exprData_getTripleTrue (data);
1239 falseBranch = exprData_getTripleFalse (data);
470b7798 1240
1241 exprNode_exprTraverse (pred, FALSE, TRUE, sequencePoint );
bb25bea6 1242
1243 temp = pred->ensuresConstraints;
470b7798 1244 pred->ensuresConstraints = exprNode_traversEnsuresConstraints(pred);
bb25bea6 1245 constraintList_free(temp);
1246
1247 temp = pred->requiresConstraints;
470b7798 1248 pred->requiresConstraints = exprNode_traversRequiresConstraints(pred);
bb25bea6 1249 constraintList_free(temp);
470b7798 1250
bb25bea6 1251 temp = pred->trueEnsuresConstraints;
470b7798 1252 pred->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(pred);
bb25bea6 1253 constraintList_free(temp);
1254
1255 temp = pred->falseEnsuresConstraints;
470b7798 1256 pred->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(pred);
bb25bea6 1257 constraintList_free(temp);
1258
470b7798 1259
28bf4b0b 1260 exprNode_exprTraverse (trueBranch, FALSE, TRUE, sequencePoint );
bb25bea6 1261
28bf4b0b 1262 temp = trueBranch->ensuresConstraints;
1263 trueBranch->ensuresConstraints = exprNode_traversEnsuresConstraints(trueBranch);
bb25bea6 1264 constraintList_free(temp);
1265
1266
28bf4b0b 1267 temp = trueBranch->requiresConstraints;
1268 trueBranch->requiresConstraints = exprNode_traversRequiresConstraints(trueBranch);
bb25bea6 1269 constraintList_free(temp);
1270
470b7798 1271
28bf4b0b 1272 temp = trueBranch->trueEnsuresConstraints;
1273 trueBranch->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(trueBranch);
bb25bea6 1274 constraintList_free(temp);
1275
28bf4b0b 1276 temp = trueBranch->falseEnsuresConstraints;
1277 trueBranch->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(trueBranch);
bb25bea6 1278 constraintList_free(temp);
470b7798 1279
bb25bea6 1280 //dfdf
28bf4b0b 1281 exprNode_exprTraverse (falseBranch, FALSE, TRUE, sequencePoint );
bb25bea6 1282
28bf4b0b 1283 temp = falseBranch->ensuresConstraints;
1284 falseBranch->ensuresConstraints = exprNode_traversEnsuresConstraints(falseBranch);
bb25bea6 1285 constraintList_free(temp);
1286
1287
28bf4b0b 1288 temp = falseBranch->requiresConstraints;
1289 falseBranch->requiresConstraints = exprNode_traversRequiresConstraints(falseBranch);
bb25bea6 1290 constraintList_free(temp);
1291
470b7798 1292
28bf4b0b 1293 temp = falseBranch->trueEnsuresConstraints;
1294 falseBranch->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(falseBranch);
bb25bea6 1295 constraintList_free(temp);
470b7798 1296
28bf4b0b 1297 temp = falseBranch->falseEnsuresConstraints;
1298 falseBranch->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(falseBranch);
bb25bea6 1299 constraintList_free(temp);
470b7798 1300
1301 /* if pred is true e equals true otherwise pred equals false */
1302
28bf4b0b 1303 cons = constraint_makeEnsureEqual (e, trueBranch, sequencePoint);
1304 trueBranch->ensuresConstraints = constraintList_add(trueBranch->ensuresConstraints, cons);
470b7798 1305
28bf4b0b 1306 cons = constraint_makeEnsureEqual (e, trueBranch, sequencePoint);
1307 falseBranch->ensuresConstraints = constraintList_add(falseBranch->ensuresConstraints, cons);
470b7798 1308
28bf4b0b 1309 e = doIfElse (e, pred, trueBranch, falseBranch);
470b7798 1310
1311 }
1312 break;
1313 case XPR_COMMA:
1314 llassert(FALSE);
1315 t1 = exprData_getPairA (data);
1316 t2 = exprData_getPairB (data);
1317 /* we essiantially treat this like expr1; expr2
1318 of course sequencePoint isn't adjusted so this isn't completely accurate
1319 problems../ */
1320 exprNode_exprTraverse (t1, FALSE, FALSE, sequencePoint );
1321 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
28bf4b0b 1322 exprNode_mergeResolve (e, t1, t2);
470b7798 1323 break;
920a3797 1324
616915dd 1325 default:
1326 handledExprNode = FALSE;
1327 }
1328
1329 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
1330 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
9280addf 1331 e->requiresConstraints = constraintList_addGeneratingExpr ( e->requiresConstraints, e);
1332
1333 e->ensuresConstraints = constraintList_addGeneratingExpr ( e->ensuresConstraints, e);
1334
d46ce6a4 1335 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
1336
1337 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
616915dd 1338
bb25bea6 1339 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
1340
1341 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
1342
84c9ffbf 1343 return; // handledExprNode;
616915dd 1344}
1345
1346
1347constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
1348{
470b7798 1349 exprNode t1;
616915dd 1350
1351 bool handledExprNode;
1352 // char * mes;
1353 exprData data;
1354 constraintList ret;
1355
1356 if (exprNode_handleError (e))
1357 {
c3e695ff 1358 ret = constraintList_makeNew();
616915dd 1359 return ret;
1360 }
1361 ret = constraintList_copy (e->trueEnsuresConstraints );
1362
1363 handledExprNode = TRUE;
1364
1365 data = e->edata;
1366
1367 switch (e->kind)
1368 {
9280addf 1369 case XPR_WHILEPRED:
1370 t1 = exprData_getSingle (data);
4ab867d6 1371 ret = constraintList_addListFree ( ret, exprNode_traversTrueEnsuresConstraints (t1) );
9280addf 1372 break;
616915dd 1373
1374 case XPR_FETCH:
1375
4ab867d6 1376 ret = constraintList_addListFree (ret,
616915dd 1377 exprNode_traversTrueEnsuresConstraints
1378 (exprData_getPairA (data) ) );
1379
4ab867d6 1380 ret = constraintList_addListFree (ret,
616915dd 1381 exprNode_traversTrueEnsuresConstraints
1382 (exprData_getPairB (data) ) );
1383 break;
1384 case XPR_PREOP:
1385
4ab867d6 1386 ret = constraintList_addListFree (ret,
616915dd 1387 exprNode_traversTrueEnsuresConstraints
1388 (exprData_getUopNode (data) ) );
1389 break;
1390
1391 case XPR_PARENS:
4ab867d6 1392 ret = constraintList_addListFree (ret, exprNode_traversTrueEnsuresConstraints
616915dd 1393 (exprData_getUopNode (data) ) );
1394 break;
1395 case XPR_ASSIGN:
4ab867d6 1396 ret = constraintList_addListFree (ret,
616915dd 1397 exprNode_traversTrueEnsuresConstraints
1398 (exprData_getOpA (data) ) );
1399
4ab867d6 1400 ret = constraintList_addListFree (ret,
616915dd 1401 exprNode_traversTrueEnsuresConstraints
1402 (exprData_getOpB (data) ) );
1403 break;
1404 case XPR_OP:
4ab867d6 1405 ret = constraintList_addListFree (ret,
616915dd 1406 exprNode_traversTrueEnsuresConstraints
1407 (exprData_getOpA (data) ) );
1408
4ab867d6 1409 ret = constraintList_addListFree (ret,
616915dd 1410 exprNode_traversTrueEnsuresConstraints
1411 (exprData_getOpB (data) ) );
1412 break;
1413 case XPR_SIZEOFT:
1414
1415 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1416
1417 break;
1418
1419 case XPR_SIZEOF:
1420
4ab867d6 1421 ret = constraintList_addListFree (ret,
1422 exprNode_traversTrueEnsuresConstraints
1423 (exprData_getSingle (data) ) );
616915dd 1424 break;
1425
1426 case XPR_CALL:
4ab867d6 1427 ret = constraintList_addListFree (ret,
616915dd 1428 exprNode_traversTrueEnsuresConstraints
1429 (exprData_getFcn (data) ) );
1430 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1431 break;
1432
1433 case XPR_RETURN:
4ab867d6 1434 ret = constraintList_addListFree (ret,
616915dd 1435 exprNode_traversTrueEnsuresConstraints
1436 (exprData_getSingle (data) ) );
1437 break;
1438
1439 case XPR_NULLRETURN:
1440 // cstring_makeLiteral ("return");;
1441 break;
1442
1443 case XPR_FACCESS:
4ab867d6 1444 ret = constraintList_addListFree (ret,
616915dd 1445 exprNode_traversTrueEnsuresConstraints
1446 (exprData_getFieldNode (data) ) );
1447 //exprData_getFieldName (data) ;
1448 break;
1449
1450 case XPR_ARROW:
4ab867d6 1451 ret = constraintList_addListFree (ret,
616915dd 1452 exprNode_traversTrueEnsuresConstraints
1453 (exprData_getFieldNode (data) ) );
1454 // exprData_getFieldName (data);
1455 break;
1456
1457 case XPR_STRINGLITERAL:
1458 // cstring_copy (exprData_getLiteral (data));
1459 break;
1460
1461 case XPR_NUMLIT:
1462 // cstring_copy (exprData_getLiteral (data));
1463 break;
1464 case XPR_POSTOP:
1465
4ab867d6 1466 ret = constraintList_addListFree (ret,
616915dd 1467 exprNode_traversTrueEnsuresConstraints
1468 (exprData_getUopNode (data) ) );
1469 break;
470b7798 1470
1471 case XPR_CAST:
1472
4ab867d6 1473 ret = constraintList_addListFree (ret,
470b7798 1474 exprNode_traversTrueEnsuresConstraints
1475 (exprData_getCastNode (data) ) );
470b7798 1476 break;
84c9ffbf 1477
616915dd 1478 default:
1479 break;
1480 }
1481
1482 return ret;
1483}
1484
9280addf 1485constraintList exprNode_traversFalseEnsuresConstraints (exprNode e)
1486{
470b7798 1487 exprNode t1;
9280addf 1488
1489 bool handledExprNode;
1490 // char * mes;
1491 exprData data;
1492 constraintList ret;
1493
1494 if (exprNode_handleError (e))
1495 {
c3e695ff 1496 ret = constraintList_makeNew();
9280addf 1497 return ret;
1498 }
1499 ret = constraintList_copy (e->falseEnsuresConstraints );
1500
1501 handledExprNode = TRUE;
1502
1503 data = e->edata;
1504
1505 switch (e->kind)
1506 {
1507 case XPR_WHILEPRED:
1508 t1 = exprData_getSingle (data);
4ab867d6 1509 ret = constraintList_addListFree ( ret,exprNode_traversFalseEnsuresConstraints (t1) );
9280addf 1510 break;
1511
1512 case XPR_FETCH:
1513
4ab867d6 1514 ret = constraintList_addListFree (ret,
9280addf 1515 exprNode_traversFalseEnsuresConstraints
1516 (exprData_getPairA (data) ) );
1517
4ab867d6 1518 ret = constraintList_addListFree (ret,
9280addf 1519 exprNode_traversFalseEnsuresConstraints
1520 (exprData_getPairB (data) ) );
1521 break;
1522 case XPR_PREOP:
1523
4ab867d6 1524 ret = constraintList_addListFree (ret,
9280addf 1525 exprNode_traversFalseEnsuresConstraints
1526 (exprData_getUopNode (data) ) );
1527 break;
1528
1529 case XPR_PARENS:
4ab867d6 1530 ret = constraintList_addListFree (ret, exprNode_traversFalseEnsuresConstraints
9280addf 1531 (exprData_getUopNode (data) ) );
1532 break;
1533 case XPR_ASSIGN:
4ab867d6 1534 ret = constraintList_addListFree (ret,
9280addf 1535 exprNode_traversFalseEnsuresConstraints
1536 (exprData_getOpA (data) ) );
1537
4ab867d6 1538 ret = constraintList_addListFree (ret,
9280addf 1539 exprNode_traversFalseEnsuresConstraints
1540 (exprData_getOpB (data) ) );
1541 break;
1542 case XPR_OP:
4ab867d6 1543 ret = constraintList_addListFree (ret,
9280addf 1544 exprNode_traversFalseEnsuresConstraints
1545 (exprData_getOpA (data) ) );
1546
4ab867d6 1547 ret = constraintList_addListFree (ret,
9280addf 1548 exprNode_traversFalseEnsuresConstraints
1549 (exprData_getOpB (data) ) );
1550 break;
1551 case XPR_SIZEOFT:
1552
1553 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1554
1555 break;
1556
1557 case XPR_SIZEOF:
1558
4ab867d6 1559 ret = constraintList_addListFree (ret,
9280addf 1560 exprNode_traversFalseEnsuresConstraints
1561 (exprData_getSingle (data) ) );
1562 break;
1563
1564 case XPR_CALL:
4ab867d6 1565 ret = constraintList_addListFree (ret,
9280addf 1566 exprNode_traversFalseEnsuresConstraints
1567 (exprData_getFcn (data) ) );
1568 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1569 break;
1570
1571 case XPR_RETURN:
4ab867d6 1572 ret = constraintList_addListFree (ret,
9280addf 1573 exprNode_traversFalseEnsuresConstraints
1574 (exprData_getSingle (data) ) );
1575 break;
1576
1577 case XPR_NULLRETURN:
1578 // cstring_makeLiteral ("return");;
1579 break;
1580
1581 case XPR_FACCESS:
4ab867d6 1582 ret = constraintList_addListFree (ret,
9280addf 1583 exprNode_traversFalseEnsuresConstraints
1584 (exprData_getFieldNode (data) ) );
1585 //exprData_getFieldName (data) ;
1586 break;
1587
1588 case XPR_ARROW:
4ab867d6 1589 ret = constraintList_addListFree (ret,
9280addf 1590 exprNode_traversFalseEnsuresConstraints
1591 (exprData_getFieldNode (data) ) );
1592 // exprData_getFieldName (data);
1593 break;
1594
1595 case XPR_STRINGLITERAL:
1596 // cstring_copy (exprData_getLiteral (data));
1597 break;
1598
1599 case XPR_NUMLIT:
1600 // cstring_copy (exprData_getLiteral (data));
1601 break;
1602 case XPR_POSTOP:
1603
4ab867d6 1604 ret = constraintList_addListFree (ret,
9280addf 1605 exprNode_traversFalseEnsuresConstraints
1606 (exprData_getUopNode (data) ) );
1607 break;
470b7798 1608
1609 case XPR_CAST:
1610
4ab867d6 1611 ret = constraintList_addListFree (ret,
470b7798 1612 exprNode_traversFalseEnsuresConstraints
1613 (exprData_getCastNode (data) ) );
1614 break;
1615
9280addf 1616 default:
1617 break;
1618 }
1619
1620 return ret;
1621}
1622
616915dd 1623
1624/* walk down the tree and get all requires Constraints in each subexpression*/
d46ce6a4 1625/*@only@*/ constraintList exprNode_traversRequiresConstraints (exprNode e)
616915dd 1626{
470b7798 1627 exprNode t1;
616915dd 1628
1629 bool handledExprNode;
1630 // char * mes;
1631 exprData data;
1632 constraintList ret;
1633
1634 if (exprNode_handleError (e))
1635 {
c3e695ff 1636 ret = constraintList_makeNew();
616915dd 1637 return ret;
1638 }
1639 ret = constraintList_copy (e->requiresConstraints );
1640
1641 handledExprNode = TRUE;
1642
1643 data = e->edata;
1644
1645 switch (e->kind)
1646 {
9280addf 1647 case XPR_WHILEPRED:
1648 t1 = exprData_getSingle (data);
4ab867d6 1649 ret = constraintList_addListFree ( ret, exprNode_traversRequiresConstraints (t1) );
9280addf 1650 break;
616915dd 1651
1652 case XPR_FETCH:
1653
4ab867d6 1654 ret = constraintList_addListFree (ret,
616915dd 1655 exprNode_traversRequiresConstraints
1656 (exprData_getPairA (data) ) );
1657
4ab867d6 1658 ret = constraintList_addListFree (ret,
616915dd 1659 exprNode_traversRequiresConstraints
1660 (exprData_getPairB (data) ) );
1661 break;
1662 case XPR_PREOP:
1663
4ab867d6 1664 ret = constraintList_addListFree (ret,
616915dd 1665 exprNode_traversRequiresConstraints
1666 (exprData_getUopNode (data) ) );
1667 break;
1668
1669 case XPR_PARENS:
4ab867d6 1670 ret = constraintList_addListFree (ret, exprNode_traversRequiresConstraints
616915dd 1671 (exprData_getUopNode (data) ) );
1672 break;
1673 case XPR_ASSIGN:
4ab867d6 1674 ret = constraintList_addListFree (ret,
616915dd 1675 exprNode_traversRequiresConstraints
1676 (exprData_getOpA (data) ) );
1677
4ab867d6 1678 ret = constraintList_addListFree (ret,
616915dd 1679 exprNode_traversRequiresConstraints
1680 (exprData_getOpB (data) ) );
1681 break;
1682 case XPR_OP:
4ab867d6 1683 ret = constraintList_addListFree (ret,
616915dd 1684 exprNode_traversRequiresConstraints
1685 (exprData_getOpA (data) ) );
1686
4ab867d6 1687 ret = constraintList_addListFree (ret,
616915dd 1688 exprNode_traversRequiresConstraints
1689 (exprData_getOpB (data) ) );
1690 break;
1691 case XPR_SIZEOFT:
1692
1693 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1694
1695 break;
1696
1697 case XPR_SIZEOF:
1698
4ab867d6 1699 ret = constraintList_addListFree (ret,
616915dd 1700 exprNode_traversRequiresConstraints
1701 (exprData_getSingle (data) ) );
1702 break;
1703
1704 case XPR_CALL:
4ab867d6 1705 ret = constraintList_addListFree (ret,
616915dd 1706 exprNode_traversRequiresConstraints
1707 (exprData_getFcn (data) ) );
1708 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1709 break;
1710
1711 case XPR_RETURN:
4ab867d6 1712 ret = constraintList_addListFree (ret,
616915dd 1713 exprNode_traversRequiresConstraints
1714 (exprData_getSingle (data) ) );
1715 break;
1716
1717 case XPR_NULLRETURN:
1718 // cstring_makeLiteral ("return");;
1719 break;
1720
1721 case XPR_FACCESS:
4ab867d6 1722 ret = constraintList_addListFree (ret,
616915dd 1723 exprNode_traversRequiresConstraints
1724 (exprData_getFieldNode (data) ) );
1725 //exprData_getFieldName (data) ;
1726 break;
1727
1728 case XPR_ARROW:
4ab867d6 1729 ret = constraintList_addListFree (ret,
616915dd 1730 exprNode_traversRequiresConstraints
1731 (exprData_getFieldNode (data) ) );
1732 // exprData_getFieldName (data);
1733 break;
1734
1735 case XPR_STRINGLITERAL:
1736 // cstring_copy (exprData_getLiteral (data));
1737 break;
1738
1739 case XPR_NUMLIT:
1740 // cstring_copy (exprData_getLiteral (data));
1741 break;
1742 case XPR_POSTOP:
1743
4ab867d6 1744 ret = constraintList_addListFree (ret,
616915dd 1745 exprNode_traversRequiresConstraints
1746 (exprData_getUopNode (data) ) );
1747 break;
470b7798 1748
1749 case XPR_CAST:
1750
4ab867d6 1751 ret = constraintList_addListFree (ret,
470b7798 1752 exprNode_traversRequiresConstraints
1753 (exprData_getCastNode (data) ) );
1754 break;
1755
616915dd 1756 default:
1757 break;
1758 }
1759
1760 return ret;
1761}
1762
1763
1764/* walk down the tree and get all Ensures Constraints in each subexpression*/
d46ce6a4 1765/*@only@*/ constraintList exprNode_traversEnsuresConstraints (exprNode e)
616915dd 1766{
470b7798 1767 exprNode t1;
616915dd 1768
1769 bool handledExprNode;
1770 // char * mes;
1771 exprData data;
1772 // constraintExpr tmp;
1773 // constraint cons;
1774 constraintList ret;
1775
1776
1777 if (exprNode_handleError (e))
1778 {
c3e695ff 1779 ret = constraintList_makeNew();
616915dd 1780 return ret;
1781 }
1782
1783 ret = constraintList_copy (e->ensuresConstraints );
1784 handledExprNode = TRUE;
1785
1786 data = e->edata;
1787
1788 DPRINTF( (message (
1789 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1790 exprNode_unparse (e),
1791 constraintList_print(e->ensuresConstraints)
1792 )
1793 ));
1794
1795
1796 switch (e->kind)
1797 {
9280addf 1798 case XPR_WHILEPRED:
1799 t1 = exprData_getSingle (data);
4ab867d6 1800 ret = constraintList_addListFree ( ret,exprNode_traversEnsuresConstraints (t1) );
9280addf 1801 break;
616915dd 1802
1803 case XPR_FETCH:
1804
4ab867d6 1805 ret = constraintList_addListFree (ret,
616915dd 1806 exprNode_traversEnsuresConstraints
1807 (exprData_getPairA (data) ) );
1808
4ab867d6 1809 ret = constraintList_addListFree (ret,
616915dd 1810 exprNode_traversEnsuresConstraints
1811 (exprData_getPairB (data) ) );
1812 break;
1813 case XPR_PREOP:
1814
4ab867d6 1815 ret = constraintList_addListFree (ret,
616915dd 1816 exprNode_traversEnsuresConstraints
1817 (exprData_getUopNode (data) ) );
1818 break;
1819
1820 case XPR_PARENS:
4ab867d6 1821 ret = constraintList_addListFree (ret, exprNode_traversEnsuresConstraints
616915dd 1822 (exprData_getUopNode (data) ) );
1823 break;
1824 case XPR_ASSIGN:
4ab867d6 1825 ret = constraintList_addListFree (ret,
616915dd 1826 exprNode_traversEnsuresConstraints
1827 (exprData_getOpA (data) ) );
1828
4ab867d6 1829 ret = constraintList_addListFree (ret,
616915dd 1830 exprNode_traversEnsuresConstraints
1831 (exprData_getOpB (data) ) );
1832 break;
1833 case XPR_OP:
4ab867d6 1834 ret = constraintList_addListFree (ret,
616915dd 1835 exprNode_traversEnsuresConstraints
1836 (exprData_getOpA (data) ) );
1837
4ab867d6 1838 ret = constraintList_addListFree (ret,
616915dd 1839 exprNode_traversEnsuresConstraints
1840 (exprData_getOpB (data) ) );
1841 break;
1842 case XPR_SIZEOFT:
1843
1844 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1845
1846 break;
1847
1848 case XPR_SIZEOF:
1849
4ab867d6 1850 ret = constraintList_addListFree (ret,
616915dd 1851 exprNode_traversEnsuresConstraints
1852 (exprData_getSingle (data) ) );
1853 break;
1854
1855 case XPR_CALL:
4ab867d6 1856 ret = constraintList_addListFree (ret,
616915dd 1857 exprNode_traversEnsuresConstraints
1858 (exprData_getFcn (data) ) );
1859 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1860 break;
1861
1862 case XPR_RETURN:
4ab867d6 1863 ret = constraintList_addListFree (ret,
616915dd 1864 exprNode_traversEnsuresConstraints
1865 (exprData_getSingle (data) ) );
1866 break;
1867
1868 case XPR_NULLRETURN:
1869 // cstring_makeLiteral ("return");;
1870 break;
1871
1872 case XPR_FACCESS:
4ab867d6 1873 ret = constraintList_addListFree (ret,
616915dd 1874 exprNode_traversEnsuresConstraints
1875 (exprData_getFieldNode (data) ) );
1876 //exprData_getFieldName (data) ;
1877 break;
1878
1879 case XPR_ARROW:
4ab867d6 1880 ret = constraintList_addListFree (ret,
616915dd 1881 exprNode_traversEnsuresConstraints
1882 (exprData_getFieldNode (data) ) );
1883 // exprData_getFieldName (data);
1884 break;
1885
1886 case XPR_STRINGLITERAL:
1887 // cstring_copy (exprData_getLiteral (data));
1888 break;
1889
1890 case XPR_NUMLIT:
1891 // cstring_copy (exprData_getLiteral (data));
1892 break;
1893 case XPR_POSTOP:
1894
4ab867d6 1895 ret = constraintList_addListFree (ret,
616915dd 1896 exprNode_traversEnsuresConstraints
1897 (exprData_getUopNode (data) ) );
1898 break;
470b7798 1899 case XPR_CAST:
1900
4ab867d6 1901 ret = constraintList_addListFree (ret,
470b7798 1902 exprNode_traversEnsuresConstraints
1903 (exprData_getCastNode (data) ) );
1904 break;
1905
616915dd 1906 default:
1907 break;
1908 }
1909DPRINTF( (message (
1910 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1911 exprNode_unparse (e),
1912 // constraintList_print(e->ensuresConstraints),
1913 constraintList_print(ret)
1914 )
1915 ));
1916
1917
1918 return ret;
1919}
1920
28bf4b0b 1921/*drl moved out of constraintResolve.c 07-02-001 */
1922void checkArgumentList (/*@out@*/ exprNode temp, exprNodeList arglist, fileloc sequencePoint)
1923{
1924 temp->requiresConstraints = constraintList_makeNew();
1925 temp->ensuresConstraints = constraintList_makeNew();
1926 temp->trueEnsuresConstraints = constraintList_makeNew();
1927 temp->falseEnsuresConstraints = constraintList_makeNew();
1928
1929 exprNodeList_elements (arglist, el)
1930 {
1931 constraintList temp2;
1932 exprNode_exprTraverse (el, FALSE, FALSE, sequencePoint);
1933 temp2 = el->requiresConstraints;
1934 el->requiresConstraints = exprNode_traversRequiresConstraints(el);
1935 constraintList_free(temp2);
1936
1937 temp2 = el->ensuresConstraints;
1938 el->ensuresConstraints = exprNode_traversEnsuresConstraints(el);
1939 constraintList_free(temp2);
1940
1941 temp->requiresConstraints = constraintList_addList(temp->requiresConstraints,
1942 el->requiresConstraints);
1943
1944 temp->ensuresConstraints = constraintList_addList(temp->ensuresConstraints,
1945 el->ensuresConstraints);
1946 }
1947 end_exprNodeList_elements;
1948
1949}
1950
1951/*drl moved out of constraintResolve.c 07-03-001 */
1952constraintList exprNode_getPostConditions (exprNode fcn, exprNodeList arglist, exprNode fcnCall)
1953{
1954 constraintList postconditions;
1955 uentry temp;
1956 DPRINTF( (message ("Got call that %s ( %s) ", exprNode_unparse(fcn), exprNodeList_unparse (arglist ) ) ) );
1957
1958 temp = exprNode_getUentry (fcn);
1959
1960 postconditions = uentry_getFcnPostconditions (temp);
1961
1962 if (constraintList_isDefined(postconditions) )
1963 {
1964 postconditions = constraintList_doSRefFixConstraintParam (postconditions, arglist);
1965 postconditions = constraintList_doFixResult (postconditions, fcnCall);
1966 }
1967 else
1968 {
1969 postconditions = constraintList_makeNew();
1970 }
1971
1972 return postconditions;
1973}
1974
1975
1976/*drl moved out of constraintResolve.c 07-02-001 */
1977constraintList checkCall (/*@dependent@*/ exprNode fcn, exprNodeList arglist)
1978{
1979 constraintList preconditions;
1980 uentry temp;
1981 DPRINTF( (message ("Got call that %s ( %s) ", exprNode_unparse(fcn), exprNodeList_unparse (arglist ) ) ) );
1982
1983 temp = exprNode_getUentry (fcn);
1984
1985 preconditions = uentry_getFcnPreconditions (temp);
1986
1987 if (constraintList_isDefined(preconditions) )
1988 {
1989 preconditions = constraintList_togglePost (preconditions);
1990 preconditions = constraintList_preserveCallInfo(preconditions, fcn);
1991 preconditions = constraintList_doSRefFixConstraintParam (preconditions, arglist);
1992 }
1993 else
1994 {
1995 if (constraintList_isUndefined(preconditions) )
1996 preconditions = constraintList_makeNew();
1997 }
1998 DPRINTF (( message("Done checkCall\n") ));
1999 DPRINTF (( message("Returning list %q ", constraintList_printDetailed(preconditions) ) ));
2000 return preconditions;
2001}
This page took 0.364569 seconds and 5 git commands to generate.