6 # include <ctype.h> /* for isdigit */
7 # include "lclintMacros.nf"
10 # include "cgrammar_tokens.h"
12 # include "exprChecks.h"
13 # include "aliasChecks.h"
14 # include "exprNodeSList.h"
16 # include "exprData.i"
17 # include "exprDataQuite.i"
19 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e);
20 static bool exprNode_handleError( exprNode p_e);
22 //static cstring exprNode_findConstraints ( exprNode p_e);
23 static bool exprNode_isMultiStatement(exprNode p_e);
24 static bool exprNode_multiStatement (exprNode p_e);
25 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint);
26 //static void exprNode_constraintPropagateUp (exprNode p_e);
27 constraintList exprNode_traversRequiresConstraints (exprNode e);
28 constraintList exprNode_traversEnsuresConstraints (exprNode e);
30 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e);
32 extern constraintList reflectChanges (constraintList pre2, constraintList post1);
34 void mergeResolve (exprNode parent, exprNode child1, exprNode child2);
35 exprNode makeDataTypeConstraints (exprNode e);
36 constraintList constraintList_makeFixedArrayConstraints (sRefSet s);
37 constraintList checkCall (exprNode fcn, exprNodeList arglist);
39 bool exprNode_isUnhandled (exprNode e)
41 llassert( exprNode_isDefined(e) );
70 DPRINTF((message ("Warning current constraint generation does not handle expression %s", exprNode_unparse(e)) ) );
82 bool exprNode_handleError( exprNode e)
84 if (exprNode_isError (e) || exprNode_isUnhandled(e) )
86 static /*@only@*/ cstring error = cstring_undefined;
88 if (!cstring_isDefined (error))
90 error = cstring_makeLiteral ("<error>");
93 /*@-unqualifiedtrans*/ return TRUE; /*@=unqualifiedtrans*/
98 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e)
100 if (exprNode_isError (e) )
103 if (exprNode_isUnhandled (e) )
105 DPRINTF( (message("Warning ignoring %s", exprNode_unparse (e) ) ) );
106 e->requiresConstraints = constraintList_new();
107 e->ensuresConstraints = constraintList_new();
108 e->trueEnsuresConstraints = constraintList_new();
109 e->falseEnsuresConstraints = constraintList_new();
115 // e = makeDataTypeConstraints (e);
117 DPRINTF((message ("exprNode_generateConstraints Analysising %s at %s", exprNode_unparse( e),
118 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
120 if (exprNode_isMultiStatement ( e) )
122 exprNode_multiStatement(e);
133 c = constraintList_makeFixedArrayConstraints (e->uses);
134 e->requiresConstraints = reflectChanges (e->requiresConstraints, c);
136 // e->ensuresConstraints = constraintList_mergeEnsures(c, e->ensuresConstraints);
140 /* printf ("%s", (message ("%s", constraintList_printDetailed (e->requiresConstraints) ) ) );
141 printf ("%s", (message ("%s", constraintList_printDetailed (e->ensuresConstraints) ) ) ); */
146 /* handles multiple statements */
148 bool exprNode_isMultiStatement(exprNode e)
150 if (exprNode_handleError (e) != NULL)
172 bool exprNode_stmt (exprNode e)
178 if (exprNode_isError(e) )
182 e->requiresConstraints = constraintList_new();
183 e->ensuresConstraints = constraintList_new();
184 // e = makeDataTypeConstraints(e);
187 DPRINTF(( "STMT:") );
188 DPRINTF ( ( cstring_toCharsSafe ( exprNode_unparse(e)) )
190 if (e->kind != XPR_STMT)
193 DPRINTF (("Not Stmt") );
194 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
195 if (exprNode_isMultiStatement (e) )
197 return exprNode_multiStatement (e );
203 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
205 snode = exprData_getUopNode (e->edata);
207 /* could be stmt involving multiple statements:
208 i.e. if, while for ect.
211 if (exprNode_isMultiStatement (snode))
214 return exprNode_multiStatement (snode);
217 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
218 notError = exprNode_exprTraverse (snode, FALSE, FALSE, loc);
219 e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
220 // printf ("For: %s \n", exprNode_unparse (e) );
221 // printf ("%s\n", constraintList_print(e->requiresConstraints) );
222 e->ensuresConstraints = exprNode_traversEnsuresConstraints(snode);
223 // printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
224 // llassert(notError);
230 bool exprNode_stmtList (exprNode e)
232 exprNode stmt1, stmt2;
233 if (exprNode_isError (e) )
238 e->requiresConstraints = constraintList_new();
239 e->ensuresConstraints = constraintList_new();
240 // e = makeDataTypeConstraints(e);
242 /*Handle case of stmtList with only one statement:
243 The parse tree stores this as stmt instead of stmtList*/
244 if (e->kind != XPR_STMTLIST)
246 return exprNode_stmt(e);
248 llassert (e->kind == XPR_STMTLIST);
249 DPRINTF(( "STMTLIST:") );
250 DPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
251 stmt1 = exprData_getPairA (e->edata);
252 stmt2 = exprData_getPairB (e->edata);
255 DPRINTF((" stmtlist ") );
256 DPRINTF ((message("XW%s | %s", exprNode_unparse(stmt1), exprNode_unparse(stmt2) ) ) );
258 exprNode_stmt (stmt1);
259 DPRINTF(("\nstmt after stmtList call " ));
261 exprNode_stmt (stmt2);
262 mergeResolve (e, stmt1, stmt2 );
264 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
265 constraintList_print(e->requiresConstraints),
266 constraintList_print(e->ensuresConstraints) ) ) );
271 exprNode doIf (exprNode e, exprNode test, exprNode body)
273 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
274 e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
275 e->requiresConstraints = reflectChanges (e->requiresConstraints,
276 test->ensuresConstraints);
278 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
282 constraintList constraintList_makeFixedArrayConstraints (sRefSet s)
285 ret = constraintList_new();
287 sRefSet_elements (s, el)
290 if (sRef_isFixedArray(el) )
294 s = sRef_getArraySize(el);
295 DPRINTF( (message("%s is a fixed array with size %d",
296 sRef_unparse(el), s) ) );
297 con = constraint_makeSRefWriteSafeInt (el, (s - 1));
298 ret = constraintList_add(ret, con);
302 DPRINTF( (message("%s is not a fixed array",
303 sRef_unparse(el)) ) );
311 exprNode makeDataTypeConstraints (exprNode e)
314 DPRINTF(("makeDataTypeConstraints"));
316 c = constraintList_makeFixedArrayConstraints (e->uses);
318 e->ensuresConstraints = constraintList_addList (e->ensuresConstraints, c);
320 /* sRefSet_elements (e->uses, el) */
322 /* if (sRef_isFixedArray(el) ) */
325 /* constraint con; */
326 /* s = sRef_getArraySize(el); */
327 /* DPRINTF( (message("%s is a fixed array with size %d", */
328 /* sRef_unparse(el), s) ) ); */
329 /* con = constraint_makeSRefWriteSafeInt (el, (s - 1)); */
330 /* e->ensuresConstraints = constraintList_add(e->ensuresConstraints, */
335 /* DPRINTF( (message("%s is not a fixed array", */
336 /* sRef_unparse(el)) ) ); */
338 /* end_sRefSet_elements */
344 bool exprNode_multiStatement (exprNode e)
350 exprNode p, trueBranch, falseBranch;
351 exprNode forPred, forBody;
352 exprNode init, test, inc;
355 e->requiresConstraints = constraintList_new();
356 e->ensuresConstraints = constraintList_new();
357 e->trueEnsuresConstraints = constraintList_new();
358 e->falseEnsuresConstraints = constraintList_new();
360 // e = makeDataTypeConstraints(e);
362 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
363 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
365 if (exprNode_handleError (e))
378 // ret = message ("%s %s",
379 forPred = exprData_getPairA (data);
380 forBody = exprData_getPairB (data);
383 //first generate the constraints
384 exprNode_generateConstraints (forPred);
385 exprNode_generateConstraints (forBody);
387 //merge the constraints: modle as if statement
392 init = exprData_getTripleInit (forPred->edata);
393 test = exprData_getTripleTest (forPred->edata);
394 inc = exprData_getTripleInc (forPred->edata);
396 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
397 // e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
398 e->requiresConstraints = reflectChanges (e->requiresConstraints, test->ensuresConstraints);
403 // ret = message ("for (%s; %s; %s)",
404 exprNode_generateConstraints (exprData_getTripleInit (data) );
405 exprNode_exprTraverse (exprData_getTripleTest (data),FALSE, FALSE, exprNode_loc(e));
406 exprNode_generateConstraints (exprData_getTripleInc (data));
410 DPRINTF ((exprNode_unparse(e) ) );
411 // ret = message ("if (%s) %s",
412 e1 = exprData_getPairA (data);
413 e2 = exprData_getPairB (data);
415 exprNode_exprTraverse (e1,
416 FALSE, FALSE, exprNode_loc(e1));
418 exprNode_generateConstraints (e2);
420 e = doIf (e, e1, e2);
423 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
427 DPRINTF(("Starting IFELSE"));
428 // ret = message ("if (%s) %s else %s",
429 p = exprData_getTriplePred (data);
430 trueBranch = exprData_getTripleTrue (data);
431 falseBranch = exprData_getTripleFalse (data);
433 exprNode_exprTraverse (p,
434 FALSE, FALSE, exprNode_loc(p));
435 exprNode_generateConstraints (trueBranch);
436 exprNode_generateConstraints (falseBranch);
438 // do requires clauses
440 cons = reflectChanges (trueBranch->requiresConstraints, p->trueEnsuresConstraints);
441 cons = reflectChanges (cons,
442 p->ensuresConstraints);
443 e->requiresConstraints = constraintList_copy (cons);
445 cons = reflectChanges (falseBranch->requiresConstraints, p->falseEnsuresConstraints);
446 cons = reflectChanges (cons,
447 p->ensuresConstraints);
448 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
450 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
451 p->requiresConstraints);
453 // do ensures clauses
454 // find the the ensures lists for each subbranch
455 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
456 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
458 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
459 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
461 // find ensures for whole if/else statement
463 e->ensuresConstraints = constraintList_logicalOr (t, f);
464 DPRINTF( ("Done IFELSE") );
467 e1 = exprData_getPairA (data);
468 e2 = exprData_getPairB (data);
469 exprNode_exprTraverse (e1,
470 FALSE, FALSE, exprNode_loc(e1));
472 exprNode_generateConstraints (e2);
474 e1->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(e1);
476 e->requiresConstraints = reflectChanges (e2->requiresConstraints, e1->trueEnsuresConstraints);
478 e->requiresConstraints = reflectChanges (e->requiresConstraints,
479 e1->ensuresConstraints);
481 e->ensuresConstraints = constraintList_copy (e1->ensuresConstraints);
483 // ret = message ("while (%s) %s",
484 exprNode_generateConstraints (exprData_getPairA (data));
485 exprNode_generateConstraints (exprData_getPairB (data));
486 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data), exprData_getPairB (data) );
490 // ret = message ("do { %s } while (%s)",
491 exprNode_generateConstraints (exprData_getPairB (data));
492 exprNode_generateConstraints (exprData_getPairA (data));
496 // ret = message ("{ %s }",
497 exprNode_generateConstraints (exprData_getSingle (data));
498 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
499 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
500 // e->constraints = (exprData_getSingle (data))->constraints;
505 return exprNode_stmtList (e);
514 bool lltok_isBoolean_Op (lltok tok)
516 /*this should really be a switch statement but
517 I don't want to violate the abstraction
518 maybe this should go in lltok.c */
520 if (lltok_isEq_Op (tok) )
524 if (lltok_isAnd_Op (tok) )
530 if (lltok_isOr_Op (tok) )
535 if (lltok_isGt_Op (tok) )
539 if (lltok_isLt_Op (tok) )
544 if (lltok_isLe_Op (tok) )
549 if (lltok_isGe_Op (tok) )
559 void exprNode_booleanTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint)
565 constraintList tempList;
568 tok = exprData_getOpTok (data);
571 t1 = exprData_getOpA (data);
572 t2 = exprData_getOpB (data);
575 /* arithmetic tests */
577 if (lltok_isEq_Op (tok) )
579 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
580 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
584 if (lltok_isLt_Op (tok) )
586 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
587 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
588 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
589 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
593 if (lltok_isGe_Op (tok) )
596 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
597 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
599 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
600 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
605 if (lltok_isGt_Op (tok) )
607 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
608 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
609 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
610 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
613 if (lltok_isLe_Op (tok) )
615 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
616 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
618 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
619 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
624 /*Logical operations */
626 if (lltok_isAnd_Op (tok) )
630 tempList = constraintList_copy (t1->trueEnsuresConstraints);
631 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
632 e->trueEnsuresConstraints = constraintList_addList(e->trueEnsuresConstraints, tempList);
634 //false ensures: fens t1 or tens t1 and fens t2
635 tempList = constraintList_copy (t1->trueEnsuresConstraints);
636 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
637 tempList = constraintList_logicalOr (tempList, t1->falseEnsuresConstraints);
638 e->falseEnsuresConstraints =constraintList_addList(e->falseEnsuresConstraints, tempList);
642 if (lltok_isOr_Op (tok) )
645 tempList = constraintList_copy (t1->falseEnsuresConstraints);
646 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
647 e->falseEnsuresConstraints = constraintList_addList(e->falseEnsuresConstraints, tempList);
649 //true ensures: tens t1 or fens t1 and tens t2
650 tempList = constraintList_copy (t1->falseEnsuresConstraints);
651 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
652 tempList = constraintList_logicalOr (tempList, t1->trueEnsuresConstraints);
653 e->trueEnsuresConstraints =constraintList_addList(e->trueEnsuresConstraints, tempList);
659 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint)
663 bool handledExprNode;
667 if (exprNode_handleError (e))
672 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
673 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
675 e->requiresConstraints = constraintList_new();
676 e->ensuresConstraints = constraintList_new();
677 e->trueEnsuresConstraints = constraintList_new();;
678 e->falseEnsuresConstraints = constraintList_new();;
680 // e = makeDataTypeConstraints (e);
682 handledExprNode = TRUE;
691 t1 = exprData_getSingle (data);
692 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint);
693 e = exprNode_copyConstraints (e, t1);
700 t1 = (exprData_getPairA (data) );
701 t2 = (exprData_getPairB (data) );
702 cons = constraint_makeWriteSafeExprNode (t1, t2);
706 t1 = (exprData_getPairA (data) );
707 t2 = (exprData_getPairB (data) );
708 cons = constraint_makeReadSafeExprNode (t1, t2 );
711 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
712 cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
713 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
714 // cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
715 // e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
717 exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
718 exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
720 /*@i325 Should check which is array/index. */
723 t1 = exprData_getUopNode(data);
724 //lltok_unparse (exprData_getUopTok (data));
725 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
726 /*handle * pointer access */
728 /*@ i 325 do ++ and -- */
729 if (lltok_isMult( exprData_getUopTok (data) ) )
733 cons = constraint_makeWriteSafeInt (t1, 0);
737 cons = constraint_makeReadSafeInt (t1, 0);
739 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
743 if (lltok_isNot_Op (exprData_getUopTok (data) ) )
745 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
746 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
751 exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
752 // e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
755 t1 = exprData_getOpA (data);
756 t2 = exprData_getOpB (data);
757 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
758 lltok_unparse (exprData_getOpTok (data));
759 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
761 // DPRINTF ( ("Doing ASSign"));
762 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
764 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
768 t1 = exprData_getOpA (data);
769 t2 = exprData_getOpB (data);
771 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
772 tok = exprData_getOpTok (data);
773 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
775 if (lltok_isBoolean_Op (tok) )
776 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
778 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
781 ctype_unparse (qtype_getType (exprData_getType (data) ) );
786 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
787 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
791 exprNode_exprTraverse (exprData_getFcn (data), definatelv, definaterv, sequencePoint );
792 exprNodeList_unparse (exprData_getArgs (data) );
793 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(exprData_getFcn(data) ), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
797 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
798 checkCall (exprData_getFcn (data), exprData_getArgs (data) ) );
799 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
803 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
807 cstring_makeLiteral ("return");;
812 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
813 exprData_getFieldName (data) ;
817 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
818 exprData_getFieldName (data);
821 case XPR_STRINGLITERAL:
822 cstring_copy (exprData_getLiteral (data));
826 cstring_copy (exprData_getLiteral (data));
830 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
831 lltok_unparse (exprData_getUopTok (data));
832 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
834 DPRINTF(("doing ++"));
835 t1 = exprData_getUopNode (data);
836 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
837 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
838 // cons = constraint_makeMaxReadSideEffectPostIncrement (t1, sequencePoint );
839 //e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
843 handledExprNode = FALSE;
846 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
847 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
849 return handledExprNode;
853 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
857 bool handledExprNode;
862 if (exprNode_handleError (e))
864 ret = constraintList_new();
867 ret = constraintList_copy (e->trueEnsuresConstraints );
869 handledExprNode = TRUE;
878 ret = constraintList_addList (ret,
879 exprNode_traversTrueEnsuresConstraints
880 (exprData_getPairA (data) ) );
882 ret = constraintList_addList (ret,
883 exprNode_traversTrueEnsuresConstraints
884 (exprData_getPairB (data) ) );
888 ret = constraintList_addList (ret,
889 exprNode_traversTrueEnsuresConstraints
890 (exprData_getUopNode (data) ) );
894 ret = constraintList_addList (ret, exprNode_traversTrueEnsuresConstraints
895 (exprData_getUopNode (data) ) );
898 ret = constraintList_addList (ret,
899 exprNode_traversTrueEnsuresConstraints
900 (exprData_getOpA (data) ) );
902 ret = constraintList_addList (ret,
903 exprNode_traversTrueEnsuresConstraints
904 (exprData_getOpB (data) ) );
907 ret = constraintList_addList (ret,
908 exprNode_traversTrueEnsuresConstraints
909 (exprData_getOpA (data) ) );
911 ret = constraintList_addList (ret,
912 exprNode_traversTrueEnsuresConstraints
913 (exprData_getOpB (data) ) );
917 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
923 ret = constraintList_addList (ret,
924 exprNode_traversTrueEnsuresConstraints
925 (exprData_getSingle (data) ) );
929 ret = constraintList_addList (ret,
930 exprNode_traversTrueEnsuresConstraints
931 (exprData_getFcn (data) ) );
932 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
936 ret = constraintList_addList (ret,
937 exprNode_traversTrueEnsuresConstraints
938 (exprData_getSingle (data) ) );
942 // cstring_makeLiteral ("return");;
946 ret = constraintList_addList (ret,
947 exprNode_traversTrueEnsuresConstraints
948 (exprData_getFieldNode (data) ) );
949 //exprData_getFieldName (data) ;
953 ret = constraintList_addList (ret,
954 exprNode_traversTrueEnsuresConstraints
955 (exprData_getFieldNode (data) ) );
956 // exprData_getFieldName (data);
959 case XPR_STRINGLITERAL:
960 // cstring_copy (exprData_getLiteral (data));
964 // cstring_copy (exprData_getLiteral (data));
968 ret = constraintList_addList (ret,
969 exprNode_traversTrueEnsuresConstraints
970 (exprData_getUopNode (data) ) );
980 /* walk down the tree and get all requires Constraints in each subexpression*/
981 constraintList exprNode_traversRequiresConstraints (exprNode e)
985 bool handledExprNode;
990 if (exprNode_handleError (e))
992 ret = constraintList_new();
995 ret = constraintList_copy (e->requiresConstraints );
997 handledExprNode = TRUE;
1006 ret = constraintList_addList (ret,
1007 exprNode_traversRequiresConstraints
1008 (exprData_getPairA (data) ) );
1010 ret = constraintList_addList (ret,
1011 exprNode_traversRequiresConstraints
1012 (exprData_getPairB (data) ) );
1016 ret = constraintList_addList (ret,
1017 exprNode_traversRequiresConstraints
1018 (exprData_getUopNode (data) ) );
1022 ret = constraintList_addList (ret, exprNode_traversRequiresConstraints
1023 (exprData_getUopNode (data) ) );
1026 ret = constraintList_addList (ret,
1027 exprNode_traversRequiresConstraints
1028 (exprData_getOpA (data) ) );
1030 ret = constraintList_addList (ret,
1031 exprNode_traversRequiresConstraints
1032 (exprData_getOpB (data) ) );
1035 ret = constraintList_addList (ret,
1036 exprNode_traversRequiresConstraints
1037 (exprData_getOpA (data) ) );
1039 ret = constraintList_addList (ret,
1040 exprNode_traversRequiresConstraints
1041 (exprData_getOpB (data) ) );
1045 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1051 ret = constraintList_addList (ret,
1052 exprNode_traversRequiresConstraints
1053 (exprData_getSingle (data) ) );
1057 ret = constraintList_addList (ret,
1058 exprNode_traversRequiresConstraints
1059 (exprData_getFcn (data) ) );
1060 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1064 ret = constraintList_addList (ret,
1065 exprNode_traversRequiresConstraints
1066 (exprData_getSingle (data) ) );
1069 case XPR_NULLRETURN:
1070 // cstring_makeLiteral ("return");;
1074 ret = constraintList_addList (ret,
1075 exprNode_traversRequiresConstraints
1076 (exprData_getFieldNode (data) ) );
1077 //exprData_getFieldName (data) ;
1081 ret = constraintList_addList (ret,
1082 exprNode_traversRequiresConstraints
1083 (exprData_getFieldNode (data) ) );
1084 // exprData_getFieldName (data);
1087 case XPR_STRINGLITERAL:
1088 // cstring_copy (exprData_getLiteral (data));
1092 // cstring_copy (exprData_getLiteral (data));
1096 ret = constraintList_addList (ret,
1097 exprNode_traversRequiresConstraints
1098 (exprData_getUopNode (data) ) );
1108 /* walk down the tree and get all Ensures Constraints in each subexpression*/
1109 constraintList exprNode_traversEnsuresConstraints (exprNode e)
1113 bool handledExprNode;
1116 // constraintExpr tmp;
1121 if (exprNode_handleError (e))
1123 ret = constraintList_new();
1127 ret = constraintList_copy (e->ensuresConstraints );
1128 handledExprNode = TRUE;
1133 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1134 exprNode_unparse (e),
1135 constraintList_print(e->ensuresConstraints)
1145 ret = constraintList_addList (ret,
1146 exprNode_traversEnsuresConstraints
1147 (exprData_getPairA (data) ) );
1149 ret = constraintList_addList (ret,
1150 exprNode_traversEnsuresConstraints
1151 (exprData_getPairB (data) ) );
1155 ret = constraintList_addList (ret,
1156 exprNode_traversEnsuresConstraints
1157 (exprData_getUopNode (data) ) );
1161 ret = constraintList_addList (ret, exprNode_traversEnsuresConstraints
1162 (exprData_getUopNode (data) ) );
1165 ret = constraintList_addList (ret,
1166 exprNode_traversEnsuresConstraints
1167 (exprData_getOpA (data) ) );
1169 ret = constraintList_addList (ret,
1170 exprNode_traversEnsuresConstraints
1171 (exprData_getOpB (data) ) );
1174 ret = constraintList_addList (ret,
1175 exprNode_traversEnsuresConstraints
1176 (exprData_getOpA (data) ) );
1178 ret = constraintList_addList (ret,
1179 exprNode_traversEnsuresConstraints
1180 (exprData_getOpB (data) ) );
1184 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1190 ret = constraintList_addList (ret,
1191 exprNode_traversEnsuresConstraints
1192 (exprData_getSingle (data) ) );
1196 ret = constraintList_addList (ret,
1197 exprNode_traversEnsuresConstraints
1198 (exprData_getFcn (data) ) );
1199 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1203 ret = constraintList_addList (ret,
1204 exprNode_traversEnsuresConstraints
1205 (exprData_getSingle (data) ) );
1208 case XPR_NULLRETURN:
1209 // cstring_makeLiteral ("return");;
1213 ret = constraintList_addList (ret,
1214 exprNode_traversEnsuresConstraints
1215 (exprData_getFieldNode (data) ) );
1216 //exprData_getFieldName (data) ;
1220 ret = constraintList_addList (ret,
1221 exprNode_traversEnsuresConstraints
1222 (exprData_getFieldNode (data) ) );
1223 // exprData_getFieldName (data);
1226 case XPR_STRINGLITERAL:
1227 // cstring_copy (exprData_getLiteral (data));
1231 // cstring_copy (exprData_getLiteral (data));
1235 ret = constraintList_addList (ret,
1236 exprNode_traversEnsuresConstraints
1237 (exprData_getUopNode (data) ) );
1243 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1244 exprNode_unparse (e),
1245 // constraintList_print(e->ensuresConstraints),
1246 constraintList_print(ret)