3 ** constraintGeneration.c
8 # include <ctype.h> /* for isdigit */
9 # include "lclintMacros.nf"
12 # include "cgrammar_tokens.h"
14 # include "exprChecks.h"
15 # include "aliasChecks.h"
16 # include "exprNodeSList.h"
18 //# include "exprDataQuite.i"
20 /*@access exprNode @*/
22 extern void forLoopHeuristics( exprNode e, exprNode forPred, exprNode forBody);
24 //bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e);
25 static bool exprNode_handleError( exprNode p_e);
27 //static cstring exprNode_findConstraints ( exprNode p_e);
28 static bool exprNode_isMultiStatement(exprNode p_e);
29 static void exprNode_multiStatement (exprNode p_e);
31 //static void exprNode_constraintPropagateUp (exprNode p_e);
33 static constraintList exprNode_traversTrueEnsuresConstraints (exprNode e);
34 static constraintList exprNode_traversFalseEnsuresConstraints (exprNode e);
36 exprNode makeDataTypeConstraints (/*@returned@*/ exprNode e);
38 //constraintList constraintList_makeFixedArrayConstraints (sRefSet s);
40 //bool exprNode_testd()
42 /* if ( ( (exprNode_isError ) ) )
51 static bool exprNode_isUnhandled (exprNode e)
53 llassert( exprNode_isDefined(e) );
81 DPRINTF((message ("Warning current constraint generation does not handle expression %s", exprNode_unparse(e)) ) );
93 bool exprNode_handleError( exprNode e)
95 if (exprNode_isError (e) || exprNode_isUnhandled(e) )
97 static /*@only@*/ cstring error = cstring_undefined;
99 if (!cstring_isDefined (error))
101 error = cstring_makeLiteral ("<error>");
104 /*@-unqualifiedtrans*/ return TRUE; /*@=unqualifiedtrans*/
109 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e)
111 if (exprNode_isError (e) )
114 e->requiresConstraints = constraintList_makeNew();
115 e->ensuresConstraints = constraintList_makeNew();
116 e->trueEnsuresConstraints = constraintList_makeNew();
117 e->falseEnsuresConstraints = constraintList_makeNew();
120 if (exprNode_isUnhandled (e) )
122 DPRINTF( (message("Warning ignoring %s", exprNode_unparse (e) ) ) );
127 // e = makeDataTypeConstraints (e);
129 DPRINTF((message ("exprNode_generateConstraints Analysising %s at %s", exprNode_unparse( e),
130 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
132 if (exprNode_isMultiStatement ( e) )
134 exprNode_multiStatement(e);
140 loc = exprNode_getNextSequencePoint(e);
141 exprNode_exprTraverse(e, FALSE, FALSE, loc);
150 c = constraintList_makeFixedArrayConstraints (e->uses);
151 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, c);
153 // e->ensuresConstraints = constraintList_mergeEnsures(c, e->ensuresConstraints);
155 constraintList_free(c);
158 DPRINTF ( (message ("e->requiresConstraints %s", constraintList_printDetailed (e->requiresConstraints) ) ) );
163 /* handles multiple statements */
165 bool exprNode_isMultiStatement(exprNode e)
167 if (exprNode_handleError (e) != NULL)
189 static void exprNode_stmt (exprNode e)
195 if (exprNode_isError(e) )
199 /*e->requiresConstraints = constraintList_makeNew();
200 e->ensuresConstraints = constraintList_makeNew(); */
201 // e = makeDataTypeConstraints(e);
204 DPRINTF(( "STMT:") );
205 s = exprNode_unparse(e);
206 // DPRINTF ( ( message("STMT: %s ") ) );
208 if (e->kind == XPR_INIT)
210 constraintList tempList;
212 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
213 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
214 exprNode_exprTraverse (e, FALSE, FALSE, loc);
217 tempList = e->requiresConstraints;
218 e->requiresConstraints = exprNode_traversRequiresConstraints(e);
219 constraintList_free(tempList);
221 tempList = e->ensuresConstraints;
222 e->ensuresConstraints = exprNode_traversEnsuresConstraints(e);
223 constraintList_free(tempList);
227 if (e->kind != XPR_STMT)
230 DPRINTF (("Not Stmt") );
231 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
232 if (exprNode_isMultiStatement (e) )
234 return exprNode_multiStatement (e );
236 DPRINTF( (message ("Ignoring non-statement %s", exprNode_unparse(e) ) ) );
242 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
244 snode = exprData_getUopNode (e->edata);
246 /* could be stmt involving multiple statements:
247 i.e. if, while for ect.
250 if (exprNode_isMultiStatement (snode))
252 exprNode_multiStatement (snode);
253 (void) exprNode_copyConstraints (e, snode);
257 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
259 exprNode_exprTraverse (snode, FALSE, FALSE, loc);
263 constraintList_free (e->requiresConstraints);
264 e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
265 // printf ("For: %s \n", exprNode_unparse (e) );
266 // printf ("%s\n", constraintList_print(e->requiresConstraints) );
268 constraintList_free (e->ensuresConstraints);
269 e->ensuresConstraints = exprNode_traversEnsuresConstraints(snode);
270 // printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
271 // llassert(notError);
273 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
274 constraintList_print(e->requiresConstraints),
275 constraintList_print(e->ensuresConstraints) ) ) );
282 static void exprNode_stmtList (exprNode e)
284 exprNode stmt1, stmt2;
285 if (exprNode_isError (e) )
291 e->requiresConstraints = constraintList_makeNew();
292 e->ensuresConstraints = constraintList_makeNew();
294 // e = makeDataTypeConstraints(e);
296 /*Handle case of stmtList with only one statement:
297 The parse tree stores this as stmt instead of stmtList*/
298 if (e->kind != XPR_STMTLIST)
303 llassert (e->kind == XPR_STMTLIST);
304 DPRINTF(( "STMTLIST:") );
305 DPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
306 stmt1 = exprData_getPairA (e->edata);
307 stmt2 = exprData_getPairB (e->edata);
310 DPRINTF((" stmtlist ") );
311 DPRINTF ((message("XW%s | %s", exprNode_unparse(stmt1), exprNode_unparse(stmt2) ) ) );
313 exprNode_stmt (stmt1);
314 DPRINTF(("\nstmt after stmtList call " ));
316 exprNode_stmt (stmt2);
317 mergeResolve (e, stmt1, stmt2 );
319 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
320 constraintList_print(e->requiresConstraints),
321 constraintList_print(e->ensuresConstraints) ) ) );
325 static exprNode doIf (/*@returned@*/ exprNode e, exprNode test, exprNode body)
329 DPRINTF ((message ("doIf: %s ", exprNode_unparse(e) ) ) );
331 llassert(exprNode_isDefined(test) );
332 llassert (exprNode_isDefined (e) );
333 llassert (exprNode_isDefined (body) );
336 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
338 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
340 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
342 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
346 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
348 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
350 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->trueEnsuresConstraints) ) ));
352 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->falseEnsuresConstraints) ) ));
356 temp = test->trueEnsuresConstraints;
357 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
358 constraintList_free(temp);
360 temp = test->ensuresConstraints;
361 test->ensuresConstraints = exprNode_traversEnsuresConstraints (test);
362 constraintList_free(temp);
364 temp = test->requiresConstraints;
365 test->requiresConstraints = exprNode_traversRequiresConstraints (test);
366 constraintList_free(temp);
369 test->trueEnsuresConstraints = constraintList_substituteFreeTarget(test->trueEnsuresConstraints, test->ensuresConstraints);
371 DPRINTF ((message ("doIf: test ensures %s ", constraintList_print(test->ensuresConstraints) ) ) );
373 DPRINTF ((message ("doIf: test true ensures %s ", constraintList_print(test->trueEnsuresConstraints) ) ) );
375 constraintList_free(e->requiresConstraints);
376 e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
378 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints,
379 test->ensuresConstraints);
380 temp = e->requiresConstraints;
381 e->requiresConstraints = constraintList_mergeRequires (e->requiresConstraints, test->requiresConstraints);
382 constraintList_free(temp);
386 constraintList_free(e->ensuresConstraints);
387 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
389 if (exprNode_mayEscape (body) )
391 DPRINTF (( message("doIf: the if statement body %s returns or exits", exprNode_unparse(body) ) ));
392 e->ensuresConstraints = constraintList_mergeEnsuresFreeFirst (e->ensuresConstraints,
393 test->falseEnsuresConstraints);
396 DPRINTF ((message ("doIf: if requiers %s ", constraintList_print(e->requiresConstraints) ) ) );
402 Also used for condition i.e. ?: operation
405 This function assumes that p, trueBranch, falseBranch have have all been traversed
406 for constraints i.e. we assume that exprNode_traversEnsuresConstraints,
407 exprNode_traversRequiresConstraints, exprNode_traversTrueEnsuresConstraints,
408 exprNode_traversFalseEnsuresConstraints have all been run
412 static exprNode doIfElse (/*@returned@*/ exprNode e, exprNode p, exprNode trueBranch, exprNode falseBranch)
415 constraintList c1, cons, t, t2, f, f2;
417 DPRINTF ((message ("doIfElse: %s ", exprNode_unparse(e) ) ) );
419 // do requires clauses
420 c1 = constraintList_copy (p->ensuresConstraints);
422 t = reflectChanges (trueBranch->requiresConstraints, p->trueEnsuresConstraints);
423 t = reflectChangesFreePre (t, p->ensuresConstraints);
425 cons = reflectChanges (falseBranch->requiresConstraints, p->falseEnsuresConstraints);
426 cons = reflectChangesFreePre (cons, c1);
428 constraintList_free(e->requiresConstraints);
429 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (t, cons);
430 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (e->requiresConstraints, p->requiresConstraints);
432 // do ensures clauses
433 // find the the ensures lists for each subbranch
434 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
436 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
437 constraintList_free(t2);
439 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
441 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
442 constraintList_free(f2);
444 // find ensures for whole if/else statement
446 constraintList_free(e->ensuresConstraints);
448 e->ensuresConstraints = constraintList_logicalOr (t, f);
450 constraintList_free(t);
451 constraintList_free(f);
452 constraintList_free(cons);
453 constraintList_free(c1);
455 DPRINTF ((message ("doIfElse: if requires %q ", constraintList_print(e->requiresConstraints) ) ) );
456 DPRINTF ((message ("doIfElse: if ensures %q ", constraintList_print(e->ensuresConstraints) ) ) );
461 static exprNode doWhile (/*@returned@*/ exprNode e, exprNode test, exprNode body)
463 DPRINTF ((message ("doWhile: %s ", exprNode_unparse(e) ) ) );
464 return doIf (e, test, body);
467 /*@only@*/ constraintList constraintList_makeFixedArrayConstraints (/*@observer@*/ sRefSet s)
471 ret = constraintList_makeNew();
473 sRefSet_elements (s, el)
476 if (sRef_isFixedArray(el) )
479 DPRINTF( (message("%s is a fixed array",
480 sRef_unparse(el)) ) );
481 //if (el->kind == SK_DERIVED)
482 // break; //hack until I find the real problem
483 size = sRef_getArraySize(el);
484 DPRINTF( (message("%s is a fixed array with size %d",
485 sRef_unparse(el), (int)size) ) );
486 con = constraint_makeSRefSetBufferSize (el, (size - 1));
487 //con = constraint_makeSRefWriteSafeInt (el, (size - 1));
488 ret = constraintList_add(ret, con);
492 DPRINTF( (message("%s is not a fixed array",
493 sRef_unparse(el)) ) );
496 if (sRef_isExternallyVisible (el) )
498 /*DPRINTF( (message("%s is externally visible",
499 sRef_unparse(el) ) ));
500 con = constraint_makeSRefWriteSafeInt(el, 0);
501 ret = constraintList_add(ret, con);
503 con = constraint_makeSRefReadSafeInt(el, 0);
505 ret = constraintList_add(ret, con);*/
511 DPRINTF(( message("constraintList_makeFixedArrayConstraints returning %s",
512 constraintList_print(ret) ) ));
516 exprNode makeDataTypeConstraints (/*@returned@*/ exprNode e)
519 DPRINTF(("makeDataTypeConstraints"));
521 c = constraintList_makeFixedArrayConstraints (e->uses);
523 e->ensuresConstraints = constraintList_addListFree (e->ensuresConstraints, c);
528 static void doFor (exprNode e, exprNode forPred, exprNode forBody)
530 exprNode init, test, inc;
531 //merge the constraints: modle as if statement
536 init = exprData_getTripleInit (forPred->edata);
537 test = exprData_getTripleTest (forPred->edata);
538 inc = exprData_getTripleInc (forPred->edata);
540 if ( ( (exprNode_isError (test) /*|| (exprNode_isError(init) )*/ ) || (exprNode_isError (inc) ) ) )
542 DPRINTF ((message ("strange for statement:%s, ignoring it", exprNode_unparse(e) ) ) );
546 forLoopHeuristics(e, forPred, forBody);
548 constraintList_free(e->requiresConstraints);
549 e->requiresConstraints = reflectChanges (forBody->requiresConstraints, test->ensuresConstraints);
550 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, test->trueEnsuresConstraints);
551 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, forPred->ensuresConstraints);
553 if (!forBody->canBreak)
555 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints, constraintList_copy(forPred->ensuresConstraints) );
556 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints,constraintList_copy( test->falseEnsuresConstraints));
557 // forPred->ensuresConstraints = constraintList_undefined;
558 // test->falseEnsuresConstraints = constraintList_undefined;
562 DPRINTF(("Can break") );
567 static exprNode doSwitch (/*@returned@*/ exprNode e)
574 //DPRINTF (( message ("doSwitch for: switch (%s) %s",
575 // exprNode_unparse (exprData_getPairA (data)),
576 // exprNode_unparse (exprData_getPairB (data))) ));
578 body = exprData_getPairB (data);
580 // exprNode_generateConstraints(body);
582 // e->requiresConstraints = constraintList_copy ( body->requiresConstraints );
583 //e->ensuresConstraints = constraintList_copy ( body->ensuresConstraints );
589 void exprNode_multiStatement (exprNode e)
595 exprNode p, trueBranch, falseBranch;
596 exprNode forPred, forBody;
601 // constraintList t, f;
602 /*e->requiresConstraints = constraintList_makeNew();
603 e->ensuresConstraints = constraintList_makeNew();
604 e->trueEnsuresConstraints = constraintList_makeNew();
605 e->falseEnsuresConstraints = constraintList_makeNew();
607 // e = makeDataTypeConstraints(e);
609 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
610 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
612 if (exprNode_handleError (e))
625 // ret = message ("%s %s",
626 forPred = exprData_getPairA (data);
627 forBody = exprData_getPairB (data);
629 //first generate the constraints
630 exprNode_generateConstraints (forPred);
631 exprNode_generateConstraints (forBody);
634 doFor (e, forPred, forBody);
639 // ret = message ("for (%s; %s; %s)",
640 exprNode_generateConstraints (exprData_getTripleInit (data) );
641 test = exprData_getTripleTest (data);
642 exprNode_exprTraverse (test,FALSE, FALSE, exprNode_loc(e));
643 exprNode_generateConstraints (exprData_getTripleInc (data) );
645 if (!exprNode_isError(test) )
647 constraintList temp2;
648 temp2 = test->trueEnsuresConstraints;
649 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
650 constraintList_free(temp2);
653 exprNode_generateConstraints (exprData_getTripleInc (data));
657 e1 = exprData_getPairA (data);
658 e2 = exprData_getPairB (data);
660 exprNode_exprTraverse (e1,
661 FALSE, FALSE, exprNode_loc(e1));
663 exprNode_generateConstraints (e2);
665 e = doWhile (e, e1, e2);
671 DPRINTF ((exprNode_unparse(e) ) );
672 // ret = message ("if (%s) %s",
673 e1 = exprData_getPairA (data);
674 e2 = exprData_getPairB (data);
676 exprNode_exprTraverse (e1,
677 FALSE, FALSE, exprNode_loc(e1));
679 exprNode_generateConstraints (e2);
680 e = doIf (e, e1, e2);
683 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
688 DPRINTF(("Starting IFELSE"));
689 // ret = message ("if (%s) %s else %s",
690 p = exprData_getTriplePred (data);
691 trueBranch = exprData_getTripleTrue (data);
692 falseBranch = exprData_getTripleFalse (data);
694 exprNode_exprTraverse (p,
695 FALSE, FALSE, exprNode_loc(p));
696 exprNode_generateConstraints (trueBranch);
697 exprNode_generateConstraints (falseBranch);
699 temp = p->ensuresConstraints;
700 p->ensuresConstraints = exprNode_traversEnsuresConstraints (p);
701 constraintList_free(temp);
703 temp = p->requiresConstraints;
704 p->requiresConstraints = exprNode_traversRequiresConstraints (p);
705 constraintList_free(temp);
707 temp = p->trueEnsuresConstraints;
708 p->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(p);
709 constraintList_free(temp);
711 temp = p->falseEnsuresConstraints;
712 p->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(p);
713 constraintList_free(temp);
715 e = doIfElse (e, p, trueBranch, falseBranch);
716 DPRINTF( ("Done IFELSE") );
721 e2 = (exprData_getPairB (data));
722 e1 = (exprData_getPairA (data));
724 DPRINTF((message ("do { %s } while (%s)", exprNode_unparse(e2), exprNode_unparse(e1) ) ));
725 exprNode_generateConstraints (e2);
726 exprNode_generateConstraints (e1);
727 e = exprNode_copyConstraints (e, e2);
728 DPRINTF ((message ("e = %s ", constraintList_print(e->requiresConstraints) ) ));
733 // ret = message ("{ %s }",
734 exprNode_generateConstraints (exprData_getSingle (data));
736 constraintList_free(e->requiresConstraints);
737 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
739 constraintList_free(e->ensuresConstraints);
740 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
741 // e->constraints = (exprData_getSingle (data))->constraints;
749 exprNode_stmtList (e);
759 static bool lltok_isBoolean_Op (lltok tok)
761 /*this should really be a switch statement but
762 I don't want to violate the abstraction
763 maybe this should go in lltok.c */
765 if (lltok_isEq_Op (tok) )
769 if (lltok_isAnd_Op (tok) )
775 if (lltok_isOr_Op (tok) )
780 if (lltok_isGt_Op (tok) )
784 if (lltok_isLt_Op (tok) )
789 if (lltok_isLe_Op (tok) )
794 if (lltok_isGe_Op (tok) )
804 static void exprNode_booleanTraverse (exprNode e, /*@unused@*/ bool definatelv, /*@unused@*/ bool definaterv, fileloc sequencePoint)
810 constraintList tempList, temp;
813 tok = exprData_getOpTok (data);
816 t1 = exprData_getOpA (data);
817 t2 = exprData_getOpB (data);
820 tempList = constraintList_undefined;
822 /* arithmetic tests */
824 if (lltok_isEq_Op (tok) )
826 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
827 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
831 if (lltok_isLt_Op (tok) )
833 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
834 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
835 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
836 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
840 if (lltok_isGe_Op (tok) )
843 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
844 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
846 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
847 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
852 if (lltok_isGt_Op (tok) )
854 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
855 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
856 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
857 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
860 if (lltok_isLe_Op (tok) )
862 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
863 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
865 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
866 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
871 /*Logical operations */
874 if (lltok_isAnd_Op (tok) )
878 tempList = constraintList_copy (t1->trueEnsuresConstraints);
879 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
880 e->trueEnsuresConstraints = constraintList_addListFree(e->trueEnsuresConstraints, tempList);
882 //false ensures: fens t1 or tens t1 and fens t2
883 tempList = constraintList_copy (t1->trueEnsuresConstraints);
884 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
886 tempList = constraintList_logicalOr (tempList, t1->falseEnsuresConstraints);
887 constraintList_free(temp);
889 e->falseEnsuresConstraints =constraintList_addList(e->falseEnsuresConstraints, tempList);
892 else if (lltok_isOr_Op (tok) )
895 tempList = constraintList_copy (t1->falseEnsuresConstraints);
896 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
897 e->falseEnsuresConstraints = constraintList_addListFree(e->falseEnsuresConstraints, tempList);
899 //true ensures: tens t1 or fens t1 and tens t2
900 tempList = constraintList_copy (t1->falseEnsuresConstraints);
901 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
904 tempList = constraintList_logicalOr (tempList, t1->trueEnsuresConstraints);
905 constraintList_free(temp);
908 e->trueEnsuresConstraints =constraintList_addListFree(e->trueEnsuresConstraints, tempList);
909 tempList = constraintList_undefined;
915 DPRINTF((message("%s is not a boolean operation", lltok_unparse(tok) ) ));
920 void exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, /*@observer@*/ fileloc sequencePoint)
922 exprNode t1, t2, fcn;
924 bool handledExprNode;
930 if (exprNode_isError(e) )
935 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
936 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
938 /*e->requiresConstraints = constraintList_makeNew();
939 e->ensuresConstraints = constraintList_makeNew();
940 e->trueEnsuresConstraints = constraintList_makeNew();;
941 e->falseEnsuresConstraints = constraintList_makeNew();;
943 if (exprNode_isUnhandled (e) )
947 // e = makeDataTypeConstraints (e);
949 handledExprNode = TRUE;
956 t1 = exprData_getSingle (data);
957 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint);
958 e = exprNode_copyConstraints (e, t1);
965 t1 = (exprData_getPairA (data) );
966 t2 = (exprData_getPairB (data) );
967 cons = constraint_makeWriteSafeExprNode (t1, t2);
971 t1 = (exprData_getPairA (data) );
972 t2 = (exprData_getPairB (data) );
973 cons = constraint_makeReadSafeExprNode (t1, t2 );
976 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
977 cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
978 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
980 cons = constraint_makeEnsureLteMaxRead (t2, t1);
981 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
983 // cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
984 // e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
986 exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
987 exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
989 /*@i325 Should check which is array/index. */
993 exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
994 // e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
1004 t = exprData_getInitId (data);
1005 ue = usymtab_lookup (idDecl_observeId (t));
1006 lhs = exprNode_createId (ue);
1008 t2 = exprData_getInitNode (data);
1010 /* DPRINTF(( (message("initialization: %s = %s",
1011 exprNode_unparse(lhs),
1012 exprNode_unparse(t2)
1016 //exprNode_exprTraverse (t1, TRUE, FALSE, sequencePoint );
1018 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1020 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
1021 if ( (!exprNode_isError (e)) && (!exprNode_isError(t2)) )
1023 cons = constraint_makeEnsureEqual (e, t2, sequencePoint);
1024 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1030 t1 = exprData_getOpA (data);
1031 t2 = exprData_getOpB (data);
1032 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1033 //lltok_unparse (exprData_getOpTok (data));
1035 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1037 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
1038 if ( (!exprNode_isError (t1)) && (!exprNode_isError(t2)) )
1040 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
1041 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1045 t1 = exprData_getOpA (data);
1046 t2 = exprData_getOpB (data);
1047 tok = exprData_getOpTok (data);
1050 if (tok.tok == ADD_ASSIGN)
1052 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1053 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1055 cons = constraint_makeAddAssign (t1, t2, sequencePoint );
1056 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1058 else if (tok.tok == SUB_ASSIGN)
1060 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1061 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1063 cons = constraint_makeSubtractAssign (t1, t2, sequencePoint );
1064 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1068 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1069 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1072 if (lltok_isBoolean_Op (tok) )
1073 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
1075 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
1078 #warning make sure the case can be ignored..
1083 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1084 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
1088 fcn = exprData_getFcn(data);
1090 exprNode_exprTraverse (fcn, definatelv, definaterv, sequencePoint );
1091 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(fcn), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
1093 fcn->requiresConstraints = constraintList_addListFree (fcn->requiresConstraints,
1094 checkCall (fcn, exprData_getArgs (data) ) );
1096 fcn->ensuresConstraints = constraintList_addListFree (fcn->ensuresConstraints,
1097 getPostConditions(fcn, exprData_getArgs (data),e ) );
1099 t1 = exprNode_createNew (exprNode_getType (e) );
1101 checkArgumentList (t1, exprData_getArgs(data), sequencePoint);
1104 mergeResolve (e, t1, fcn);
1108 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
1113 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1116 case XPR_NULLRETURN:
1122 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
1126 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
1129 case XPR_STRINGLITERAL:
1138 t1 = exprData_getUopNode(data);
1139 tok = (exprData_getUopTok (data));
1140 //lltok_unparse (exprData_getUopTok (data));
1141 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1142 /*handle * pointer access */
1143 if (lltok_isInc_Op (tok) )
1145 DPRINTF(("doing ++(var)"));
1146 t1 = exprData_getUopNode (data);
1147 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1148 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1150 else if (lltok_isDec_Op (tok) )
1152 DPRINTF(("doing --(var)"));
1153 t1 = exprData_getUopNode (data);
1154 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1155 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1157 else if (lltok_isMult( tok ) )
1161 cons = constraint_makeWriteSafeInt (t1, 0);
1165 cons = constraint_makeReadSafeInt (t1, 0);
1167 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
1169 else if (lltok_isNot_Op (tok) )
1172 constraintList_free(e->trueEnsuresConstraints);
1174 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
1175 constraintList_free(e->falseEnsuresConstraints);
1176 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
1179 else if (lltok_isAmpersand_Op (tok) )
1183 else if (lltok_isMinus_Op (tok) )
1187 else if ( lltok_isExcl_Op (tok) )
1191 else if (lltok_isTilde_Op (tok) )
1197 llcontbug((message("Unsupported preop in %s", exprNode_unparse(e) ) ));
1204 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
1206 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
1208 DPRINTF(("doing ++"));
1209 t1 = exprData_getUopNode (data);
1210 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1211 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1213 if (lltok_isDec_Op (exprData_getUopTok (data) ) )
1215 DPRINTF(("doing --"));
1216 t1 = exprData_getUopNode (data);
1217 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1218 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1223 t2 = exprData_getCastNode (data);
1224 DPRINTF (( message ("Examining cast (%q)%s",
1225 qtype_unparse (exprData_getCastType (data)),
1226 exprNode_unparse (t2) )
1228 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1234 exprNode pred, true, false;
1236 pred = exprData_getTriplePred (data);
1237 true = exprData_getTripleTrue (data);
1238 false = exprData_getTripleFalse (data);
1240 exprNode_exprTraverse (pred, FALSE, TRUE, sequencePoint );
1242 temp = pred->ensuresConstraints;
1243 pred->ensuresConstraints = exprNode_traversEnsuresConstraints(pred);
1244 constraintList_free(temp);
1246 temp = pred->requiresConstraints;
1247 pred->requiresConstraints = exprNode_traversRequiresConstraints(pred);
1248 constraintList_free(temp);
1250 temp = pred->trueEnsuresConstraints;
1251 pred->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(pred);
1252 constraintList_free(temp);
1254 temp = pred->falseEnsuresConstraints;
1255 pred->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(pred);
1256 constraintList_free(temp);
1259 exprNode_exprTraverse (true, FALSE, TRUE, sequencePoint );
1261 temp = true->ensuresConstraints;
1262 true->ensuresConstraints = exprNode_traversEnsuresConstraints(true);
1263 constraintList_free(temp);
1266 temp = true->requiresConstraints;
1267 true->requiresConstraints = exprNode_traversRequiresConstraints(true);
1268 constraintList_free(temp);
1271 temp = true->trueEnsuresConstraints;
1272 true->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(true);
1273 constraintList_free(temp);
1275 temp = true->falseEnsuresConstraints;
1276 true->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(true);
1277 constraintList_free(temp);
1280 exprNode_exprTraverse (false, FALSE, TRUE, sequencePoint );
1282 temp = false->ensuresConstraints;
1283 false->ensuresConstraints = exprNode_traversEnsuresConstraints(false);
1284 constraintList_free(temp);
1287 temp = false->requiresConstraints;
1288 false->requiresConstraints = exprNode_traversRequiresConstraints(false);
1289 constraintList_free(temp);
1292 temp = false->trueEnsuresConstraints;
1293 false->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(false);
1294 constraintList_free(temp);
1296 temp = false->falseEnsuresConstraints;
1297 false->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(false);
1298 constraintList_free(temp);
1300 /* if pred is true e equals true otherwise pred equals false */
1302 cons = constraint_makeEnsureEqual (e, true, sequencePoint);
1303 true->ensuresConstraints = constraintList_add(true->ensuresConstraints, cons);
1305 cons = constraint_makeEnsureEqual (e, true, sequencePoint);
1306 false->ensuresConstraints = constraintList_add(false->ensuresConstraints, cons);
1308 e = doIfElse (e, pred, true, false);
1314 t1 = exprData_getPairA (data);
1315 t2 = exprData_getPairB (data);
1316 /* we essiantially treat this like expr1; expr2
1317 of course sequencePoint isn't adjusted so this isn't completely accurate
1319 exprNode_exprTraverse (t1, FALSE, FALSE, sequencePoint );
1320 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1321 mergeResolve (e, t1, t2);
1325 handledExprNode = FALSE;
1328 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
1329 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
1330 e->requiresConstraints = constraintList_addGeneratingExpr ( e->requiresConstraints, e);
1332 e->ensuresConstraints = constraintList_addGeneratingExpr ( e->ensuresConstraints, e);
1334 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
1336 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
1338 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
1340 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
1342 return; // handledExprNode;
1346 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
1350 bool handledExprNode;
1355 if (exprNode_handleError (e))
1357 ret = constraintList_makeNew();
1360 ret = constraintList_copy (e->trueEnsuresConstraints );
1362 handledExprNode = TRUE;
1369 t1 = exprData_getSingle (data);
1370 ret = constraintList_addListFree ( ret, exprNode_traversTrueEnsuresConstraints (t1) );
1375 ret = constraintList_addListFree (ret,
1376 exprNode_traversTrueEnsuresConstraints
1377 (exprData_getPairA (data) ) );
1379 ret = constraintList_addListFree (ret,
1380 exprNode_traversTrueEnsuresConstraints
1381 (exprData_getPairB (data) ) );
1385 ret = constraintList_addListFree (ret,
1386 exprNode_traversTrueEnsuresConstraints
1387 (exprData_getUopNode (data) ) );
1391 ret = constraintList_addListFree (ret, exprNode_traversTrueEnsuresConstraints
1392 (exprData_getUopNode (data) ) );
1395 ret = constraintList_addListFree (ret,
1396 exprNode_traversTrueEnsuresConstraints
1397 (exprData_getOpA (data) ) );
1399 ret = constraintList_addListFree (ret,
1400 exprNode_traversTrueEnsuresConstraints
1401 (exprData_getOpB (data) ) );
1404 ret = constraintList_addListFree (ret,
1405 exprNode_traversTrueEnsuresConstraints
1406 (exprData_getOpA (data) ) );
1408 ret = constraintList_addListFree (ret,
1409 exprNode_traversTrueEnsuresConstraints
1410 (exprData_getOpB (data) ) );
1414 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1420 ret = constraintList_addListFree (ret,
1421 exprNode_traversTrueEnsuresConstraints
1422 (exprData_getSingle (data) ) );
1426 ret = constraintList_addListFree (ret,
1427 exprNode_traversTrueEnsuresConstraints
1428 (exprData_getFcn (data) ) );
1429 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1433 ret = constraintList_addListFree (ret,
1434 exprNode_traversTrueEnsuresConstraints
1435 (exprData_getSingle (data) ) );
1438 case XPR_NULLRETURN:
1439 // cstring_makeLiteral ("return");;
1443 ret = constraintList_addListFree (ret,
1444 exprNode_traversTrueEnsuresConstraints
1445 (exprData_getFieldNode (data) ) );
1446 //exprData_getFieldName (data) ;
1450 ret = constraintList_addListFree (ret,
1451 exprNode_traversTrueEnsuresConstraints
1452 (exprData_getFieldNode (data) ) );
1453 // exprData_getFieldName (data);
1456 case XPR_STRINGLITERAL:
1457 // cstring_copy (exprData_getLiteral (data));
1461 // cstring_copy (exprData_getLiteral (data));
1465 ret = constraintList_addListFree (ret,
1466 exprNode_traversTrueEnsuresConstraints
1467 (exprData_getUopNode (data) ) );
1472 ret = constraintList_addListFree (ret,
1473 exprNode_traversTrueEnsuresConstraints
1474 (exprData_getCastNode (data) ) );
1484 constraintList exprNode_traversFalseEnsuresConstraints (exprNode e)
1488 bool handledExprNode;
1493 if (exprNode_handleError (e))
1495 ret = constraintList_makeNew();
1498 ret = constraintList_copy (e->falseEnsuresConstraints );
1500 handledExprNode = TRUE;
1507 t1 = exprData_getSingle (data);
1508 ret = constraintList_addListFree ( ret,exprNode_traversFalseEnsuresConstraints (t1) );
1513 ret = constraintList_addListFree (ret,
1514 exprNode_traversFalseEnsuresConstraints
1515 (exprData_getPairA (data) ) );
1517 ret = constraintList_addListFree (ret,
1518 exprNode_traversFalseEnsuresConstraints
1519 (exprData_getPairB (data) ) );
1523 ret = constraintList_addListFree (ret,
1524 exprNode_traversFalseEnsuresConstraints
1525 (exprData_getUopNode (data) ) );
1529 ret = constraintList_addListFree (ret, exprNode_traversFalseEnsuresConstraints
1530 (exprData_getUopNode (data) ) );
1533 ret = constraintList_addListFree (ret,
1534 exprNode_traversFalseEnsuresConstraints
1535 (exprData_getOpA (data) ) );
1537 ret = constraintList_addListFree (ret,
1538 exprNode_traversFalseEnsuresConstraints
1539 (exprData_getOpB (data) ) );
1542 ret = constraintList_addListFree (ret,
1543 exprNode_traversFalseEnsuresConstraints
1544 (exprData_getOpA (data) ) );
1546 ret = constraintList_addListFree (ret,
1547 exprNode_traversFalseEnsuresConstraints
1548 (exprData_getOpB (data) ) );
1552 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1558 ret = constraintList_addListFree (ret,
1559 exprNode_traversFalseEnsuresConstraints
1560 (exprData_getSingle (data) ) );
1564 ret = constraintList_addListFree (ret,
1565 exprNode_traversFalseEnsuresConstraints
1566 (exprData_getFcn (data) ) );
1567 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1571 ret = constraintList_addListFree (ret,
1572 exprNode_traversFalseEnsuresConstraints
1573 (exprData_getSingle (data) ) );
1576 case XPR_NULLRETURN:
1577 // cstring_makeLiteral ("return");;
1581 ret = constraintList_addListFree (ret,
1582 exprNode_traversFalseEnsuresConstraints
1583 (exprData_getFieldNode (data) ) );
1584 //exprData_getFieldName (data) ;
1588 ret = constraintList_addListFree (ret,
1589 exprNode_traversFalseEnsuresConstraints
1590 (exprData_getFieldNode (data) ) );
1591 // exprData_getFieldName (data);
1594 case XPR_STRINGLITERAL:
1595 // cstring_copy (exprData_getLiteral (data));
1599 // cstring_copy (exprData_getLiteral (data));
1603 ret = constraintList_addListFree (ret,
1604 exprNode_traversFalseEnsuresConstraints
1605 (exprData_getUopNode (data) ) );
1610 ret = constraintList_addListFree (ret,
1611 exprNode_traversFalseEnsuresConstraints
1612 (exprData_getCastNode (data) ) );
1623 /* walk down the tree and get all requires Constraints in each subexpression*/
1624 /*@only@*/ constraintList exprNode_traversRequiresConstraints (exprNode e)
1628 bool handledExprNode;
1633 if (exprNode_handleError (e))
1635 ret = constraintList_makeNew();
1638 ret = constraintList_copy (e->requiresConstraints );
1640 handledExprNode = TRUE;
1647 t1 = exprData_getSingle (data);
1648 ret = constraintList_addListFree ( ret, exprNode_traversRequiresConstraints (t1) );
1653 ret = constraintList_addListFree (ret,
1654 exprNode_traversRequiresConstraints
1655 (exprData_getPairA (data) ) );
1657 ret = constraintList_addListFree (ret,
1658 exprNode_traversRequiresConstraints
1659 (exprData_getPairB (data) ) );
1663 ret = constraintList_addListFree (ret,
1664 exprNode_traversRequiresConstraints
1665 (exprData_getUopNode (data) ) );
1669 ret = constraintList_addListFree (ret, exprNode_traversRequiresConstraints
1670 (exprData_getUopNode (data) ) );
1673 ret = constraintList_addListFree (ret,
1674 exprNode_traversRequiresConstraints
1675 (exprData_getOpA (data) ) );
1677 ret = constraintList_addListFree (ret,
1678 exprNode_traversRequiresConstraints
1679 (exprData_getOpB (data) ) );
1682 ret = constraintList_addListFree (ret,
1683 exprNode_traversRequiresConstraints
1684 (exprData_getOpA (data) ) );
1686 ret = constraintList_addListFree (ret,
1687 exprNode_traversRequiresConstraints
1688 (exprData_getOpB (data) ) );
1692 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1698 ret = constraintList_addListFree (ret,
1699 exprNode_traversRequiresConstraints
1700 (exprData_getSingle (data) ) );
1704 ret = constraintList_addListFree (ret,
1705 exprNode_traversRequiresConstraints
1706 (exprData_getFcn (data) ) );
1707 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1711 ret = constraintList_addListFree (ret,
1712 exprNode_traversRequiresConstraints
1713 (exprData_getSingle (data) ) );
1716 case XPR_NULLRETURN:
1717 // cstring_makeLiteral ("return");;
1721 ret = constraintList_addListFree (ret,
1722 exprNode_traversRequiresConstraints
1723 (exprData_getFieldNode (data) ) );
1724 //exprData_getFieldName (data) ;
1728 ret = constraintList_addListFree (ret,
1729 exprNode_traversRequiresConstraints
1730 (exprData_getFieldNode (data) ) );
1731 // exprData_getFieldName (data);
1734 case XPR_STRINGLITERAL:
1735 // cstring_copy (exprData_getLiteral (data));
1739 // cstring_copy (exprData_getLiteral (data));
1743 ret = constraintList_addListFree (ret,
1744 exprNode_traversRequiresConstraints
1745 (exprData_getUopNode (data) ) );
1750 ret = constraintList_addListFree (ret,
1751 exprNode_traversRequiresConstraints
1752 (exprData_getCastNode (data) ) );
1763 /* walk down the tree and get all Ensures Constraints in each subexpression*/
1764 /*@only@*/ constraintList exprNode_traversEnsuresConstraints (exprNode e)
1768 bool handledExprNode;
1771 // constraintExpr tmp;
1776 if (exprNode_handleError (e))
1778 ret = constraintList_makeNew();
1782 ret = constraintList_copy (e->ensuresConstraints );
1783 handledExprNode = TRUE;
1788 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1789 exprNode_unparse (e),
1790 constraintList_print(e->ensuresConstraints)
1798 t1 = exprData_getSingle (data);
1799 ret = constraintList_addListFree ( ret,exprNode_traversEnsuresConstraints (t1) );
1804 ret = constraintList_addListFree (ret,
1805 exprNode_traversEnsuresConstraints
1806 (exprData_getPairA (data) ) );
1808 ret = constraintList_addListFree (ret,
1809 exprNode_traversEnsuresConstraints
1810 (exprData_getPairB (data) ) );
1814 ret = constraintList_addListFree (ret,
1815 exprNode_traversEnsuresConstraints
1816 (exprData_getUopNode (data) ) );
1820 ret = constraintList_addListFree (ret, exprNode_traversEnsuresConstraints
1821 (exprData_getUopNode (data) ) );
1824 ret = constraintList_addListFree (ret,
1825 exprNode_traversEnsuresConstraints
1826 (exprData_getOpA (data) ) );
1828 ret = constraintList_addListFree (ret,
1829 exprNode_traversEnsuresConstraints
1830 (exprData_getOpB (data) ) );
1833 ret = constraintList_addListFree (ret,
1834 exprNode_traversEnsuresConstraints
1835 (exprData_getOpA (data) ) );
1837 ret = constraintList_addListFree (ret,
1838 exprNode_traversEnsuresConstraints
1839 (exprData_getOpB (data) ) );
1843 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1849 ret = constraintList_addListFree (ret,
1850 exprNode_traversEnsuresConstraints
1851 (exprData_getSingle (data) ) );
1855 ret = constraintList_addListFree (ret,
1856 exprNode_traversEnsuresConstraints
1857 (exprData_getFcn (data) ) );
1858 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1862 ret = constraintList_addListFree (ret,
1863 exprNode_traversEnsuresConstraints
1864 (exprData_getSingle (data) ) );
1867 case XPR_NULLRETURN:
1868 // cstring_makeLiteral ("return");;
1872 ret = constraintList_addListFree (ret,
1873 exprNode_traversEnsuresConstraints
1874 (exprData_getFieldNode (data) ) );
1875 //exprData_getFieldName (data) ;
1879 ret = constraintList_addListFree (ret,
1880 exprNode_traversEnsuresConstraints
1881 (exprData_getFieldNode (data) ) );
1882 // exprData_getFieldName (data);
1885 case XPR_STRINGLITERAL:
1886 // cstring_copy (exprData_getLiteral (data));
1890 // cstring_copy (exprData_getLiteral (data));
1894 ret = constraintList_addListFree (ret,
1895 exprNode_traversEnsuresConstraints
1896 (exprData_getUopNode (data) ) );
1900 ret = constraintList_addListFree (ret,
1901 exprNode_traversEnsuresConstraints
1902 (exprData_getCastNode (data) ) );
1909 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1910 exprNode_unparse (e),
1911 // constraintList_print(e->ensuresConstraints),
1912 constraintList_print(ret)