3 ** constraintGeneration.c
8 # include <ctype.h> /* for isdigit */
9 # include "lclintMacros.nf"
11 # include "cgrammar.h"
12 # include "cgrammar_tokens.h"
14 # include "exprChecks.h"
15 # include "aliasChecks.h"
16 # include "exprNodeSList.h"
18 # include "exprData.i"
19 # include "exprDataQuite.i"
21 /*@access exprNode @*/
23 extern void forLoopHeuristics( exprNode e, exprNode forPred, exprNode forBody);
25 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e);
26 static bool exprNode_handleError( exprNode p_e);
28 //static cstring exprNode_findConstraints ( exprNode p_e);
29 static bool exprNode_isMultiStatement(exprNode p_e);
30 static void exprNode_multiStatement (exprNode p_e);
32 //static void exprNode_constraintPropagateUp (exprNode p_e);
34 static constraintList exprNode_traversTrueEnsuresConstraints (exprNode e);
35 static constraintList exprNode_traversFalseEnsuresConstraints (exprNode e);
37 exprNode makeDataTypeConstraints (/*@returned@*/ exprNode e);
39 constraintList constraintList_makeFixedArrayConstraints (sRefSet s);
42 //bool exprNode_testd()
44 /* if ( ( (exprNode_isError ) ) )
53 static bool exprNode_isUnhandled (exprNode e)
55 llassert( exprNode_isDefined(e) );
84 DPRINTF((message ("Warning current constraint generation does not handle expression %s", exprNode_unparse(e)) ) );
96 bool exprNode_handleError( exprNode e)
98 if (exprNode_isError (e) || exprNode_isUnhandled(e) )
100 static /*@only@*/ cstring error = cstring_undefined;
102 if (!cstring_isDefined (error))
104 error = cstring_makeLiteral ("<error>");
107 /*@-unqualifiedtrans*/ return TRUE; /*@=unqualifiedtrans*/
112 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e)
114 if (exprNode_isError (e) )
117 e->requiresConstraints = constraintList_makeNew();
118 e->ensuresConstraints = constraintList_makeNew();
119 e->trueEnsuresConstraints = constraintList_makeNew();
120 e->falseEnsuresConstraints = constraintList_makeNew();
123 if (exprNode_isUnhandled (e) )
125 DPRINTF( (message("Warning ignoring %s", exprNode_unparse (e) ) ) );
130 // e = makeDataTypeConstraints (e);
132 DPRINTF((message ("exprNode_generateConstraints Analysising %s at %s", exprNode_unparse( e),
133 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
135 if (exprNode_isMultiStatement ( e) )
137 exprNode_multiStatement(e);
143 loc = exprNode_getNextSequencePoint(e);
144 exprNode_exprTraverse(e, FALSE, FALSE, loc);
153 c = constraintList_makeFixedArrayConstraints (e->uses);
154 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, c);
156 // e->ensuresConstraints = constraintList_mergeEnsures(c, e->ensuresConstraints);
158 constraintList_free(c);
161 DPRINTF ( (message ("e->requiresConstraints %s", constraintList_printDetailed (e->requiresConstraints) ) ) );
166 /* handles multiple statements */
168 bool exprNode_isMultiStatement(exprNode e)
170 if (exprNode_handleError (e) != NULL)
192 static void exprNode_stmt (exprNode e)
198 if (exprNode_isError(e) )
202 /*e->requiresConstraints = constraintList_makeNew();
203 e->ensuresConstraints = constraintList_makeNew(); */
204 // e = makeDataTypeConstraints(e);
207 DPRINTF(( "STMT:") );
208 s = exprNode_unparse(e);
209 // DPRINTF ( ( message("STMT: %s ") ) );
211 if (e->kind == XPR_INIT)
213 constraintList tempList;
215 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
216 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
217 exprNode_exprTraverse (e, FALSE, FALSE, loc);
220 tempList = e->requiresConstraints;
221 e->requiresConstraints = exprNode_traversRequiresConstraints(e);
222 constraintList_free(tempList);
224 tempList = e->ensuresConstraints;
225 e->ensuresConstraints = exprNode_traversEnsuresConstraints(e);
226 constraintList_free(tempList);
230 if (e->kind != XPR_STMT)
233 DPRINTF (("Not Stmt") );
234 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
235 if (exprNode_isMultiStatement (e) )
237 return exprNode_multiStatement (e );
239 DPRINTF( (message ("Ignoring non-statement %s", exprNode_unparse(e) ) ) );
245 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
247 snode = exprData_getUopNode (e->edata);
249 /* could be stmt involving multiple statements:
250 i.e. if, while for ect.
253 if (exprNode_isMultiStatement (snode))
255 exprNode_multiStatement (snode);
256 (void) exprNode_copyConstraints (e, snode);
260 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
262 exprNode_exprTraverse (snode, FALSE, FALSE, loc);
266 constraintList_free (e->requiresConstraints);
267 e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
268 // printf ("For: %s \n", exprNode_unparse (e) );
269 // printf ("%s\n", constraintList_print(e->requiresConstraints) );
271 constraintList_free (e->ensuresConstraints);
272 e->ensuresConstraints = exprNode_traversEnsuresConstraints(snode);
273 // printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
274 // llassert(notError);
276 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
277 constraintList_print(e->requiresConstraints),
278 constraintList_print(e->ensuresConstraints) ) ) );
285 static void exprNode_stmtList (exprNode e)
287 exprNode stmt1, stmt2;
288 if (exprNode_isError (e) )
294 e->requiresConstraints = constraintList_makeNew();
295 e->ensuresConstraints = constraintList_makeNew();
297 // e = makeDataTypeConstraints(e);
299 /*Handle case of stmtList with only one statement:
300 The parse tree stores this as stmt instead of stmtList*/
301 if (e->kind != XPR_STMTLIST)
306 llassert (e->kind == XPR_STMTLIST);
307 DPRINTF(( "STMTLIST:") );
308 DPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
309 stmt1 = exprData_getPairA (e->edata);
310 stmt2 = exprData_getPairB (e->edata);
313 DPRINTF((" stmtlist ") );
314 DPRINTF ((message("XW%s | %s", exprNode_unparse(stmt1), exprNode_unparse(stmt2) ) ) );
316 exprNode_stmt (stmt1);
317 DPRINTF(("\nstmt after stmtList call " ));
319 exprNode_stmt (stmt2);
320 mergeResolve (e, stmt1, stmt2 );
322 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
323 constraintList_print(e->requiresConstraints),
324 constraintList_print(e->ensuresConstraints) ) ) );
328 static exprNode doIf (/*@returned@*/ exprNode e, exprNode test, exprNode body)
332 DPRINTF ((message ("doIf: %s ", exprNode_unparse(e) ) ) );
334 llassert(exprNode_isDefined(test) );
335 llassert (exprNode_isDefined (e) );
336 llassert (exprNode_isDefined (body) );
339 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
341 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
343 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
345 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
349 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
351 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
353 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->trueEnsuresConstraints) ) ));
355 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->falseEnsuresConstraints) ) ));
359 temp = test->trueEnsuresConstraints;
360 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
361 constraintList_free(temp);
363 temp = test->ensuresConstraints;
364 test->ensuresConstraints = exprNode_traversEnsuresConstraints (test);
365 constraintList_free(temp);
367 temp = test->requiresConstraints;
368 test->requiresConstraints = exprNode_traversRequiresConstraints (test);
369 constraintList_free(temp);
372 test->trueEnsuresConstraints = constraintList_substituteFreeTarget(test->trueEnsuresConstraints, test->ensuresConstraints);
374 DPRINTF ((message ("doIf: test ensures %s ", constraintList_print(test->ensuresConstraints) ) ) );
376 DPRINTF ((message ("doIf: test true ensures %s ", constraintList_print(test->trueEnsuresConstraints) ) ) );
378 constraintList_free(e->requiresConstraints);
379 e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
381 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints,
382 test->ensuresConstraints);
383 temp = e->requiresConstraints;
384 e->requiresConstraints = constraintList_mergeRequires (e->requiresConstraints, test->requiresConstraints);
385 constraintList_free(temp);
389 constraintList_free(e->ensuresConstraints);
390 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
392 if (exprNode_mayEscape (body) )
394 DPRINTF (( message("doIf: the if statement body %s returns or exits", exprNode_unparse(body) ) ));
395 e->ensuresConstraints = constraintList_mergeEnsuresFreeFirst (e->ensuresConstraints,
396 test->falseEnsuresConstraints);
399 DPRINTF ((message ("doIf: if requiers %s ", constraintList_print(e->requiresConstraints) ) ) );
405 Also used for condition i.e. ?: operation
408 This function assumes that p, trueBranch, falseBranch have have all been traversed
409 for constraints i.e. we assume that exprNode_traversEnsuresConstraints,
410 exprNode_traversRequiresConstraints, exprNode_traversTrueEnsuresConstraints,
411 exprNode_traversFalseEnsuresConstraints have all been run
415 static exprNode doIfElse (/*@returned@*/ exprNode e, exprNode p, exprNode trueBranch, exprNode falseBranch)
418 constraintList c1, cons, t, t2, f, f2;
420 DPRINTF ((message ("doIfElse: %s ", exprNode_unparse(e) ) ) );
422 // do requires clauses
423 c1 = constraintList_copy (p->ensuresConstraints);
425 t = reflectChanges (trueBranch->requiresConstraints, p->trueEnsuresConstraints);
426 t = reflectChangesFreePre (t, p->ensuresConstraints);
428 cons = reflectChanges (falseBranch->requiresConstraints, p->falseEnsuresConstraints);
429 cons = reflectChangesFreePre (cons, c1);
431 constraintList_free(e->requiresConstraints);
432 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (t, cons);
433 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (e->requiresConstraints, p->requiresConstraints);
435 // do ensures clauses
436 // find the the ensures lists for each subbranch
437 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
439 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
440 constraintList_free(t2);
442 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
444 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
445 constraintList_free(f2);
447 // find ensures for whole if/else statement
449 constraintList_free(e->ensuresConstraints);
451 e->ensuresConstraints = constraintList_logicalOr (t, f);
453 constraintList_free(t);
454 constraintList_free(f);
455 constraintList_free(cons);
456 constraintList_free(c1);
458 DPRINTF ((message ("doIfElse: if requires %q ", constraintList_print(e->requiresConstraints) ) ) );
459 DPRINTF ((message ("doIfElse: if ensures %q ", constraintList_print(e->ensuresConstraints) ) ) );
464 static exprNode doWhile (/*@returned@*/ exprNode e, exprNode test, exprNode body)
466 DPRINTF ((message ("doWhile: %s ", exprNode_unparse(e) ) ) );
467 return doIf (e, test, body);
470 constraintList constraintList_makeFixedArrayConstraints (sRefSet s)
474 ret = constraintList_makeNew();
476 sRefSet_elements (s, el)
479 if (sRef_isFixedArray(el) )
482 DPRINTF( (message("%s is a fixed array",
483 sRef_unparse(el)) ) );
484 //if (el->kind == SK_DERIVED)
485 // break; //hack until I find the real problem
486 size = sRef_getArraySize(el);
487 DPRINTF( (message("%s is a fixed array with size %d",
488 sRef_unparse(el), (int)size) ) );
489 con = constraint_makeSRefSetBufferSize (el, (size - 1));
490 //con = constraint_makeSRefWriteSafeInt (el, (size - 1));
491 ret = constraintList_add(ret, con);
495 DPRINTF( (message("%s is not a fixed array",
496 sRef_unparse(el)) ) );
499 if (sRef_isExternallyVisible (el) )
501 /*DPRINTF( (message("%s is externally visible",
502 sRef_unparse(el) ) ));
503 con = constraint_makeSRefWriteSafeInt(el, 0);
504 ret = constraintList_add(ret, con);
506 con = constraint_makeSRefReadSafeInt(el, 0);
508 ret = constraintList_add(ret, con);*/
514 DPRINTF(( message("constraintList_makeFixedArrayConstraints returning %s",
515 constraintList_print(ret) ) ));
519 exprNode makeDataTypeConstraints (/*@returned@*/ exprNode e)
522 DPRINTF(("makeDataTypeConstraints"));
524 c = constraintList_makeFixedArrayConstraints (e->uses);
526 e->ensuresConstraints = constraintList_addListFree (e->ensuresConstraints, c);
531 static void doFor (exprNode e, exprNode forPred, exprNode forBody)
533 exprNode init, test, inc;
534 //merge the constraints: modle as if statement
539 init = exprData_getTripleInit (forPred->edata);
540 test = exprData_getTripleTest (forPred->edata);
541 inc = exprData_getTripleInc (forPred->edata);
543 if ( ( (exprNode_isError (test) /*|| (exprNode_isError(init) )*/ ) || (exprNode_isError (inc) ) ) )
545 DPRINTF ((message ("strange for statement:%s, ignoring it", exprNode_unparse(e) ) ) );
549 forLoopHeuristics(e, forPred, forBody);
551 constraintList_free(e->requiresConstraints);
552 e->requiresConstraints = reflectChanges (forBody->requiresConstraints, test->ensuresConstraints);
553 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, test->trueEnsuresConstraints);
554 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, forPred->ensuresConstraints);
556 if (!forBody->canBreak)
558 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints, constraintList_copy(forPred->ensuresConstraints) );
559 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints,constraintList_copy( test->falseEnsuresConstraints));
560 // forPred->ensuresConstraints = constraintList_undefined;
561 // test->falseEnsuresConstraints = constraintList_undefined;
565 DPRINTF(("Can break") );
570 static exprNode doSwitch (/*@returned@*/ exprNode e)
577 //DPRINTF (( message ("doSwitch for: switch (%s) %s",
578 // exprNode_unparse (exprData_getPairA (data)),
579 // exprNode_unparse (exprData_getPairB (data))) ));
581 body = exprData_getPairB (data);
583 // exprNode_generateConstraints(body);
585 // e->requiresConstraints = constraintList_copy ( body->requiresConstraints );
586 //e->ensuresConstraints = constraintList_copy ( body->ensuresConstraints );
592 void exprNode_multiStatement (exprNode e)
598 exprNode p, trueBranch, falseBranch;
599 exprNode forPred, forBody;
604 // constraintList t, f;
605 /*e->requiresConstraints = constraintList_makeNew();
606 e->ensuresConstraints = constraintList_makeNew();
607 e->trueEnsuresConstraints = constraintList_makeNew();
608 e->falseEnsuresConstraints = constraintList_makeNew();
610 // e = makeDataTypeConstraints(e);
612 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
613 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
615 if (exprNode_handleError (e))
628 // ret = message ("%s %s",
629 forPred = exprData_getPairA (data);
630 forBody = exprData_getPairB (data);
632 //first generate the constraints
633 exprNode_generateConstraints (forPred);
634 exprNode_generateConstraints (forBody);
637 doFor (e, forPred, forBody);
642 // ret = message ("for (%s; %s; %s)",
643 exprNode_generateConstraints (exprData_getTripleInit (data) );
644 test = exprData_getTripleTest (data);
645 exprNode_exprTraverse (test,FALSE, FALSE, exprNode_loc(e));
646 exprNode_generateConstraints (exprData_getTripleInc (data) );
648 if (!exprNode_isError(test) )
650 constraintList temp2;
651 temp2 = test->trueEnsuresConstraints;
652 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
653 constraintList_free(temp2);
656 exprNode_generateConstraints (exprData_getTripleInc (data));
660 e1 = exprData_getPairA (data);
661 e2 = exprData_getPairB (data);
663 exprNode_exprTraverse (e1,
664 FALSE, FALSE, exprNode_loc(e1));
666 exprNode_generateConstraints (e2);
668 e = doWhile (e, e1, e2);
674 DPRINTF ((exprNode_unparse(e) ) );
675 // ret = message ("if (%s) %s",
676 e1 = exprData_getPairA (data);
677 e2 = exprData_getPairB (data);
679 exprNode_exprTraverse (e1,
680 FALSE, FALSE, exprNode_loc(e1));
682 exprNode_generateConstraints (e2);
683 e = doIf (e, e1, e2);
686 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
691 DPRINTF(("Starting IFELSE"));
692 // ret = message ("if (%s) %s else %s",
693 p = exprData_getTriplePred (data);
694 trueBranch = exprData_getTripleTrue (data);
695 falseBranch = exprData_getTripleFalse (data);
697 exprNode_exprTraverse (p,
698 FALSE, FALSE, exprNode_loc(p));
699 exprNode_generateConstraints (trueBranch);
700 exprNode_generateConstraints (falseBranch);
702 temp = p->ensuresConstraints;
703 p->ensuresConstraints = exprNode_traversEnsuresConstraints (p);
704 constraintList_free(temp);
706 temp = p->requiresConstraints;
707 p->requiresConstraints = exprNode_traversRequiresConstraints (p);
708 constraintList_free(temp);
710 temp = p->trueEnsuresConstraints;
711 p->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(p);
712 constraintList_free(temp);
714 temp = p->falseEnsuresConstraints;
715 p->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(p);
716 constraintList_free(temp);
718 e = doIfElse (e, p, trueBranch, falseBranch);
719 DPRINTF( ("Done IFELSE") );
724 e2 = (exprData_getPairB (data));
725 e1 = (exprData_getPairA (data));
727 DPRINTF((message ("do { %s } while (%s)", exprNode_unparse(e2), exprNode_unparse(e1) ) ));
728 exprNode_generateConstraints (e2);
729 exprNode_generateConstraints (e1);
730 e = exprNode_copyConstraints (e, e2);
731 DPRINTF ((message ("e = %s ", constraintList_print(e->requiresConstraints) ) ));
736 // ret = message ("{ %s }",
737 exprNode_generateConstraints (exprData_getSingle (data));
739 constraintList_free(e->requiresConstraints);
740 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
742 constraintList_free(e->ensuresConstraints);
743 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
744 // e->constraints = (exprData_getSingle (data))->constraints;
752 exprNode_stmtList (e);
762 static bool lltok_isBoolean_Op (lltok tok)
764 /*this should really be a switch statement but
765 I don't want to violate the abstraction
766 maybe this should go in lltok.c */
768 if (lltok_isEq_Op (tok) )
772 if (lltok_isAnd_Op (tok) )
778 if (lltok_isOr_Op (tok) )
783 if (lltok_isGt_Op (tok) )
787 if (lltok_isLt_Op (tok) )
792 if (lltok_isLe_Op (tok) )
797 if (lltok_isGe_Op (tok) )
807 static void exprNode_booleanTraverse (exprNode e, /*@unused@*/ bool definatelv, /*@unused@*/ bool definaterv, fileloc sequencePoint)
813 constraintList tempList, temp;
816 tok = exprData_getOpTok (data);
819 t1 = exprData_getOpA (data);
820 t2 = exprData_getOpB (data);
823 /* arithmetic tests */
825 if (lltok_isEq_Op (tok) )
827 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
828 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
832 if (lltok_isLt_Op (tok) )
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);
841 if (lltok_isGe_Op (tok) )
844 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
845 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
847 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
848 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
853 if (lltok_isGt_Op (tok) )
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);
861 if (lltok_isLe_Op (tok) )
863 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
864 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
866 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
867 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
872 /*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);
913 DPRINTF((message("%s is not a boolean operation", lltok_unparse(tok) ) ));
918 void exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, /*@observer@*/ fileloc sequencePoint)
920 exprNode t1, t2, fcn;
922 bool handledExprNode;
928 if (exprNode_isError(e) )
933 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
934 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
936 /*e->requiresConstraints = constraintList_makeNew();
937 e->ensuresConstraints = constraintList_makeNew();
938 e->trueEnsuresConstraints = constraintList_makeNew();;
939 e->falseEnsuresConstraints = constraintList_makeNew();;
941 if (exprNode_isUnhandled (e) )
945 // e = makeDataTypeConstraints (e);
947 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);
997 /* //t1 = exprData_getInitId (data); */
998 t2 = exprData_getInitNode (data);
999 //exprNode_exprTraverse (t1, TRUE, FALSE, sequencePoint );
1001 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1003 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
1004 if ( (!exprNode_isError (e)) && (!exprNode_isError(t2)) )
1006 cons = constraint_makeEnsureEqual (e, t2, sequencePoint);
1007 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1012 t1 = exprData_getOpA (data);
1013 t2 = exprData_getOpB (data);
1014 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1015 //lltok_unparse (exprData_getOpTok (data));
1016 #warning check this for += -= etc
1017 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1019 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
1020 if ( (!exprNode_isError (t1)) && (!exprNode_isError(t2)) )
1022 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
1023 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1027 t1 = exprData_getOpA (data);
1028 t2 = exprData_getOpB (data);
1030 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1031 tok = exprData_getOpTok (data);
1032 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1034 if (lltok_isBoolean_Op (tok) )
1035 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
1037 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
1040 #warning make sure the case can be ignored..
1045 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1046 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
1050 fcn = exprData_getFcn(data);
1052 exprNode_exprTraverse (fcn, definatelv, definaterv, sequencePoint );
1053 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(fcn), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
1055 fcn->requiresConstraints = constraintList_addListFree (fcn->requiresConstraints,
1056 checkCall (fcn, exprData_getArgs (data) ) );
1058 fcn->ensuresConstraints = constraintList_addListFree (fcn->ensuresConstraints,
1059 getPostConditions(fcn, exprData_getArgs (data),e ) );
1061 t1 = exprNode_createNew (exprNode_getType (e) );
1063 checkArgumentList (t1, exprData_getArgs(data), sequencePoint);
1066 mergeResolve (e, t1, fcn);
1068 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
1072 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1075 case XPR_NULLRETURN:
1081 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
1085 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
1088 case XPR_STRINGLITERAL:
1097 t1 = exprData_getUopNode(data);
1098 tok = (exprData_getUopTok (data));
1099 //lltok_unparse (exprData_getUopTok (data));
1100 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1101 /*handle * pointer access */
1102 if (lltok_isInc_Op (tok) )
1104 DPRINTF(("doing ++(var)"));
1105 t1 = exprData_getUopNode (data);
1106 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1107 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1109 else if (lltok_isDec_Op (tok) )
1111 DPRINTF(("doing --(var)"));
1112 t1 = exprData_getUopNode (data);
1113 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1114 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1116 else if (lltok_isMult( tok ) )
1120 cons = constraint_makeWriteSafeInt (t1, 0);
1124 cons = constraint_makeReadSafeInt (t1, 0);
1126 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
1128 else if (lltok_isNot_Op (tok) )
1131 constraintList_free(e->trueEnsuresConstraints);
1133 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
1134 constraintList_free(e->falseEnsuresConstraints);
1135 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
1138 else if (lltok_isAmpersand_Op (tok) )
1142 else if (lltok_isMinus_Op (tok) )
1146 else if ( lltok_isExcl_Op (tok) )
1150 else if (lltok_isTilde_Op (tok) )
1156 llcontbug((message("Unsupported preop in %s", exprNode_unparse(e) ) ));
1163 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
1165 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
1167 DPRINTF(("doing ++"));
1168 t1 = exprData_getUopNode (data);
1169 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1170 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1172 if (lltok_isDec_Op (exprData_getUopTok (data) ) )
1174 DPRINTF(("doing --"));
1175 t1 = exprData_getUopNode (data);
1176 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1177 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1182 exprNode_exprTraverse (exprData_getCastNode (data), definatelv, definaterv, sequencePoint );
1186 exprNode pred, true, false;
1188 pred = exprData_getTriplePred (data);
1189 true = exprData_getTripleTrue (data);
1190 false = exprData_getTripleFalse (data);
1192 exprNode_exprTraverse (pred, FALSE, TRUE, sequencePoint );
1194 temp = pred->ensuresConstraints;
1195 pred->ensuresConstraints = exprNode_traversEnsuresConstraints(pred);
1196 constraintList_free(temp);
1198 temp = pred->requiresConstraints;
1199 pred->requiresConstraints = exprNode_traversRequiresConstraints(pred);
1200 constraintList_free(temp);
1202 temp = pred->trueEnsuresConstraints;
1203 pred->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(pred);
1204 constraintList_free(temp);
1206 temp = pred->falseEnsuresConstraints;
1207 pred->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(pred);
1208 constraintList_free(temp);
1211 exprNode_exprTraverse (true, FALSE, TRUE, sequencePoint );
1213 temp = true->ensuresConstraints;
1214 true->ensuresConstraints = exprNode_traversEnsuresConstraints(true);
1215 constraintList_free(temp);
1218 temp = true->requiresConstraints;
1219 true->requiresConstraints = exprNode_traversRequiresConstraints(true);
1220 constraintList_free(temp);
1223 temp = true->trueEnsuresConstraints;
1224 true->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(true);
1225 constraintList_free(temp);
1227 temp = true->falseEnsuresConstraints;
1228 true->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(true);
1229 constraintList_free(temp);
1232 exprNode_exprTraverse (false, FALSE, TRUE, sequencePoint );
1234 temp = false->ensuresConstraints;
1235 false->ensuresConstraints = exprNode_traversEnsuresConstraints(false);
1236 constraintList_free(temp);
1239 temp = false->requiresConstraints;
1240 false->requiresConstraints = exprNode_traversRequiresConstraints(false);
1241 constraintList_free(temp);
1244 temp = false->trueEnsuresConstraints;
1245 false->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(false);
1246 constraintList_free(temp);
1248 temp = false->falseEnsuresConstraints;
1249 false->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(false);
1250 constraintList_free(temp);
1252 /* if pred is true e equals true otherwise pred equals false */
1254 cons = constraint_makeEnsureEqual (e, true, sequencePoint);
1255 true->ensuresConstraints = constraintList_add(true->ensuresConstraints, cons);
1257 cons = constraint_makeEnsureEqual (e, true, sequencePoint);
1258 false->ensuresConstraints = constraintList_add(false->ensuresConstraints, cons);
1260 e = doIfElse (e, pred, true, false);
1266 t1 = exprData_getPairA (data);
1267 t2 = exprData_getPairB (data);
1268 /* we essiantially treat this like expr1; expr2
1269 of course sequencePoint isn't adjusted so this isn't completely accurate
1271 exprNode_exprTraverse (t1, FALSE, FALSE, sequencePoint );
1272 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1273 mergeResolve (e, t1, t2);
1277 handledExprNode = FALSE;
1280 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
1281 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
1282 e->requiresConstraints = constraintList_addGeneratingExpr ( e->requiresConstraints, e);
1284 e->ensuresConstraints = constraintList_addGeneratingExpr ( e->ensuresConstraints, e);
1286 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
1288 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
1290 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
1292 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
1294 return; // handledExprNode;
1298 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
1302 bool handledExprNode;
1307 if (exprNode_handleError (e))
1309 ret = constraintList_makeNew();
1312 ret = constraintList_copy (e->trueEnsuresConstraints );
1314 handledExprNode = TRUE;
1321 t1 = exprData_getSingle (data);
1322 ret = constraintList_addListFree ( ret, exprNode_traversTrueEnsuresConstraints (t1) );
1327 ret = constraintList_addListFree (ret,
1328 exprNode_traversTrueEnsuresConstraints
1329 (exprData_getPairA (data) ) );
1331 ret = constraintList_addListFree (ret,
1332 exprNode_traversTrueEnsuresConstraints
1333 (exprData_getPairB (data) ) );
1337 ret = constraintList_addListFree (ret,
1338 exprNode_traversTrueEnsuresConstraints
1339 (exprData_getUopNode (data) ) );
1343 ret = constraintList_addListFree (ret, exprNode_traversTrueEnsuresConstraints
1344 (exprData_getUopNode (data) ) );
1347 ret = constraintList_addListFree (ret,
1348 exprNode_traversTrueEnsuresConstraints
1349 (exprData_getOpA (data) ) );
1351 ret = constraintList_addListFree (ret,
1352 exprNode_traversTrueEnsuresConstraints
1353 (exprData_getOpB (data) ) );
1356 ret = constraintList_addListFree (ret,
1357 exprNode_traversTrueEnsuresConstraints
1358 (exprData_getOpA (data) ) );
1360 ret = constraintList_addListFree (ret,
1361 exprNode_traversTrueEnsuresConstraints
1362 (exprData_getOpB (data) ) );
1366 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1372 ret = constraintList_addListFree (ret,
1373 exprNode_traversTrueEnsuresConstraints
1374 (exprData_getSingle (data) ) );
1378 ret = constraintList_addListFree (ret,
1379 exprNode_traversTrueEnsuresConstraints
1380 (exprData_getFcn (data) ) );
1381 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1385 ret = constraintList_addListFree (ret,
1386 exprNode_traversTrueEnsuresConstraints
1387 (exprData_getSingle (data) ) );
1390 case XPR_NULLRETURN:
1391 // cstring_makeLiteral ("return");;
1395 ret = constraintList_addListFree (ret,
1396 exprNode_traversTrueEnsuresConstraints
1397 (exprData_getFieldNode (data) ) );
1398 //exprData_getFieldName (data) ;
1402 ret = constraintList_addListFree (ret,
1403 exprNode_traversTrueEnsuresConstraints
1404 (exprData_getFieldNode (data) ) );
1405 // exprData_getFieldName (data);
1408 case XPR_STRINGLITERAL:
1409 // cstring_copy (exprData_getLiteral (data));
1413 // cstring_copy (exprData_getLiteral (data));
1417 ret = constraintList_addListFree (ret,
1418 exprNode_traversTrueEnsuresConstraints
1419 (exprData_getUopNode (data) ) );
1424 ret = constraintList_addListFree (ret,
1425 exprNode_traversTrueEnsuresConstraints
1426 (exprData_getCastNode (data) ) );
1436 constraintList exprNode_traversFalseEnsuresConstraints (exprNode e)
1440 bool handledExprNode;
1445 if (exprNode_handleError (e))
1447 ret = constraintList_makeNew();
1450 ret = constraintList_copy (e->falseEnsuresConstraints );
1452 handledExprNode = TRUE;
1459 t1 = exprData_getSingle (data);
1460 ret = constraintList_addListFree ( ret,exprNode_traversFalseEnsuresConstraints (t1) );
1465 ret = constraintList_addListFree (ret,
1466 exprNode_traversFalseEnsuresConstraints
1467 (exprData_getPairA (data) ) );
1469 ret = constraintList_addListFree (ret,
1470 exprNode_traversFalseEnsuresConstraints
1471 (exprData_getPairB (data) ) );
1475 ret = constraintList_addListFree (ret,
1476 exprNode_traversFalseEnsuresConstraints
1477 (exprData_getUopNode (data) ) );
1481 ret = constraintList_addListFree (ret, exprNode_traversFalseEnsuresConstraints
1482 (exprData_getUopNode (data) ) );
1485 ret = constraintList_addListFree (ret,
1486 exprNode_traversFalseEnsuresConstraints
1487 (exprData_getOpA (data) ) );
1489 ret = constraintList_addListFree (ret,
1490 exprNode_traversFalseEnsuresConstraints
1491 (exprData_getOpB (data) ) );
1494 ret = constraintList_addListFree (ret,
1495 exprNode_traversFalseEnsuresConstraints
1496 (exprData_getOpA (data) ) );
1498 ret = constraintList_addListFree (ret,
1499 exprNode_traversFalseEnsuresConstraints
1500 (exprData_getOpB (data) ) );
1504 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1510 ret = constraintList_addListFree (ret,
1511 exprNode_traversFalseEnsuresConstraints
1512 (exprData_getSingle (data) ) );
1516 ret = constraintList_addListFree (ret,
1517 exprNode_traversFalseEnsuresConstraints
1518 (exprData_getFcn (data) ) );
1519 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1523 ret = constraintList_addListFree (ret,
1524 exprNode_traversFalseEnsuresConstraints
1525 (exprData_getSingle (data) ) );
1528 case XPR_NULLRETURN:
1529 // cstring_makeLiteral ("return");;
1533 ret = constraintList_addListFree (ret,
1534 exprNode_traversFalseEnsuresConstraints
1535 (exprData_getFieldNode (data) ) );
1536 //exprData_getFieldName (data) ;
1540 ret = constraintList_addListFree (ret,
1541 exprNode_traversFalseEnsuresConstraints
1542 (exprData_getFieldNode (data) ) );
1543 // exprData_getFieldName (data);
1546 case XPR_STRINGLITERAL:
1547 // cstring_copy (exprData_getLiteral (data));
1551 // cstring_copy (exprData_getLiteral (data));
1555 ret = constraintList_addListFree (ret,
1556 exprNode_traversFalseEnsuresConstraints
1557 (exprData_getUopNode (data) ) );
1562 ret = constraintList_addListFree (ret,
1563 exprNode_traversFalseEnsuresConstraints
1564 (exprData_getCastNode (data) ) );
1575 /* walk down the tree and get all requires Constraints in each subexpression*/
1576 /*@only@*/ constraintList exprNode_traversRequiresConstraints (exprNode e)
1580 bool handledExprNode;
1585 if (exprNode_handleError (e))
1587 ret = constraintList_makeNew();
1590 ret = constraintList_copy (e->requiresConstraints );
1592 handledExprNode = TRUE;
1599 t1 = exprData_getSingle (data);
1600 ret = constraintList_addListFree ( ret, exprNode_traversRequiresConstraints (t1) );
1605 ret = constraintList_addListFree (ret,
1606 exprNode_traversRequiresConstraints
1607 (exprData_getPairA (data) ) );
1609 ret = constraintList_addListFree (ret,
1610 exprNode_traversRequiresConstraints
1611 (exprData_getPairB (data) ) );
1615 ret = constraintList_addListFree (ret,
1616 exprNode_traversRequiresConstraints
1617 (exprData_getUopNode (data) ) );
1621 ret = constraintList_addListFree (ret, exprNode_traversRequiresConstraints
1622 (exprData_getUopNode (data) ) );
1625 ret = constraintList_addListFree (ret,
1626 exprNode_traversRequiresConstraints
1627 (exprData_getOpA (data) ) );
1629 ret = constraintList_addListFree (ret,
1630 exprNode_traversRequiresConstraints
1631 (exprData_getOpB (data) ) );
1634 ret = constraintList_addListFree (ret,
1635 exprNode_traversRequiresConstraints
1636 (exprData_getOpA (data) ) );
1638 ret = constraintList_addListFree (ret,
1639 exprNode_traversRequiresConstraints
1640 (exprData_getOpB (data) ) );
1644 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1650 ret = constraintList_addListFree (ret,
1651 exprNode_traversRequiresConstraints
1652 (exprData_getSingle (data) ) );
1656 ret = constraintList_addListFree (ret,
1657 exprNode_traversRequiresConstraints
1658 (exprData_getFcn (data) ) );
1659 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1663 ret = constraintList_addListFree (ret,
1664 exprNode_traversRequiresConstraints
1665 (exprData_getSingle (data) ) );
1668 case XPR_NULLRETURN:
1669 // cstring_makeLiteral ("return");;
1673 ret = constraintList_addListFree (ret,
1674 exprNode_traversRequiresConstraints
1675 (exprData_getFieldNode (data) ) );
1676 //exprData_getFieldName (data) ;
1680 ret = constraintList_addListFree (ret,
1681 exprNode_traversRequiresConstraints
1682 (exprData_getFieldNode (data) ) );
1683 // exprData_getFieldName (data);
1686 case XPR_STRINGLITERAL:
1687 // cstring_copy (exprData_getLiteral (data));
1691 // cstring_copy (exprData_getLiteral (data));
1695 ret = constraintList_addListFree (ret,
1696 exprNode_traversRequiresConstraints
1697 (exprData_getUopNode (data) ) );
1702 ret = constraintList_addListFree (ret,
1703 exprNode_traversRequiresConstraints
1704 (exprData_getCastNode (data) ) );
1715 /* walk down the tree and get all Ensures Constraints in each subexpression*/
1716 /*@only@*/ constraintList exprNode_traversEnsuresConstraints (exprNode e)
1720 bool handledExprNode;
1723 // constraintExpr tmp;
1728 if (exprNode_handleError (e))
1730 ret = constraintList_makeNew();
1734 ret = constraintList_copy (e->ensuresConstraints );
1735 handledExprNode = TRUE;
1740 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1741 exprNode_unparse (e),
1742 constraintList_print(e->ensuresConstraints)
1750 t1 = exprData_getSingle (data);
1751 ret = constraintList_addListFree ( ret,exprNode_traversEnsuresConstraints (t1) );
1756 ret = constraintList_addListFree (ret,
1757 exprNode_traversEnsuresConstraints
1758 (exprData_getPairA (data) ) );
1760 ret = constraintList_addListFree (ret,
1761 exprNode_traversEnsuresConstraints
1762 (exprData_getPairB (data) ) );
1766 ret = constraintList_addListFree (ret,
1767 exprNode_traversEnsuresConstraints
1768 (exprData_getUopNode (data) ) );
1772 ret = constraintList_addListFree (ret, exprNode_traversEnsuresConstraints
1773 (exprData_getUopNode (data) ) );
1776 ret = constraintList_addListFree (ret,
1777 exprNode_traversEnsuresConstraints
1778 (exprData_getOpA (data) ) );
1780 ret = constraintList_addListFree (ret,
1781 exprNode_traversEnsuresConstraints
1782 (exprData_getOpB (data) ) );
1785 ret = constraintList_addListFree (ret,
1786 exprNode_traversEnsuresConstraints
1787 (exprData_getOpA (data) ) );
1789 ret = constraintList_addListFree (ret,
1790 exprNode_traversEnsuresConstraints
1791 (exprData_getOpB (data) ) );
1795 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1801 ret = constraintList_addListFree (ret,
1802 exprNode_traversEnsuresConstraints
1803 (exprData_getSingle (data) ) );
1807 ret = constraintList_addListFree (ret,
1808 exprNode_traversEnsuresConstraints
1809 (exprData_getFcn (data) ) );
1810 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1814 ret = constraintList_addListFree (ret,
1815 exprNode_traversEnsuresConstraints
1816 (exprData_getSingle (data) ) );
1819 case XPR_NULLRETURN:
1820 // cstring_makeLiteral ("return");;
1824 ret = constraintList_addListFree (ret,
1825 exprNode_traversEnsuresConstraints
1826 (exprData_getFieldNode (data) ) );
1827 //exprData_getFieldName (data) ;
1831 ret = constraintList_addListFree (ret,
1832 exprNode_traversEnsuresConstraints
1833 (exprData_getFieldNode (data) ) );
1834 // exprData_getFieldName (data);
1837 case XPR_STRINGLITERAL:
1838 // cstring_copy (exprData_getLiteral (data));
1842 // cstring_copy (exprData_getLiteral (data));
1846 ret = constraintList_addListFree (ret,
1847 exprNode_traversEnsuresConstraints
1848 (exprData_getUopNode (data) ) );
1852 ret = constraintList_addListFree (ret,
1853 exprNode_traversEnsuresConstraints
1854 (exprData_getCastNode (data) ) );
1861 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1862 exprNode_unparse (e),
1863 // constraintList_print(e->ensuresConstraints),
1864 constraintList_print(ret)