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 #ifndef exprNode_isError
23 # define exprNode_isError(e) ((e) == exprNode_undefined)
28 #define myexprNode_isError(e) ((e) == exprNode_undefined)
32 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e);
33 static bool exprNode_handleError( exprNode p_e);
35 //static cstring exprNode_findConstraints ( exprNode p_e);
36 static bool exprNode_isMultiStatement(exprNode p_e);
37 static bool exprNode_multiStatement (exprNode p_e);
38 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint);
39 //static void exprNode_constraintPropagateUp (exprNode p_e);
40 constraintList exprNode_traversRequiresConstraints (exprNode e);
41 constraintList exprNode_traversEnsuresConstraints (exprNode e);
43 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e);
45 extern constraintList reflectChanges (constraintList pre2, constraintList post1);
47 void mergeResolve (exprNode parent, exprNode child1, exprNode child2);
48 exprNode makeDataTypeConstraints (exprNode e);
49 constraintList constraintList_makeFixedArrayConstraints (sRefSet s);
50 constraintList checkCall (exprNode fcn, exprNodeList arglist);
54 /* if ( ( (exprNode_isError ) ) )
63 bool exprNode_isUnhandled (exprNode e)
65 llassert( exprNode_isDefined(e) );
94 DPRINTF((message ("Warning current constraint generation does not handle expression %s", exprNode_unparse(e)) ) );
106 bool exprNode_handleError( exprNode e)
108 if (exprNode_isError (e) || exprNode_isUnhandled(e) )
110 static /*@only@*/ cstring error = cstring_undefined;
112 if (!cstring_isDefined (error))
114 error = cstring_makeLiteral ("<error>");
117 /*@-unqualifiedtrans*/ return TRUE; /*@=unqualifiedtrans*/
122 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e)
124 if (exprNode_isError (e) )
127 if (exprNode_isUnhandled (e) )
129 DPRINTF( (message("Warning ignoring %s", exprNode_unparse (e) ) ) );
130 e->requiresConstraints = constraintList_new();
131 e->ensuresConstraints = constraintList_new();
132 e->trueEnsuresConstraints = constraintList_new();
133 e->falseEnsuresConstraints = constraintList_new();
139 // e = makeDataTypeConstraints (e);
141 DPRINTF((message ("exprNode_generateConstraints Analysising %s at %s", exprNode_unparse( e),
142 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
144 if (exprNode_isMultiStatement ( e) )
146 exprNode_multiStatement(e);
157 c = constraintList_makeFixedArrayConstraints (e->uses);
158 e->requiresConstraints = reflectChanges (e->requiresConstraints, c);
160 // e->ensuresConstraints = constraintList_mergeEnsures(c, e->ensuresConstraints);
164 /* printf ("%s", (message ("%s", constraintList_printDetailed (e->requiresConstraints) ) ) );
165 printf ("%s", (message ("%s", constraintList_printDetailed (e->ensuresConstraints) ) ) ); */
170 /* handles multiple statements */
172 bool exprNode_isMultiStatement(exprNode e)
174 if (exprNode_handleError (e) != NULL)
196 bool exprNode_stmt (exprNode e)
202 if (exprNode_isError(e) )
206 e->requiresConstraints = constraintList_new();
207 e->ensuresConstraints = constraintList_new();
208 // e = makeDataTypeConstraints(e);
211 DPRINTF(( "STMT:") );
212 DPRINTF ( ( cstring_toCharsSafe ( exprNode_unparse(e)) )
214 if (e->kind != XPR_STMT)
217 DPRINTF (("Not Stmt") );
218 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
219 if (exprNode_isMultiStatement (e) )
221 return exprNode_multiStatement (e );
223 BPRINTF( (message ("Ignoring non-statement %s", exprNode_unparse(e) ) ) );
229 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
231 snode = exprData_getUopNode (e->edata);
233 /* could be stmt involving multiple statements:
234 i.e. if, while for ect.
237 if (exprNode_isMultiStatement (snode))
240 return exprNode_multiStatement (snode);
243 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
244 notError = exprNode_exprTraverse (snode, FALSE, FALSE, loc);
245 e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
246 // printf ("For: %s \n", exprNode_unparse (e) );
247 // printf ("%s\n", constraintList_print(e->requiresConstraints) );
248 e->ensuresConstraints = exprNode_traversEnsuresConstraints(snode);
249 // printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
250 // llassert(notError);
256 bool exprNode_stmtList (exprNode e)
258 exprNode stmt1, stmt2;
259 if (exprNode_isError (e) )
264 e->requiresConstraints = constraintList_new();
265 e->ensuresConstraints = constraintList_new();
266 // e = makeDataTypeConstraints(e);
268 /*Handle case of stmtList with only one statement:
269 The parse tree stores this as stmt instead of stmtList*/
270 if (e->kind != XPR_STMTLIST)
272 return exprNode_stmt(e);
274 llassert (e->kind == XPR_STMTLIST);
275 DPRINTF(( "STMTLIST:") );
276 DPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
277 stmt1 = exprData_getPairA (e->edata);
278 stmt2 = exprData_getPairB (e->edata);
281 DPRINTF((" stmtlist ") );
282 DPRINTF ((message("XW%s | %s", exprNode_unparse(stmt1), exprNode_unparse(stmt2) ) ) );
284 exprNode_stmt (stmt1);
285 DPRINTF(("\nstmt after stmtList call " ));
287 exprNode_stmt (stmt2);
288 mergeResolve (e, stmt1, stmt2 );
290 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
291 constraintList_print(e->requiresConstraints),
292 constraintList_print(e->ensuresConstraints) ) ) );
297 exprNode doIf (exprNode e, exprNode test, exprNode body)
299 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
300 e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
301 e->requiresConstraints = reflectChanges (e->requiresConstraints,
302 test->ensuresConstraints);
304 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
308 constraintList constraintList_makeFixedArrayConstraints (sRefSet s)
311 ret = constraintList_new();
313 sRefSet_elements (s, el)
316 if (sRef_isFixedArray(el) )
320 s = sRef_getArraySize(el);
321 DPRINTF( (message("%s is a fixed array with size %d",
322 sRef_unparse(el), s) ) );
323 con = constraint_makeSRefWriteSafeInt (el, (s - 1));
324 ret = constraintList_add(ret, con);
328 DPRINTF( (message("%s is not a fixed array",
329 sRef_unparse(el)) ) );
337 exprNode makeDataTypeConstraints (exprNode e)
340 DPRINTF(("makeDataTypeConstraints"));
342 c = constraintList_makeFixedArrayConstraints (e->uses);
344 e->ensuresConstraints = constraintList_addList (e->ensuresConstraints, c);
346 /* sRefSet_elements (e->uses, el) */
348 /* if (sRef_isFixedArray(el) ) */
351 /* constraint con; */
352 /* s = sRef_getArraySize(el); */
353 /* DPRINTF( (message("%s is a fixed array with size %d", */
354 /* sRef_unparse(el), s) ) ); */
355 /* con = constraint_makeSRefWriteSafeInt (el, (s - 1)); */
356 /* e->ensuresConstraints = constraintList_add(e->ensuresConstraints, */
361 /* DPRINTF( (message("%s is not a fixed array", */
362 /* sRef_unparse(el)) ) ); */
364 /* end_sRefSet_elements */
370 bool exprNode_multiStatement (exprNode e)
376 exprNode p, trueBranch, falseBranch;
377 exprNode forPred, forBody;
378 exprNode init, test, inc;
381 e->requiresConstraints = constraintList_new();
382 e->ensuresConstraints = constraintList_new();
383 e->trueEnsuresConstraints = constraintList_new();
384 e->falseEnsuresConstraints = constraintList_new();
386 // e = makeDataTypeConstraints(e);
388 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
389 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
391 if (exprNode_handleError (e))
404 // ret = message ("%s %s",
405 forPred = exprData_getPairA (data);
406 forBody = exprData_getPairB (data);
409 //first generate the constraints
410 exprNode_generateConstraints (forPred);
411 exprNode_generateConstraints (forBody);
413 //merge the constraints: modle as if statement
418 init = exprData_getTripleInit (forPred->edata);
419 test = exprData_getTripleTest (forPred->edata);
420 inc = exprData_getTripleInc (forPred->edata);
422 // if ( ( (exprNode_isError (test) || (exprNode_isError(init) ) || (exprNode_isError) ) ) )
423 // if ( ( (myexprNode_isError (test) || (myexprNode_isError(init) ) || (myexprNode_isError) ) ) )
425 //if ( ( (exprNode_isError ) ) )
426 if ( ( (exprNode_isError (test) || (exprNode_isError(init) ) ) || (exprNode_isError (inc) ) ) )
428 BPRINTF ((message ("strange for statement:%s, ignoring it", exprNode_unparse(e) ) ) );
432 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
433 // e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
434 e->requiresConstraints = reflectChanges (e->requiresConstraints, test->ensuresConstraints);
439 // ret = message ("for (%s; %s; %s)",
440 exprNode_generateConstraints (exprData_getTripleInit (data) );
441 exprNode_exprTraverse (exprData_getTripleTest (data),FALSE, FALSE, exprNode_loc(e));
442 exprNode_generateConstraints (exprData_getTripleInc (data));
446 DPRINTF ((exprNode_unparse(e) ) );
447 // ret = message ("if (%s) %s",
448 e1 = exprData_getPairA (data);
449 e2 = exprData_getPairB (data);
451 exprNode_exprTraverse (e1,
452 FALSE, FALSE, exprNode_loc(e1));
454 exprNode_generateConstraints (e2);
456 e = doIf (e, e1, e2);
459 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
463 DPRINTF(("Starting IFELSE"));
464 // ret = message ("if (%s) %s else %s",
465 p = exprData_getTriplePred (data);
466 trueBranch = exprData_getTripleTrue (data);
467 falseBranch = exprData_getTripleFalse (data);
469 exprNode_exprTraverse (p,
470 FALSE, FALSE, exprNode_loc(p));
471 exprNode_generateConstraints (trueBranch);
472 exprNode_generateConstraints (falseBranch);
474 // do requires clauses
476 cons = reflectChanges (trueBranch->requiresConstraints, p->trueEnsuresConstraints);
477 cons = reflectChanges (cons,
478 p->ensuresConstraints);
479 e->requiresConstraints = constraintList_copy (cons);
481 cons = reflectChanges (falseBranch->requiresConstraints, p->falseEnsuresConstraints);
482 cons = reflectChanges (cons,
483 p->ensuresConstraints);
484 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
486 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
487 p->requiresConstraints);
489 // do ensures clauses
490 // find the the ensures lists for each subbranch
491 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
492 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
494 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
495 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
497 // find ensures for whole if/else statement
499 e->ensuresConstraints = constraintList_logicalOr (t, f);
500 DPRINTF( ("Done IFELSE") );
503 e1 = exprData_getPairA (data);
504 e2 = exprData_getPairB (data);
505 exprNode_exprTraverse (e1,
506 FALSE, FALSE, exprNode_loc(e1));
508 exprNode_generateConstraints (e2);
510 e1->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(e1);
512 e->requiresConstraints = reflectChanges (e2->requiresConstraints, e1->trueEnsuresConstraints);
514 e->requiresConstraints = reflectChanges (e->requiresConstraints,
515 e1->ensuresConstraints);
517 e->ensuresConstraints = constraintList_copy (e1->ensuresConstraints);
519 // ret = message ("while (%s) %s",
520 exprNode_generateConstraints (exprData_getPairA (data));
521 exprNode_generateConstraints (exprData_getPairB (data));
522 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data), exprData_getPairB (data) );
526 // ret = message ("do { %s } while (%s)",
527 exprNode_generateConstraints (exprData_getPairB (data));
528 exprNode_generateConstraints (exprData_getPairA (data));
532 // ret = message ("{ %s }",
533 exprNode_generateConstraints (exprData_getSingle (data));
534 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
535 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
536 // e->constraints = (exprData_getSingle (data))->constraints;
541 return exprNode_stmtList (e);
550 bool lltok_isBoolean_Op (lltok tok)
552 /*this should really be a switch statement but
553 I don't want to violate the abstraction
554 maybe this should go in lltok.c */
556 if (lltok_isEq_Op (tok) )
560 if (lltok_isAnd_Op (tok) )
566 if (lltok_isOr_Op (tok) )
571 if (lltok_isGt_Op (tok) )
575 if (lltok_isLt_Op (tok) )
580 if (lltok_isLe_Op (tok) )
585 if (lltok_isGe_Op (tok) )
595 void exprNode_booleanTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint)
601 constraintList tempList;
604 tok = exprData_getOpTok (data);
607 t1 = exprData_getOpA (data);
608 t2 = exprData_getOpB (data);
611 /* arithmetic tests */
613 if (lltok_isEq_Op (tok) )
615 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
616 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
620 if (lltok_isLt_Op (tok) )
622 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
623 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
624 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
625 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
629 if (lltok_isGe_Op (tok) )
632 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
633 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
635 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
636 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
641 if (lltok_isGt_Op (tok) )
643 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
644 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
645 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
646 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
649 if (lltok_isLe_Op (tok) )
651 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
652 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
654 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
655 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
660 /*Logical operations */
662 if (lltok_isAnd_Op (tok) )
666 tempList = constraintList_copy (t1->trueEnsuresConstraints);
667 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
668 e->trueEnsuresConstraints = constraintList_addList(e->trueEnsuresConstraints, tempList);
670 //false ensures: fens t1 or tens t1 and fens t2
671 tempList = constraintList_copy (t1->trueEnsuresConstraints);
672 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
673 tempList = constraintList_logicalOr (tempList, t1->falseEnsuresConstraints);
674 e->falseEnsuresConstraints =constraintList_addList(e->falseEnsuresConstraints, tempList);
678 if (lltok_isOr_Op (tok) )
681 tempList = constraintList_copy (t1->falseEnsuresConstraints);
682 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
683 e->falseEnsuresConstraints = constraintList_addList(e->falseEnsuresConstraints, tempList);
685 //true ensures: tens t1 or fens t1 and tens t2
686 tempList = constraintList_copy (t1->falseEnsuresConstraints);
687 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
688 tempList = constraintList_logicalOr (tempList, t1->trueEnsuresConstraints);
689 e->trueEnsuresConstraints =constraintList_addList(e->trueEnsuresConstraints, tempList);
695 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint)
699 bool handledExprNode;
703 if (exprNode_isError(e) )
708 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
709 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
711 e->requiresConstraints = constraintList_new();
712 e->ensuresConstraints = constraintList_new();
713 e->trueEnsuresConstraints = constraintList_new();;
714 e->falseEnsuresConstraints = constraintList_new();;
716 if (exprNode_isUnhandled (e) )
720 // e = makeDataTypeConstraints (e);
722 handledExprNode = TRUE;
731 t1 = exprData_getSingle (data);
732 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint);
733 e = exprNode_copyConstraints (e, t1);
740 t1 = (exprData_getPairA (data) );
741 t2 = (exprData_getPairB (data) );
742 cons = constraint_makeWriteSafeExprNode (t1, t2);
746 t1 = (exprData_getPairA (data) );
747 t2 = (exprData_getPairB (data) );
748 cons = constraint_makeReadSafeExprNode (t1, t2 );
751 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
752 cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
753 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
754 // cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
755 // e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
757 exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
758 exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
760 /*@i325 Should check which is array/index. */
763 t1 = exprData_getUopNode(data);
764 //lltok_unparse (exprData_getUopTok (data));
765 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
766 /*handle * pointer access */
768 /*@ i 325 do ++ and -- */
769 if (lltok_isMult( exprData_getUopTok (data) ) )
773 cons = constraint_makeWriteSafeInt (t1, 0);
777 cons = constraint_makeReadSafeInt (t1, 0);
779 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
783 if (lltok_isNot_Op (exprData_getUopTok (data) ) )
785 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
786 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
791 exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
792 // e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
795 t1 = exprData_getOpA (data);
796 t2 = exprData_getOpB (data);
797 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
798 lltok_unparse (exprData_getOpTok (data));
799 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
801 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
802 if ( (!exprNode_isError (t1)) && (!exprNode_isError(t2)) )
804 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
805 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
810 t1 = exprData_getOpA (data);
811 t2 = exprData_getOpB (data);
813 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
814 tok = exprData_getOpTok (data);
815 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
817 if (lltok_isBoolean_Op (tok) )
818 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
820 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
823 ctype_unparse (qtype_getType (exprData_getType (data) ) );
828 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
829 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
833 exprNode_exprTraverse (exprData_getFcn (data), definatelv, definaterv, sequencePoint );
834 exprNodeList_unparse (exprData_getArgs (data) );
835 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(exprData_getFcn(data) ), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
839 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
840 checkCall (exprData_getFcn (data), exprData_getArgs (data) ) );
841 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
845 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
849 cstring_makeLiteral ("return");;
854 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
855 exprData_getFieldName (data) ;
859 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
860 exprData_getFieldName (data);
863 case XPR_STRINGLITERAL:
864 cstring_copy (exprData_getLiteral (data));
868 cstring_copy (exprData_getLiteral (data));
872 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
873 lltok_unparse (exprData_getUopTok (data));
874 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
876 DPRINTF(("doing ++"));
877 t1 = exprData_getUopNode (data);
878 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
879 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
880 // cons = constraint_makeMaxReadSideEffectPostIncrement (t1, sequencePoint );
881 //e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
885 handledExprNode = FALSE;
888 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
889 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
891 return handledExprNode;
895 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
899 bool handledExprNode;
904 if (exprNode_handleError (e))
906 ret = constraintList_new();
909 ret = constraintList_copy (e->trueEnsuresConstraints );
911 handledExprNode = TRUE;
920 ret = constraintList_addList (ret,
921 exprNode_traversTrueEnsuresConstraints
922 (exprData_getPairA (data) ) );
924 ret = constraintList_addList (ret,
925 exprNode_traversTrueEnsuresConstraints
926 (exprData_getPairB (data) ) );
930 ret = constraintList_addList (ret,
931 exprNode_traversTrueEnsuresConstraints
932 (exprData_getUopNode (data) ) );
936 ret = constraintList_addList (ret, exprNode_traversTrueEnsuresConstraints
937 (exprData_getUopNode (data) ) );
940 ret = constraintList_addList (ret,
941 exprNode_traversTrueEnsuresConstraints
942 (exprData_getOpA (data) ) );
944 ret = constraintList_addList (ret,
945 exprNode_traversTrueEnsuresConstraints
946 (exprData_getOpB (data) ) );
949 ret = constraintList_addList (ret,
950 exprNode_traversTrueEnsuresConstraints
951 (exprData_getOpA (data) ) );
953 ret = constraintList_addList (ret,
954 exprNode_traversTrueEnsuresConstraints
955 (exprData_getOpB (data) ) );
959 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
965 ret = constraintList_addList (ret,
966 exprNode_traversTrueEnsuresConstraints
967 (exprData_getSingle (data) ) );
971 ret = constraintList_addList (ret,
972 exprNode_traversTrueEnsuresConstraints
973 (exprData_getFcn (data) ) );
974 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
978 ret = constraintList_addList (ret,
979 exprNode_traversTrueEnsuresConstraints
980 (exprData_getSingle (data) ) );
984 // cstring_makeLiteral ("return");;
988 ret = constraintList_addList (ret,
989 exprNode_traversTrueEnsuresConstraints
990 (exprData_getFieldNode (data) ) );
991 //exprData_getFieldName (data) ;
995 ret = constraintList_addList (ret,
996 exprNode_traversTrueEnsuresConstraints
997 (exprData_getFieldNode (data) ) );
998 // exprData_getFieldName (data);
1001 case XPR_STRINGLITERAL:
1002 // cstring_copy (exprData_getLiteral (data));
1006 // cstring_copy (exprData_getLiteral (data));
1010 ret = constraintList_addList (ret,
1011 exprNode_traversTrueEnsuresConstraints
1012 (exprData_getUopNode (data) ) );
1022 /* walk down the tree and get all requires Constraints in each subexpression*/
1023 constraintList exprNode_traversRequiresConstraints (exprNode e)
1027 bool handledExprNode;
1032 if (exprNode_handleError (e))
1034 ret = constraintList_new();
1037 ret = constraintList_copy (e->requiresConstraints );
1039 handledExprNode = TRUE;
1048 ret = constraintList_addList (ret,
1049 exprNode_traversRequiresConstraints
1050 (exprData_getPairA (data) ) );
1052 ret = constraintList_addList (ret,
1053 exprNode_traversRequiresConstraints
1054 (exprData_getPairB (data) ) );
1058 ret = constraintList_addList (ret,
1059 exprNode_traversRequiresConstraints
1060 (exprData_getUopNode (data) ) );
1064 ret = constraintList_addList (ret, exprNode_traversRequiresConstraints
1065 (exprData_getUopNode (data) ) );
1068 ret = constraintList_addList (ret,
1069 exprNode_traversRequiresConstraints
1070 (exprData_getOpA (data) ) );
1072 ret = constraintList_addList (ret,
1073 exprNode_traversRequiresConstraints
1074 (exprData_getOpB (data) ) );
1077 ret = constraintList_addList (ret,
1078 exprNode_traversRequiresConstraints
1079 (exprData_getOpA (data) ) );
1081 ret = constraintList_addList (ret,
1082 exprNode_traversRequiresConstraints
1083 (exprData_getOpB (data) ) );
1087 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1093 ret = constraintList_addList (ret,
1094 exprNode_traversRequiresConstraints
1095 (exprData_getSingle (data) ) );
1099 ret = constraintList_addList (ret,
1100 exprNode_traversRequiresConstraints
1101 (exprData_getFcn (data) ) );
1102 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1106 ret = constraintList_addList (ret,
1107 exprNode_traversRequiresConstraints
1108 (exprData_getSingle (data) ) );
1111 case XPR_NULLRETURN:
1112 // cstring_makeLiteral ("return");;
1116 ret = constraintList_addList (ret,
1117 exprNode_traversRequiresConstraints
1118 (exprData_getFieldNode (data) ) );
1119 //exprData_getFieldName (data) ;
1123 ret = constraintList_addList (ret,
1124 exprNode_traversRequiresConstraints
1125 (exprData_getFieldNode (data) ) );
1126 // exprData_getFieldName (data);
1129 case XPR_STRINGLITERAL:
1130 // cstring_copy (exprData_getLiteral (data));
1134 // cstring_copy (exprData_getLiteral (data));
1138 ret = constraintList_addList (ret,
1139 exprNode_traversRequiresConstraints
1140 (exprData_getUopNode (data) ) );
1150 /* walk down the tree and get all Ensures Constraints in each subexpression*/
1151 constraintList exprNode_traversEnsuresConstraints (exprNode e)
1155 bool handledExprNode;
1158 // constraintExpr tmp;
1163 if (exprNode_handleError (e))
1165 ret = constraintList_new();
1169 ret = constraintList_copy (e->ensuresConstraints );
1170 handledExprNode = TRUE;
1175 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1176 exprNode_unparse (e),
1177 constraintList_print(e->ensuresConstraints)
1187 ret = constraintList_addList (ret,
1188 exprNode_traversEnsuresConstraints
1189 (exprData_getPairA (data) ) );
1191 ret = constraintList_addList (ret,
1192 exprNode_traversEnsuresConstraints
1193 (exprData_getPairB (data) ) );
1197 ret = constraintList_addList (ret,
1198 exprNode_traversEnsuresConstraints
1199 (exprData_getUopNode (data) ) );
1203 ret = constraintList_addList (ret, exprNode_traversEnsuresConstraints
1204 (exprData_getUopNode (data) ) );
1207 ret = constraintList_addList (ret,
1208 exprNode_traversEnsuresConstraints
1209 (exprData_getOpA (data) ) );
1211 ret = constraintList_addList (ret,
1212 exprNode_traversEnsuresConstraints
1213 (exprData_getOpB (data) ) );
1216 ret = constraintList_addList (ret,
1217 exprNode_traversEnsuresConstraints
1218 (exprData_getOpA (data) ) );
1220 ret = constraintList_addList (ret,
1221 exprNode_traversEnsuresConstraints
1222 (exprData_getOpB (data) ) );
1226 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1232 ret = constraintList_addList (ret,
1233 exprNode_traversEnsuresConstraints
1234 (exprData_getSingle (data) ) );
1238 ret = constraintList_addList (ret,
1239 exprNode_traversEnsuresConstraints
1240 (exprData_getFcn (data) ) );
1241 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1245 ret = constraintList_addList (ret,
1246 exprNode_traversEnsuresConstraints
1247 (exprData_getSingle (data) ) );
1250 case XPR_NULLRETURN:
1251 // cstring_makeLiteral ("return");;
1255 ret = constraintList_addList (ret,
1256 exprNode_traversEnsuresConstraints
1257 (exprData_getFieldNode (data) ) );
1258 //exprData_getFieldName (data) ;
1262 ret = constraintList_addList (ret,
1263 exprNode_traversEnsuresConstraints
1264 (exprData_getFieldNode (data) ) );
1265 // exprData_getFieldName (data);
1268 case XPR_STRINGLITERAL:
1269 // cstring_copy (exprData_getLiteral (data));
1273 // cstring_copy (exprData_getLiteral (data));
1277 ret = constraintList_addList (ret,
1278 exprNode_traversEnsuresConstraints
1279 (exprData_getUopNode (data) ) );
1285 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1286 exprNode_unparse (e),
1287 // constraintList_print(e->ensuresConstraints),
1288 constraintList_print(ret)
1297 #ifndef exprNode_isError
1299 # define exprNode_isError(e) ((e) == exprNode_undefined)