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 "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) );
82 DPRINTF((message ("Warning current constraint generation does not handle expression %s", exprNode_unparse(e)) ) );
94 bool exprNode_handleError( exprNode e)
96 if (exprNode_isError (e) || exprNode_isUnhandled(e) )
98 static /*@only@*/ cstring error = cstring_undefined;
100 if (!cstring_isDefined (error))
102 error = cstring_makeLiteral ("<error>");
105 /*@-unqualifiedtrans*/ return TRUE; /*@=unqualifiedtrans*/
110 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e)
112 if (exprNode_isError (e) )
115 e->requiresConstraints = constraintList_makeNew();
116 e->ensuresConstraints = constraintList_makeNew();
117 e->trueEnsuresConstraints = constraintList_makeNew();
118 e->falseEnsuresConstraints = constraintList_makeNew();
121 if (exprNode_isUnhandled (e) )
123 DPRINTF( (message("Warning ignoring %s", exprNode_unparse (e) ) ) );
128 // e = makeDataTypeConstraints (e);
130 DPRINTF((message ("exprNode_generateConstraints Analysising %s at %s", exprNode_unparse( e),
131 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
133 if (exprNode_isMultiStatement ( e) )
135 exprNode_multiStatement(e);
141 loc = exprNode_getNextSequencePoint(e);
142 exprNode_exprTraverse(e, FALSE, FALSE, loc);
151 c = constraintList_makeFixedArrayConstraints (e->uses);
152 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, c);
154 // e->ensuresConstraints = constraintList_mergeEnsures(c, e->ensuresConstraints);
156 constraintList_free(c);
159 DPRINTF ( (message ("e->requiresConstraints %s", constraintList_printDetailed (e->requiresConstraints) ) ) );
164 /* handles multiple statements */
166 bool exprNode_isMultiStatement(exprNode e)
168 if (exprNode_handleError (e) != NULL)
190 static void exprNode_stmt (exprNode e)
196 if (exprNode_isError(e) )
200 /*e->requiresConstraints = constraintList_makeNew();
201 e->ensuresConstraints = constraintList_makeNew(); */
202 // e = makeDataTypeConstraints(e);
205 DPRINTF(( "STMT:") );
206 s = exprNode_unparse(e);
207 // DPRINTF ( ( message("STMT: %s ") ) );
209 if (e->kind == XPR_INIT)
211 constraintList tempList;
213 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
214 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
215 exprNode_exprTraverse (e, FALSE, FALSE, loc);
218 tempList = e->requiresConstraints;
219 e->requiresConstraints = exprNode_traversRequiresConstraints(e);
220 constraintList_free(tempList);
222 tempList = e->ensuresConstraints;
223 e->ensuresConstraints = exprNode_traversEnsuresConstraints(e);
224 constraintList_free(tempList);
228 if (e->kind != XPR_STMT)
231 DPRINTF (("Not Stmt") );
232 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
233 if (exprNode_isMultiStatement (e) )
235 return exprNode_multiStatement (e );
237 DPRINTF( (message ("Ignoring non-statement %s", exprNode_unparse(e) ) ) );
243 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
245 snode = exprData_getUopNode (e->edata);
247 /* could be stmt involving multiple statements:
248 i.e. if, while for ect.
251 if (exprNode_isMultiStatement (snode))
253 exprNode_multiStatement (snode);
254 (void) exprNode_copyConstraints (e, snode);
258 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
260 exprNode_exprTraverse (snode, FALSE, FALSE, loc);
264 constraintList_free (e->requiresConstraints);
265 e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
266 // printf ("For: %s \n", exprNode_unparse (e) );
267 // printf ("%s\n", constraintList_print(e->requiresConstraints) );
269 constraintList_free (e->ensuresConstraints);
270 e->ensuresConstraints = exprNode_traversEnsuresConstraints(snode);
271 // printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
272 // llassert(notError);
274 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
275 constraintList_print(e->requiresConstraints),
276 constraintList_print(e->ensuresConstraints) ) ) );
283 static void exprNode_stmtList (exprNode e)
285 exprNode stmt1, stmt2;
286 if (exprNode_isError (e) )
292 e->requiresConstraints = constraintList_makeNew();
293 e->ensuresConstraints = constraintList_makeNew();
295 // e = makeDataTypeConstraints(e);
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)
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);
311 DPRINTF((" stmtlist ") );
312 DPRINTF ((message("XW%s | %s", exprNode_unparse(stmt1), exprNode_unparse(stmt2) ) ) );
314 exprNode_stmt (stmt1);
315 DPRINTF(("\nstmt after stmtList call " ));
317 exprNode_stmt (stmt2);
318 mergeResolve (e, stmt1, stmt2 );
320 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
321 constraintList_print(e->requiresConstraints),
322 constraintList_print(e->ensuresConstraints) ) ) );
326 static exprNode doIf (/*@returned@*/ exprNode e, exprNode test, exprNode body)
330 DPRINTF ((message ("doIf: %s ", exprNode_unparse(e) ) ) );
332 llassert(exprNode_isDefined(test) );
333 llassert (exprNode_isDefined (e) );
334 llassert (exprNode_isDefined (body) );
337 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
339 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
341 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
343 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
347 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
349 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
351 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->trueEnsuresConstraints) ) ));
353 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->falseEnsuresConstraints) ) ));
357 temp = test->trueEnsuresConstraints;
358 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
359 constraintList_free(temp);
361 temp = test->ensuresConstraints;
362 test->ensuresConstraints = exprNode_traversEnsuresConstraints (test);
363 constraintList_free(temp);
365 temp = test->requiresConstraints;
366 test->requiresConstraints = exprNode_traversRequiresConstraints (test);
367 constraintList_free(temp);
370 test->trueEnsuresConstraints = constraintList_substituteFreeTarget(test->trueEnsuresConstraints, test->ensuresConstraints);
372 DPRINTF ((message ("doIf: test ensures %s ", constraintList_print(test->ensuresConstraints) ) ) );
374 DPRINTF ((message ("doIf: test true ensures %s ", constraintList_print(test->trueEnsuresConstraints) ) ) );
376 constraintList_free(e->requiresConstraints);
377 e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
379 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints,
380 test->ensuresConstraints);
381 temp = e->requiresConstraints;
382 e->requiresConstraints = constraintList_mergeRequires (e->requiresConstraints, test->requiresConstraints);
383 constraintList_free(temp);
387 constraintList_free(e->ensuresConstraints);
388 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
390 if (exprNode_mayEscape (body) )
392 DPRINTF (( message("doIf: the if statement body %s returns or exits", exprNode_unparse(body) ) ));
393 e->ensuresConstraints = constraintList_mergeEnsuresFreeFirst (e->ensuresConstraints,
394 test->falseEnsuresConstraints);
397 DPRINTF ((message ("doIf: if requiers %s ", constraintList_print(e->requiresConstraints) ) ) );
403 Also used for condition i.e. ?: operation
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
413 static exprNode doIfElse (/*@returned@*/ exprNode e, exprNode p, exprNode trueBranch, exprNode falseBranch)
416 constraintList c1, cons, t, t2, f, f2;
418 DPRINTF ((message ("doIfElse: %s ", exprNode_unparse(e) ) ) );
420 // do requires clauses
421 c1 = constraintList_copy (p->ensuresConstraints);
423 t = reflectChanges (trueBranch->requiresConstraints, p->trueEnsuresConstraints);
424 t = reflectChangesFreePre (t, p->ensuresConstraints);
426 cons = reflectChanges (falseBranch->requiresConstraints, p->falseEnsuresConstraints);
427 cons = reflectChangesFreePre (cons, c1);
429 constraintList_free(e->requiresConstraints);
430 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (t, cons);
431 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (e->requiresConstraints, p->requiresConstraints);
433 // do ensures clauses
434 // find the the ensures lists for each subbranch
435 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
437 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
438 constraintList_free(t2);
440 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
442 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
443 constraintList_free(f2);
445 // find ensures for whole if/else statement
447 constraintList_free(e->ensuresConstraints);
449 e->ensuresConstraints = constraintList_logicalOr (t, f);
451 constraintList_free(t);
452 constraintList_free(f);
453 constraintList_free(cons);
454 constraintList_free(c1);
456 DPRINTF ((message ("doIfElse: if requires %q ", constraintList_print(e->requiresConstraints) ) ) );
457 DPRINTF ((message ("doIfElse: if ensures %q ", constraintList_print(e->ensuresConstraints) ) ) );
462 static exprNode doWhile (/*@returned@*/ exprNode e, exprNode test, exprNode body)
464 DPRINTF ((message ("doWhile: %s ", exprNode_unparse(e) ) ) );
465 return doIf (e, test, body);
468 constraintList constraintList_makeFixedArrayConstraints (sRefSet s)
472 ret = constraintList_makeNew();
474 sRefSet_elements (s, el)
477 if (sRef_isFixedArray(el) )
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
484 size = sRef_getArraySize(el);
485 DPRINTF( (message("%s is a fixed array with size %d",
486 sRef_unparse(el), (int)size) ) );
487 con = constraint_makeSRefSetBufferSize (el, (size - 1));
488 //con = constraint_makeSRefWriteSafeInt (el, (size - 1));
489 ret = constraintList_add(ret, con);
493 DPRINTF( (message("%s is not a fixed array",
494 sRef_unparse(el)) ) );
497 if (sRef_isExternallyVisible (el) )
499 /*DPRINTF( (message("%s is externally visible",
500 sRef_unparse(el) ) ));
501 con = constraint_makeSRefWriteSafeInt(el, 0);
502 ret = constraintList_add(ret, con);
504 con = constraint_makeSRefReadSafeInt(el, 0);
506 ret = constraintList_add(ret, con);*/
512 DPRINTF(( message("constraintList_makeFixedArrayConstraints returning %s",
513 constraintList_print(ret) ) ));
517 exprNode makeDataTypeConstraints (/*@returned@*/ exprNode e)
520 DPRINTF(("makeDataTypeConstraints"));
522 c = constraintList_makeFixedArrayConstraints (e->uses);
524 e->ensuresConstraints = constraintList_addListFree (e->ensuresConstraints, c);
529 static void doFor (exprNode e, exprNode forPred, exprNode forBody)
531 exprNode init, test, inc;
532 //merge the constraints: modle as if statement
537 init = exprData_getTripleInit (forPred->edata);
538 test = exprData_getTripleTest (forPred->edata);
539 inc = exprData_getTripleInc (forPred->edata);
541 if ( ( (exprNode_isError (test) /*|| (exprNode_isError(init) )*/ ) || (exprNode_isError (inc) ) ) )
543 DPRINTF ((message ("strange for statement:%s, ignoring it", exprNode_unparse(e) ) ) );
547 forLoopHeuristics(e, forPred, forBody);
549 constraintList_free(e->requiresConstraints);
550 e->requiresConstraints = reflectChanges (forBody->requiresConstraints, test->ensuresConstraints);
551 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, test->trueEnsuresConstraints);
552 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, forPred->ensuresConstraints);
554 if (!forBody->canBreak)
556 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints, constraintList_copy(forPred->ensuresConstraints) );
557 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints,constraintList_copy( test->falseEnsuresConstraints));
558 // forPred->ensuresConstraints = constraintList_undefined;
559 // test->falseEnsuresConstraints = constraintList_undefined;
563 DPRINTF(("Can break") );
568 static exprNode doSwitch (/*@returned@*/ exprNode e)
575 //DPRINTF (( message ("doSwitch for: switch (%s) %s",
576 // exprNode_unparse (exprData_getPairA (data)),
577 // exprNode_unparse (exprData_getPairB (data))) ));
579 body = exprData_getPairB (data);
581 // exprNode_generateConstraints(body);
583 // e->requiresConstraints = constraintList_copy ( body->requiresConstraints );
584 //e->ensuresConstraints = constraintList_copy ( body->ensuresConstraints );
590 void exprNode_multiStatement (exprNode e)
596 exprNode p, trueBranch, falseBranch;
597 exprNode forPred, forBody;
602 // constraintList t, f;
603 /*e->requiresConstraints = constraintList_makeNew();
604 e->ensuresConstraints = constraintList_makeNew();
605 e->trueEnsuresConstraints = constraintList_makeNew();
606 e->falseEnsuresConstraints = constraintList_makeNew();
608 // e = makeDataTypeConstraints(e);
610 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
611 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
613 if (exprNode_handleError (e))
626 // ret = message ("%s %s",
627 forPred = exprData_getPairA (data);
628 forBody = exprData_getPairB (data);
630 //first generate the constraints
631 exprNode_generateConstraints (forPred);
632 exprNode_generateConstraints (forBody);
635 doFor (e, forPred, forBody);
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));
644 exprNode_generateConstraints (exprData_getTripleInc (data) );
646 if (!exprNode_isError(test) )
648 constraintList temp2;
649 temp2 = test->trueEnsuresConstraints;
650 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
651 constraintList_free(temp2);
654 exprNode_generateConstraints (exprData_getTripleInc (data));
658 e1 = exprData_getPairA (data);
659 e2 = exprData_getPairB (data);
661 exprNode_exprTraverse (e1,
662 FALSE, FALSE, exprNode_loc(e1));
664 exprNode_generateConstraints (e2);
666 e = doWhile (e, e1, e2);
672 DPRINTF ((exprNode_unparse(e) ) );
673 // ret = message ("if (%s) %s",
674 e1 = exprData_getPairA (data);
675 e2 = exprData_getPairB (data);
677 exprNode_exprTraverse (e1,
678 FALSE, FALSE, exprNode_loc(e1));
680 exprNode_generateConstraints (e2);
681 e = doIf (e, e1, e2);
684 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
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);
695 exprNode_exprTraverse (p,
696 FALSE, FALSE, exprNode_loc(p));
697 exprNode_generateConstraints (trueBranch);
698 exprNode_generateConstraints (falseBranch);
700 temp = p->ensuresConstraints;
701 p->ensuresConstraints = exprNode_traversEnsuresConstraints (p);
702 constraintList_free(temp);
704 temp = p->requiresConstraints;
705 p->requiresConstraints = exprNode_traversRequiresConstraints (p);
706 constraintList_free(temp);
708 temp = p->trueEnsuresConstraints;
709 p->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(p);
710 constraintList_free(temp);
712 temp = p->falseEnsuresConstraints;
713 p->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(p);
714 constraintList_free(temp);
716 e = doIfElse (e, p, trueBranch, falseBranch);
717 DPRINTF( ("Done IFELSE") );
722 e2 = (exprData_getPairB (data));
723 e1 = (exprData_getPairA (data));
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) ) ));
734 // ret = message ("{ %s }",
735 exprNode_generateConstraints (exprData_getSingle (data));
737 constraintList_free(e->requiresConstraints);
738 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
740 constraintList_free(e->ensuresConstraints);
741 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
742 // e->constraints = (exprData_getSingle (data))->constraints;
750 exprNode_stmtList (e);
760 static bool lltok_isBoolean_Op (lltok tok)
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 */
766 if (lltok_isEq_Op (tok) )
770 if (lltok_isAnd_Op (tok) )
776 if (lltok_isOr_Op (tok) )
781 if (lltok_isGt_Op (tok) )
785 if (lltok_isLt_Op (tok) )
790 if (lltok_isLe_Op (tok) )
795 if (lltok_isGe_Op (tok) )
805 static void exprNode_booleanTraverse (exprNode e, /*@unused@*/ bool definatelv, /*@unused@*/ bool definaterv, fileloc sequencePoint)
811 constraintList tempList, temp;
814 tok = exprData_getOpTok (data);
817 t1 = exprData_getOpA (data);
818 t2 = exprData_getOpB (data);
821 /* arithmetic tests */
823 if (lltok_isEq_Op (tok) )
825 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
826 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
830 if (lltok_isLt_Op (tok) )
832 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
833 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
834 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
835 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
839 if (lltok_isGe_Op (tok) )
842 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
843 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
845 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
846 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
851 if (lltok_isGt_Op (tok) )
853 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
854 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
855 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
856 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
859 if (lltok_isLe_Op (tok) )
861 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
862 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
864 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
865 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
870 /*Logical operations */
872 if (lltok_isAnd_Op (tok) )
876 tempList = constraintList_copy (t1->trueEnsuresConstraints);
877 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
878 e->trueEnsuresConstraints = constraintList_addListFree(e->trueEnsuresConstraints, tempList);
880 //false ensures: fens t1 or tens t1 and fens t2
881 tempList = constraintList_copy (t1->trueEnsuresConstraints);
882 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
884 tempList = constraintList_logicalOr (tempList, t1->falseEnsuresConstraints);
885 constraintList_free(temp);
887 e->falseEnsuresConstraints =constraintList_addList(e->falseEnsuresConstraints, tempList);
890 else if (lltok_isOr_Op (tok) )
893 tempList = constraintList_copy (t1->falseEnsuresConstraints);
894 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
895 e->falseEnsuresConstraints = constraintList_addListFree(e->falseEnsuresConstraints, tempList);
897 //true ensures: tens t1 or fens t1 and tens t2
898 tempList = constraintList_copy (t1->falseEnsuresConstraints);
899 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
902 tempList = constraintList_logicalOr (tempList, t1->trueEnsuresConstraints);
903 constraintList_free(temp);
906 e->trueEnsuresConstraints =constraintList_addListFree(e->trueEnsuresConstraints, tempList);
911 DPRINTF((message("%s is not a boolean operation", lltok_unparse(tok) ) ));
916 void exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, /*@observer@*/ fileloc sequencePoint)
918 exprNode t1, t2, fcn;
920 bool handledExprNode;
926 if (exprNode_isError(e) )
931 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
932 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
934 /*e->requiresConstraints = constraintList_makeNew();
935 e->ensuresConstraints = constraintList_makeNew();
936 e->trueEnsuresConstraints = constraintList_makeNew();;
937 e->falseEnsuresConstraints = constraintList_makeNew();;
939 if (exprNode_isUnhandled (e) )
943 // e = makeDataTypeConstraints (e);
945 handledExprNode = TRUE;
954 t1 = exprData_getSingle (data);
955 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint);
956 e = exprNode_copyConstraints (e, t1);
963 t1 = (exprData_getPairA (data) );
964 t2 = (exprData_getPairB (data) );
965 cons = constraint_makeWriteSafeExprNode (t1, t2);
969 t1 = (exprData_getPairA (data) );
970 t2 = (exprData_getPairB (data) );
971 cons = constraint_makeReadSafeExprNode (t1, t2 );
974 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
975 cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
976 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
978 cons = constraint_makeEnsureLteMaxRead (t2, t1);
979 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
981 // cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
982 // e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
984 exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
985 exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
987 /*@i325 Should check which is array/index. */
991 exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
992 // e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
995 /* //t1 = exprData_getInitId (data); */
996 t2 = exprData_getInitNode (data);
997 //exprNode_exprTraverse (t1, TRUE, FALSE, sequencePoint );
999 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1001 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
1002 if ( (!exprNode_isError (e)) && (!exprNode_isError(t2)) )
1004 cons = constraint_makeEnsureEqual (e, t2, sequencePoint);
1005 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1010 t1 = exprData_getOpA (data);
1011 t2 = exprData_getOpB (data);
1012 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1013 //lltok_unparse (exprData_getOpTok (data));
1014 #warning check this for += -= etc
1015 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1017 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
1018 if ( (!exprNode_isError (t1)) && (!exprNode_isError(t2)) )
1020 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
1021 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1025 t1 = exprData_getOpA (data);
1026 t2 = exprData_getOpB (data);
1028 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1029 tok = exprData_getOpTok (data);
1030 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1032 #warning fix definatelv and definaterv
1034 if (tok.tok == ADD_ASSIGN)
1036 cons = constraint_makeAddAssign (t1, t2, sequencePoint );
1037 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1040 if (tok.tok == SUB_ASSIGN)
1042 cons = constraint_makeSubtractAssign (t1, t2, sequencePoint );
1043 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1048 if (lltok_isBoolean_Op (tok) )
1049 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
1051 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
1054 #warning make sure the case can be ignored..
1059 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1060 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
1064 fcn = exprData_getFcn(data);
1066 exprNode_exprTraverse (fcn, definatelv, definaterv, sequencePoint );
1067 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(fcn), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
1069 fcn->requiresConstraints = constraintList_addListFree (fcn->requiresConstraints,
1070 checkCall (fcn, exprData_getArgs (data) ) );
1072 fcn->ensuresConstraints = constraintList_addListFree (fcn->ensuresConstraints,
1073 getPostConditions(fcn, exprData_getArgs (data),e ) );
1075 t1 = exprNode_createNew (exprNode_getType (e) );
1077 checkArgumentList (t1, exprData_getArgs(data), sequencePoint);
1080 mergeResolve (e, t1, fcn);
1082 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
1086 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1089 case XPR_NULLRETURN:
1095 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
1099 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
1102 case XPR_STRINGLITERAL:
1111 t1 = exprData_getUopNode(data);
1112 tok = (exprData_getUopTok (data));
1113 //lltok_unparse (exprData_getUopTok (data));
1114 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1115 /*handle * pointer access */
1116 if (lltok_isInc_Op (tok) )
1118 DPRINTF(("doing ++(var)"));
1119 t1 = exprData_getUopNode (data);
1120 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1121 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1123 else if (lltok_isDec_Op (tok) )
1125 DPRINTF(("doing --(var)"));
1126 t1 = exprData_getUopNode (data);
1127 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1128 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1130 else if (lltok_isMult( tok ) )
1134 cons = constraint_makeWriteSafeInt (t1, 0);
1138 cons = constraint_makeReadSafeInt (t1, 0);
1140 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
1142 else if (lltok_isNot_Op (tok) )
1145 constraintList_free(e->trueEnsuresConstraints);
1147 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
1148 constraintList_free(e->falseEnsuresConstraints);
1149 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
1152 else if (lltok_isAmpersand_Op (tok) )
1156 else if (lltok_isMinus_Op (tok) )
1160 else if ( lltok_isExcl_Op (tok) )
1164 else if (lltok_isTilde_Op (tok) )
1170 llcontbug((message("Unsupported preop in %s", exprNode_unparse(e) ) ));
1177 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
1179 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
1181 DPRINTF(("doing ++"));
1182 t1 = exprData_getUopNode (data);
1183 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1184 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1186 if (lltok_isDec_Op (exprData_getUopTok (data) ) )
1188 DPRINTF(("doing --"));
1189 t1 = exprData_getUopNode (data);
1190 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1191 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1196 exprNode_exprTraverse (exprData_getCastNode (data), definatelv, definaterv, sequencePoint );
1200 exprNode pred, true, false;
1202 pred = exprData_getTriplePred (data);
1203 true = exprData_getTripleTrue (data);
1204 false = exprData_getTripleFalse (data);
1206 exprNode_exprTraverse (pred, FALSE, TRUE, sequencePoint );
1208 temp = pred->ensuresConstraints;
1209 pred->ensuresConstraints = exprNode_traversEnsuresConstraints(pred);
1210 constraintList_free(temp);
1212 temp = pred->requiresConstraints;
1213 pred->requiresConstraints = exprNode_traversRequiresConstraints(pred);
1214 constraintList_free(temp);
1216 temp = pred->trueEnsuresConstraints;
1217 pred->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(pred);
1218 constraintList_free(temp);
1220 temp = pred->falseEnsuresConstraints;
1221 pred->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(pred);
1222 constraintList_free(temp);
1225 exprNode_exprTraverse (true, FALSE, TRUE, sequencePoint );
1227 temp = true->ensuresConstraints;
1228 true->ensuresConstraints = exprNode_traversEnsuresConstraints(true);
1229 constraintList_free(temp);
1232 temp = true->requiresConstraints;
1233 true->requiresConstraints = exprNode_traversRequiresConstraints(true);
1234 constraintList_free(temp);
1237 temp = true->trueEnsuresConstraints;
1238 true->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(true);
1239 constraintList_free(temp);
1241 temp = true->falseEnsuresConstraints;
1242 true->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(true);
1243 constraintList_free(temp);
1246 exprNode_exprTraverse (false, FALSE, TRUE, sequencePoint );
1248 temp = false->ensuresConstraints;
1249 false->ensuresConstraints = exprNode_traversEnsuresConstraints(false);
1250 constraintList_free(temp);
1253 temp = false->requiresConstraints;
1254 false->requiresConstraints = exprNode_traversRequiresConstraints(false);
1255 constraintList_free(temp);
1258 temp = false->trueEnsuresConstraints;
1259 false->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(false);
1260 constraintList_free(temp);
1262 temp = false->falseEnsuresConstraints;
1263 false->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(false);
1264 constraintList_free(temp);
1266 /* if pred is true e equals true otherwise pred equals false */
1268 cons = constraint_makeEnsureEqual (e, true, sequencePoint);
1269 true->ensuresConstraints = constraintList_add(true->ensuresConstraints, cons);
1271 cons = constraint_makeEnsureEqual (e, true, sequencePoint);
1272 false->ensuresConstraints = constraintList_add(false->ensuresConstraints, cons);
1274 e = doIfElse (e, pred, true, false);
1280 t1 = exprData_getPairA (data);
1281 t2 = exprData_getPairB (data);
1282 /* we essiantially treat this like expr1; expr2
1283 of course sequencePoint isn't adjusted so this isn't completely accurate
1285 exprNode_exprTraverse (t1, FALSE, FALSE, sequencePoint );
1286 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1287 mergeResolve (e, t1, t2);
1291 handledExprNode = FALSE;
1294 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
1295 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
1296 e->requiresConstraints = constraintList_addGeneratingExpr ( e->requiresConstraints, e);
1298 e->ensuresConstraints = constraintList_addGeneratingExpr ( e->ensuresConstraints, e);
1300 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
1302 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
1304 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
1306 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
1308 return; // handledExprNode;
1312 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
1316 bool handledExprNode;
1321 if (exprNode_handleError (e))
1323 ret = constraintList_makeNew();
1326 ret = constraintList_copy (e->trueEnsuresConstraints );
1328 handledExprNode = TRUE;
1335 t1 = exprData_getSingle (data);
1336 ret = constraintList_addListFree ( ret, exprNode_traversTrueEnsuresConstraints (t1) );
1341 ret = constraintList_addListFree (ret,
1342 exprNode_traversTrueEnsuresConstraints
1343 (exprData_getPairA (data) ) );
1345 ret = constraintList_addListFree (ret,
1346 exprNode_traversTrueEnsuresConstraints
1347 (exprData_getPairB (data) ) );
1351 ret = constraintList_addListFree (ret,
1352 exprNode_traversTrueEnsuresConstraints
1353 (exprData_getUopNode (data) ) );
1357 ret = constraintList_addListFree (ret, exprNode_traversTrueEnsuresConstraints
1358 (exprData_getUopNode (data) ) );
1361 ret = constraintList_addListFree (ret,
1362 exprNode_traversTrueEnsuresConstraints
1363 (exprData_getOpA (data) ) );
1365 ret = constraintList_addListFree (ret,
1366 exprNode_traversTrueEnsuresConstraints
1367 (exprData_getOpB (data) ) );
1370 ret = constraintList_addListFree (ret,
1371 exprNode_traversTrueEnsuresConstraints
1372 (exprData_getOpA (data) ) );
1374 ret = constraintList_addListFree (ret,
1375 exprNode_traversTrueEnsuresConstraints
1376 (exprData_getOpB (data) ) );
1380 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1386 ret = constraintList_addListFree (ret,
1387 exprNode_traversTrueEnsuresConstraints
1388 (exprData_getSingle (data) ) );
1392 ret = constraintList_addListFree (ret,
1393 exprNode_traversTrueEnsuresConstraints
1394 (exprData_getFcn (data) ) );
1395 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1399 ret = constraintList_addListFree (ret,
1400 exprNode_traversTrueEnsuresConstraints
1401 (exprData_getSingle (data) ) );
1404 case XPR_NULLRETURN:
1405 // cstring_makeLiteral ("return");;
1409 ret = constraintList_addListFree (ret,
1410 exprNode_traversTrueEnsuresConstraints
1411 (exprData_getFieldNode (data) ) );
1412 //exprData_getFieldName (data) ;
1416 ret = constraintList_addListFree (ret,
1417 exprNode_traversTrueEnsuresConstraints
1418 (exprData_getFieldNode (data) ) );
1419 // exprData_getFieldName (data);
1422 case XPR_STRINGLITERAL:
1423 // cstring_copy (exprData_getLiteral (data));
1427 // cstring_copy (exprData_getLiteral (data));
1431 ret = constraintList_addListFree (ret,
1432 exprNode_traversTrueEnsuresConstraints
1433 (exprData_getUopNode (data) ) );
1438 ret = constraintList_addListFree (ret,
1439 exprNode_traversTrueEnsuresConstraints
1440 (exprData_getCastNode (data) ) );
1450 constraintList exprNode_traversFalseEnsuresConstraints (exprNode e)
1454 bool handledExprNode;
1459 if (exprNode_handleError (e))
1461 ret = constraintList_makeNew();
1464 ret = constraintList_copy (e->falseEnsuresConstraints );
1466 handledExprNode = TRUE;
1473 t1 = exprData_getSingle (data);
1474 ret = constraintList_addListFree ( ret,exprNode_traversFalseEnsuresConstraints (t1) );
1479 ret = constraintList_addListFree (ret,
1480 exprNode_traversFalseEnsuresConstraints
1481 (exprData_getPairA (data) ) );
1483 ret = constraintList_addListFree (ret,
1484 exprNode_traversFalseEnsuresConstraints
1485 (exprData_getPairB (data) ) );
1489 ret = constraintList_addListFree (ret,
1490 exprNode_traversFalseEnsuresConstraints
1491 (exprData_getUopNode (data) ) );
1495 ret = constraintList_addListFree (ret, exprNode_traversFalseEnsuresConstraints
1496 (exprData_getUopNode (data) ) );
1499 ret = constraintList_addListFree (ret,
1500 exprNode_traversFalseEnsuresConstraints
1501 (exprData_getOpA (data) ) );
1503 ret = constraintList_addListFree (ret,
1504 exprNode_traversFalseEnsuresConstraints
1505 (exprData_getOpB (data) ) );
1508 ret = constraintList_addListFree (ret,
1509 exprNode_traversFalseEnsuresConstraints
1510 (exprData_getOpA (data) ) );
1512 ret = constraintList_addListFree (ret,
1513 exprNode_traversFalseEnsuresConstraints
1514 (exprData_getOpB (data) ) );
1518 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1524 ret = constraintList_addListFree (ret,
1525 exprNode_traversFalseEnsuresConstraints
1526 (exprData_getSingle (data) ) );
1530 ret = constraintList_addListFree (ret,
1531 exprNode_traversFalseEnsuresConstraints
1532 (exprData_getFcn (data) ) );
1533 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1537 ret = constraintList_addListFree (ret,
1538 exprNode_traversFalseEnsuresConstraints
1539 (exprData_getSingle (data) ) );
1542 case XPR_NULLRETURN:
1543 // cstring_makeLiteral ("return");;
1547 ret = constraintList_addListFree (ret,
1548 exprNode_traversFalseEnsuresConstraints
1549 (exprData_getFieldNode (data) ) );
1550 //exprData_getFieldName (data) ;
1554 ret = constraintList_addListFree (ret,
1555 exprNode_traversFalseEnsuresConstraints
1556 (exprData_getFieldNode (data) ) );
1557 // exprData_getFieldName (data);
1560 case XPR_STRINGLITERAL:
1561 // cstring_copy (exprData_getLiteral (data));
1565 // cstring_copy (exprData_getLiteral (data));
1569 ret = constraintList_addListFree (ret,
1570 exprNode_traversFalseEnsuresConstraints
1571 (exprData_getUopNode (data) ) );
1576 ret = constraintList_addListFree (ret,
1577 exprNode_traversFalseEnsuresConstraints
1578 (exprData_getCastNode (data) ) );
1589 /* walk down the tree and get all requires Constraints in each subexpression*/
1590 /*@only@*/ constraintList exprNode_traversRequiresConstraints (exprNode e)
1594 bool handledExprNode;
1599 if (exprNode_handleError (e))
1601 ret = constraintList_makeNew();
1604 ret = constraintList_copy (e->requiresConstraints );
1606 handledExprNode = TRUE;
1613 t1 = exprData_getSingle (data);
1614 ret = constraintList_addListFree ( ret, exprNode_traversRequiresConstraints (t1) );
1619 ret = constraintList_addListFree (ret,
1620 exprNode_traversRequiresConstraints
1621 (exprData_getPairA (data) ) );
1623 ret = constraintList_addListFree (ret,
1624 exprNode_traversRequiresConstraints
1625 (exprData_getPairB (data) ) );
1629 ret = constraintList_addListFree (ret,
1630 exprNode_traversRequiresConstraints
1631 (exprData_getUopNode (data) ) );
1635 ret = constraintList_addListFree (ret, exprNode_traversRequiresConstraints
1636 (exprData_getUopNode (data) ) );
1639 ret = constraintList_addListFree (ret,
1640 exprNode_traversRequiresConstraints
1641 (exprData_getOpA (data) ) );
1643 ret = constraintList_addListFree (ret,
1644 exprNode_traversRequiresConstraints
1645 (exprData_getOpB (data) ) );
1648 ret = constraintList_addListFree (ret,
1649 exprNode_traversRequiresConstraints
1650 (exprData_getOpA (data) ) );
1652 ret = constraintList_addListFree (ret,
1653 exprNode_traversRequiresConstraints
1654 (exprData_getOpB (data) ) );
1658 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1664 ret = constraintList_addListFree (ret,
1665 exprNode_traversRequiresConstraints
1666 (exprData_getSingle (data) ) );
1670 ret = constraintList_addListFree (ret,
1671 exprNode_traversRequiresConstraints
1672 (exprData_getFcn (data) ) );
1673 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1677 ret = constraintList_addListFree (ret,
1678 exprNode_traversRequiresConstraints
1679 (exprData_getSingle (data) ) );
1682 case XPR_NULLRETURN:
1683 // cstring_makeLiteral ("return");;
1687 ret = constraintList_addListFree (ret,
1688 exprNode_traversRequiresConstraints
1689 (exprData_getFieldNode (data) ) );
1690 //exprData_getFieldName (data) ;
1694 ret = constraintList_addListFree (ret,
1695 exprNode_traversRequiresConstraints
1696 (exprData_getFieldNode (data) ) );
1697 // exprData_getFieldName (data);
1700 case XPR_STRINGLITERAL:
1701 // cstring_copy (exprData_getLiteral (data));
1705 // cstring_copy (exprData_getLiteral (data));
1709 ret = constraintList_addListFree (ret,
1710 exprNode_traversRequiresConstraints
1711 (exprData_getUopNode (data) ) );
1716 ret = constraintList_addListFree (ret,
1717 exprNode_traversRequiresConstraints
1718 (exprData_getCastNode (data) ) );
1729 /* walk down the tree and get all Ensures Constraints in each subexpression*/
1730 /*@only@*/ constraintList exprNode_traversEnsuresConstraints (exprNode e)
1734 bool handledExprNode;
1737 // constraintExpr tmp;
1742 if (exprNode_handleError (e))
1744 ret = constraintList_makeNew();
1748 ret = constraintList_copy (e->ensuresConstraints );
1749 handledExprNode = TRUE;
1754 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1755 exprNode_unparse (e),
1756 constraintList_print(e->ensuresConstraints)
1764 t1 = exprData_getSingle (data);
1765 ret = constraintList_addListFree ( ret,exprNode_traversEnsuresConstraints (t1) );
1770 ret = constraintList_addListFree (ret,
1771 exprNode_traversEnsuresConstraints
1772 (exprData_getPairA (data) ) );
1774 ret = constraintList_addListFree (ret,
1775 exprNode_traversEnsuresConstraints
1776 (exprData_getPairB (data) ) );
1780 ret = constraintList_addListFree (ret,
1781 exprNode_traversEnsuresConstraints
1782 (exprData_getUopNode (data) ) );
1786 ret = constraintList_addListFree (ret, exprNode_traversEnsuresConstraints
1787 (exprData_getUopNode (data) ) );
1790 ret = constraintList_addListFree (ret,
1791 exprNode_traversEnsuresConstraints
1792 (exprData_getOpA (data) ) );
1794 ret = constraintList_addListFree (ret,
1795 exprNode_traversEnsuresConstraints
1796 (exprData_getOpB (data) ) );
1799 ret = constraintList_addListFree (ret,
1800 exprNode_traversEnsuresConstraints
1801 (exprData_getOpA (data) ) );
1803 ret = constraintList_addListFree (ret,
1804 exprNode_traversEnsuresConstraints
1805 (exprData_getOpB (data) ) );
1809 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1815 ret = constraintList_addListFree (ret,
1816 exprNode_traversEnsuresConstraints
1817 (exprData_getSingle (data) ) );
1821 ret = constraintList_addListFree (ret,
1822 exprNode_traversEnsuresConstraints
1823 (exprData_getFcn (data) ) );
1824 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1828 ret = constraintList_addListFree (ret,
1829 exprNode_traversEnsuresConstraints
1830 (exprData_getSingle (data) ) );
1833 case XPR_NULLRETURN:
1834 // cstring_makeLiteral ("return");;
1838 ret = constraintList_addListFree (ret,
1839 exprNode_traversEnsuresConstraints
1840 (exprData_getFieldNode (data) ) );
1841 //exprData_getFieldName (data) ;
1845 ret = constraintList_addListFree (ret,
1846 exprNode_traversEnsuresConstraints
1847 (exprData_getFieldNode (data) ) );
1848 // exprData_getFieldName (data);
1851 case XPR_STRINGLITERAL:
1852 // cstring_copy (exprData_getLiteral (data));
1856 // cstring_copy (exprData_getLiteral (data));
1860 ret = constraintList_addListFree (ret,
1861 exprNode_traversEnsuresConstraints
1862 (exprData_getUopNode (data) ) );
1866 ret = constraintList_addListFree (ret,
1867 exprNode_traversEnsuresConstraints
1868 (exprData_getCastNode (data) ) );
1875 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1876 exprNode_unparse (e),
1877 // constraintList_print(e->ensuresConstraints),
1878 constraintList_print(ret)