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 );
199 BPRINTF( (message ("Ignoring non-statement %s", exprNode_unparse(e) ) ) );
205 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
207 snode = exprData_getUopNode (e->edata);
209 /* could be stmt involving multiple statements:
210 i.e. if, while for ect.
213 if (exprNode_isMultiStatement (snode))
216 return exprNode_multiStatement (snode);
219 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
220 notError = exprNode_exprTraverse (snode, FALSE, FALSE, loc);
221 e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
222 // printf ("For: %s \n", exprNode_unparse (e) );
223 // printf ("%s\n", constraintList_print(e->requiresConstraints) );
224 e->ensuresConstraints = exprNode_traversEnsuresConstraints(snode);
225 // printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
226 // llassert(notError);
232 bool exprNode_stmtList (exprNode e)
234 exprNode stmt1, stmt2;
235 if (exprNode_isError (e) )
240 e->requiresConstraints = constraintList_new();
241 e->ensuresConstraints = constraintList_new();
242 // e = makeDataTypeConstraints(e);
244 /*Handle case of stmtList with only one statement:
245 The parse tree stores this as stmt instead of stmtList*/
246 if (e->kind != XPR_STMTLIST)
248 return exprNode_stmt(e);
250 llassert (e->kind == XPR_STMTLIST);
251 DPRINTF(( "STMTLIST:") );
252 DPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
253 stmt1 = exprData_getPairA (e->edata);
254 stmt2 = exprData_getPairB (e->edata);
257 DPRINTF((" stmtlist ") );
258 DPRINTF ((message("XW%s | %s", exprNode_unparse(stmt1), exprNode_unparse(stmt2) ) ) );
260 exprNode_stmt (stmt1);
261 DPRINTF(("\nstmt after stmtList call " ));
263 exprNode_stmt (stmt2);
264 mergeResolve (e, stmt1, stmt2 );
266 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
267 constraintList_print(e->requiresConstraints),
268 constraintList_print(e->ensuresConstraints) ) ) );
273 exprNode doIf (exprNode e, exprNode test, exprNode body)
275 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
276 e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
277 e->requiresConstraints = reflectChanges (e->requiresConstraints,
278 test->ensuresConstraints);
280 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
284 constraintList constraintList_makeFixedArrayConstraints (sRefSet s)
287 ret = constraintList_new();
289 sRefSet_elements (s, el)
292 if (sRef_isFixedArray(el) )
296 s = sRef_getArraySize(el);
297 DPRINTF( (message("%s is a fixed array with size %d",
298 sRef_unparse(el), s) ) );
299 con = constraint_makeSRefWriteSafeInt (el, (s - 1));
300 ret = constraintList_add(ret, con);
304 DPRINTF( (message("%s is not a fixed array",
305 sRef_unparse(el)) ) );
313 exprNode makeDataTypeConstraints (exprNode e)
316 DPRINTF(("makeDataTypeConstraints"));
318 c = constraintList_makeFixedArrayConstraints (e->uses);
320 e->ensuresConstraints = constraintList_addList (e->ensuresConstraints, c);
322 /* sRefSet_elements (e->uses, el) */
324 /* if (sRef_isFixedArray(el) ) */
327 /* constraint con; */
328 /* s = sRef_getArraySize(el); */
329 /* DPRINTF( (message("%s is a fixed array with size %d", */
330 /* sRef_unparse(el), s) ) ); */
331 /* con = constraint_makeSRefWriteSafeInt (el, (s - 1)); */
332 /* e->ensuresConstraints = constraintList_add(e->ensuresConstraints, */
337 /* DPRINTF( (message("%s is not a fixed array", */
338 /* sRef_unparse(el)) ) ); */
340 /* end_sRefSet_elements */
346 bool exprNode_multiStatement (exprNode e)
352 exprNode p, trueBranch, falseBranch;
353 exprNode forPred, forBody;
354 exprNode init, test, inc;
357 e->requiresConstraints = constraintList_new();
358 e->ensuresConstraints = constraintList_new();
359 e->trueEnsuresConstraints = constraintList_new();
360 e->falseEnsuresConstraints = constraintList_new();
362 // e = makeDataTypeConstraints(e);
364 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
365 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
367 if (exprNode_handleError (e))
380 // ret = message ("%s %s",
381 forPred = exprData_getPairA (data);
382 forBody = exprData_getPairB (data);
385 //first generate the constraints
386 exprNode_generateConstraints (forPred);
387 exprNode_generateConstraints (forBody);
389 //merge the constraints: modle as if statement
394 init = exprData_getTripleInit (forPred->edata);
395 test = exprData_getTripleTest (forPred->edata);
396 inc = exprData_getTripleInc (forPred->edata);
398 if ( ( (exprNode_isError (test) || (exprNode_isError(init) ) || (exprNode_isError) ) ) )
400 BPRINTF (("strange for statement:%s, ignoring it", exprNode_unparse(e) ) );
404 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
405 // e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
406 e->requiresConstraints = reflectChanges (e->requiresConstraints, test->ensuresConstraints);
411 // ret = message ("for (%s; %s; %s)",
412 exprNode_generateConstraints (exprData_getTripleInit (data) );
413 exprNode_exprTraverse (exprData_getTripleTest (data),FALSE, FALSE, exprNode_loc(e));
414 exprNode_generateConstraints (exprData_getTripleInc (data));
418 DPRINTF ((exprNode_unparse(e) ) );
419 // ret = message ("if (%s) %s",
420 e1 = exprData_getPairA (data);
421 e2 = exprData_getPairB (data);
423 exprNode_exprTraverse (e1,
424 FALSE, FALSE, exprNode_loc(e1));
426 exprNode_generateConstraints (e2);
428 e = doIf (e, e1, e2);
431 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
435 DPRINTF(("Starting IFELSE"));
436 // ret = message ("if (%s) %s else %s",
437 p = exprData_getTriplePred (data);
438 trueBranch = exprData_getTripleTrue (data);
439 falseBranch = exprData_getTripleFalse (data);
441 exprNode_exprTraverse (p,
442 FALSE, FALSE, exprNode_loc(p));
443 exprNode_generateConstraints (trueBranch);
444 exprNode_generateConstraints (falseBranch);
446 // do requires clauses
448 cons = reflectChanges (trueBranch->requiresConstraints, p->trueEnsuresConstraints);
449 cons = reflectChanges (cons,
450 p->ensuresConstraints);
451 e->requiresConstraints = constraintList_copy (cons);
453 cons = reflectChanges (falseBranch->requiresConstraints, p->falseEnsuresConstraints);
454 cons = reflectChanges (cons,
455 p->ensuresConstraints);
456 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
458 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
459 p->requiresConstraints);
461 // do ensures clauses
462 // find the the ensures lists for each subbranch
463 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
464 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
466 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
467 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
469 // find ensures for whole if/else statement
471 e->ensuresConstraints = constraintList_logicalOr (t, f);
472 DPRINTF( ("Done IFELSE") );
475 e1 = exprData_getPairA (data);
476 e2 = exprData_getPairB (data);
477 exprNode_exprTraverse (e1,
478 FALSE, FALSE, exprNode_loc(e1));
480 exprNode_generateConstraints (e2);
482 e1->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(e1);
484 e->requiresConstraints = reflectChanges (e2->requiresConstraints, e1->trueEnsuresConstraints);
486 e->requiresConstraints = reflectChanges (e->requiresConstraints,
487 e1->ensuresConstraints);
489 e->ensuresConstraints = constraintList_copy (e1->ensuresConstraints);
491 // ret = message ("while (%s) %s",
492 exprNode_generateConstraints (exprData_getPairA (data));
493 exprNode_generateConstraints (exprData_getPairB (data));
494 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data), exprData_getPairB (data) );
498 // ret = message ("do { %s } while (%s)",
499 exprNode_generateConstraints (exprData_getPairB (data));
500 exprNode_generateConstraints (exprData_getPairA (data));
504 // ret = message ("{ %s }",
505 exprNode_generateConstraints (exprData_getSingle (data));
506 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
507 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
508 // e->constraints = (exprData_getSingle (data))->constraints;
513 return exprNode_stmtList (e);
522 bool lltok_isBoolean_Op (lltok tok)
524 /*this should really be a switch statement but
525 I don't want to violate the abstraction
526 maybe this should go in lltok.c */
528 if (lltok_isEq_Op (tok) )
532 if (lltok_isAnd_Op (tok) )
538 if (lltok_isOr_Op (tok) )
543 if (lltok_isGt_Op (tok) )
547 if (lltok_isLt_Op (tok) )
552 if (lltok_isLe_Op (tok) )
557 if (lltok_isGe_Op (tok) )
567 void exprNode_booleanTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint)
573 constraintList tempList;
576 tok = exprData_getOpTok (data);
579 t1 = exprData_getOpA (data);
580 t2 = exprData_getOpB (data);
583 /* arithmetic tests */
585 if (lltok_isEq_Op (tok) )
587 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
588 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
592 if (lltok_isLt_Op (tok) )
594 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
595 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
596 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
597 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
601 if (lltok_isGe_Op (tok) )
604 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
605 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
607 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
608 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
613 if (lltok_isGt_Op (tok) )
615 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
616 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
617 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
618 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
621 if (lltok_isLe_Op (tok) )
623 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
624 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
626 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
627 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
632 /*Logical operations */
634 if (lltok_isAnd_Op (tok) )
638 tempList = constraintList_copy (t1->trueEnsuresConstraints);
639 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
640 e->trueEnsuresConstraints = constraintList_addList(e->trueEnsuresConstraints, tempList);
642 //false ensures: fens t1 or tens t1 and fens t2
643 tempList = constraintList_copy (t1->trueEnsuresConstraints);
644 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
645 tempList = constraintList_logicalOr (tempList, t1->falseEnsuresConstraints);
646 e->falseEnsuresConstraints =constraintList_addList(e->falseEnsuresConstraints, tempList);
650 if (lltok_isOr_Op (tok) )
653 tempList = constraintList_copy (t1->falseEnsuresConstraints);
654 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
655 e->falseEnsuresConstraints = constraintList_addList(e->falseEnsuresConstraints, tempList);
657 //true ensures: tens t1 or fens t1 and tens t2
658 tempList = constraintList_copy (t1->falseEnsuresConstraints);
659 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
660 tempList = constraintList_logicalOr (tempList, t1->trueEnsuresConstraints);
661 e->trueEnsuresConstraints =constraintList_addList(e->trueEnsuresConstraints, tempList);
667 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint)
671 bool handledExprNode;
675 if (exprNode_isError(e) )
680 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
681 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
683 e->requiresConstraints = constraintList_new();
684 e->ensuresConstraints = constraintList_new();
685 e->trueEnsuresConstraints = constraintList_new();;
686 e->falseEnsuresConstraints = constraintList_new();;
688 if (exprNode_isUnhandled (e) )
692 // e = makeDataTypeConstraints (e);
694 handledExprNode = TRUE;
703 t1 = exprData_getSingle (data);
704 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint);
705 e = exprNode_copyConstraints (e, t1);
712 t1 = (exprData_getPairA (data) );
713 t2 = (exprData_getPairB (data) );
714 cons = constraint_makeWriteSafeExprNode (t1, t2);
718 t1 = (exprData_getPairA (data) );
719 t2 = (exprData_getPairB (data) );
720 cons = constraint_makeReadSafeExprNode (t1, t2 );
723 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
724 cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
725 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
726 // cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
727 // e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
729 exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
730 exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
732 /*@i325 Should check which is array/index. */
735 t1 = exprData_getUopNode(data);
736 //lltok_unparse (exprData_getUopTok (data));
737 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
738 /*handle * pointer access */
740 /*@ i 325 do ++ and -- */
741 if (lltok_isMult( exprData_getUopTok (data) ) )
745 cons = constraint_makeWriteSafeInt (t1, 0);
749 cons = constraint_makeReadSafeInt (t1, 0);
751 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
755 if (lltok_isNot_Op (exprData_getUopTok (data) ) )
757 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
758 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
763 exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
764 // e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
767 t1 = exprData_getOpA (data);
768 t2 = exprData_getOpB (data);
769 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
770 lltok_unparse (exprData_getOpTok (data));
771 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
773 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
774 if ( (!exprNode_isError (t1)) && (!exprNode_isError(t2)) )
776 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
777 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
782 t1 = exprData_getOpA (data);
783 t2 = exprData_getOpB (data);
785 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
786 tok = exprData_getOpTok (data);
787 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
789 if (lltok_isBoolean_Op (tok) )
790 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
792 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
795 ctype_unparse (qtype_getType (exprData_getType (data) ) );
800 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
801 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
805 exprNode_exprTraverse (exprData_getFcn (data), definatelv, definaterv, sequencePoint );
806 exprNodeList_unparse (exprData_getArgs (data) );
807 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(exprData_getFcn(data) ), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
811 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
812 checkCall (exprData_getFcn (data), exprData_getArgs (data) ) );
813 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
817 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
821 cstring_makeLiteral ("return");;
826 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
827 exprData_getFieldName (data) ;
831 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
832 exprData_getFieldName (data);
835 case XPR_STRINGLITERAL:
836 cstring_copy (exprData_getLiteral (data));
840 cstring_copy (exprData_getLiteral (data));
844 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
845 lltok_unparse (exprData_getUopTok (data));
846 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
848 DPRINTF(("doing ++"));
849 t1 = exprData_getUopNode (data);
850 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
851 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
852 // cons = constraint_makeMaxReadSideEffectPostIncrement (t1, sequencePoint );
853 //e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
857 handledExprNode = FALSE;
860 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
861 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
863 return handledExprNode;
867 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
871 bool handledExprNode;
876 if (exprNode_handleError (e))
878 ret = constraintList_new();
881 ret = constraintList_copy (e->trueEnsuresConstraints );
883 handledExprNode = TRUE;
892 ret = constraintList_addList (ret,
893 exprNode_traversTrueEnsuresConstraints
894 (exprData_getPairA (data) ) );
896 ret = constraintList_addList (ret,
897 exprNode_traversTrueEnsuresConstraints
898 (exprData_getPairB (data) ) );
902 ret = constraintList_addList (ret,
903 exprNode_traversTrueEnsuresConstraints
904 (exprData_getUopNode (data) ) );
908 ret = constraintList_addList (ret, exprNode_traversTrueEnsuresConstraints
909 (exprData_getUopNode (data) ) );
912 ret = constraintList_addList (ret,
913 exprNode_traversTrueEnsuresConstraints
914 (exprData_getOpA (data) ) );
916 ret = constraintList_addList (ret,
917 exprNode_traversTrueEnsuresConstraints
918 (exprData_getOpB (data) ) );
921 ret = constraintList_addList (ret,
922 exprNode_traversTrueEnsuresConstraints
923 (exprData_getOpA (data) ) );
925 ret = constraintList_addList (ret,
926 exprNode_traversTrueEnsuresConstraints
927 (exprData_getOpB (data) ) );
931 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
937 ret = constraintList_addList (ret,
938 exprNode_traversTrueEnsuresConstraints
939 (exprData_getSingle (data) ) );
943 ret = constraintList_addList (ret,
944 exprNode_traversTrueEnsuresConstraints
945 (exprData_getFcn (data) ) );
946 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
950 ret = constraintList_addList (ret,
951 exprNode_traversTrueEnsuresConstraints
952 (exprData_getSingle (data) ) );
956 // cstring_makeLiteral ("return");;
960 ret = constraintList_addList (ret,
961 exprNode_traversTrueEnsuresConstraints
962 (exprData_getFieldNode (data) ) );
963 //exprData_getFieldName (data) ;
967 ret = constraintList_addList (ret,
968 exprNode_traversTrueEnsuresConstraints
969 (exprData_getFieldNode (data) ) );
970 // exprData_getFieldName (data);
973 case XPR_STRINGLITERAL:
974 // cstring_copy (exprData_getLiteral (data));
978 // cstring_copy (exprData_getLiteral (data));
982 ret = constraintList_addList (ret,
983 exprNode_traversTrueEnsuresConstraints
984 (exprData_getUopNode (data) ) );
994 /* walk down the tree and get all requires Constraints in each subexpression*/
995 constraintList exprNode_traversRequiresConstraints (exprNode e)
999 bool handledExprNode;
1004 if (exprNode_handleError (e))
1006 ret = constraintList_new();
1009 ret = constraintList_copy (e->requiresConstraints );
1011 handledExprNode = TRUE;
1020 ret = constraintList_addList (ret,
1021 exprNode_traversRequiresConstraints
1022 (exprData_getPairA (data) ) );
1024 ret = constraintList_addList (ret,
1025 exprNode_traversRequiresConstraints
1026 (exprData_getPairB (data) ) );
1030 ret = constraintList_addList (ret,
1031 exprNode_traversRequiresConstraints
1032 (exprData_getUopNode (data) ) );
1036 ret = constraintList_addList (ret, exprNode_traversRequiresConstraints
1037 (exprData_getUopNode (data) ) );
1040 ret = constraintList_addList (ret,
1041 exprNode_traversRequiresConstraints
1042 (exprData_getOpA (data) ) );
1044 ret = constraintList_addList (ret,
1045 exprNode_traversRequiresConstraints
1046 (exprData_getOpB (data) ) );
1049 ret = constraintList_addList (ret,
1050 exprNode_traversRequiresConstraints
1051 (exprData_getOpA (data) ) );
1053 ret = constraintList_addList (ret,
1054 exprNode_traversRequiresConstraints
1055 (exprData_getOpB (data) ) );
1059 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1065 ret = constraintList_addList (ret,
1066 exprNode_traversRequiresConstraints
1067 (exprData_getSingle (data) ) );
1071 ret = constraintList_addList (ret,
1072 exprNode_traversRequiresConstraints
1073 (exprData_getFcn (data) ) );
1074 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1078 ret = constraintList_addList (ret,
1079 exprNode_traversRequiresConstraints
1080 (exprData_getSingle (data) ) );
1083 case XPR_NULLRETURN:
1084 // cstring_makeLiteral ("return");;
1088 ret = constraintList_addList (ret,
1089 exprNode_traversRequiresConstraints
1090 (exprData_getFieldNode (data) ) );
1091 //exprData_getFieldName (data) ;
1095 ret = constraintList_addList (ret,
1096 exprNode_traversRequiresConstraints
1097 (exprData_getFieldNode (data) ) );
1098 // exprData_getFieldName (data);
1101 case XPR_STRINGLITERAL:
1102 // cstring_copy (exprData_getLiteral (data));
1106 // cstring_copy (exprData_getLiteral (data));
1110 ret = constraintList_addList (ret,
1111 exprNode_traversRequiresConstraints
1112 (exprData_getUopNode (data) ) );
1122 /* walk down the tree and get all Ensures Constraints in each subexpression*/
1123 constraintList exprNode_traversEnsuresConstraints (exprNode e)
1127 bool handledExprNode;
1130 // constraintExpr tmp;
1135 if (exprNode_handleError (e))
1137 ret = constraintList_new();
1141 ret = constraintList_copy (e->ensuresConstraints );
1142 handledExprNode = TRUE;
1147 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1148 exprNode_unparse (e),
1149 constraintList_print(e->ensuresConstraints)
1159 ret = constraintList_addList (ret,
1160 exprNode_traversEnsuresConstraints
1161 (exprData_getPairA (data) ) );
1163 ret = constraintList_addList (ret,
1164 exprNode_traversEnsuresConstraints
1165 (exprData_getPairB (data) ) );
1169 ret = constraintList_addList (ret,
1170 exprNode_traversEnsuresConstraints
1171 (exprData_getUopNode (data) ) );
1175 ret = constraintList_addList (ret, exprNode_traversEnsuresConstraints
1176 (exprData_getUopNode (data) ) );
1179 ret = constraintList_addList (ret,
1180 exprNode_traversEnsuresConstraints
1181 (exprData_getOpA (data) ) );
1183 ret = constraintList_addList (ret,
1184 exprNode_traversEnsuresConstraints
1185 (exprData_getOpB (data) ) );
1188 ret = constraintList_addList (ret,
1189 exprNode_traversEnsuresConstraints
1190 (exprData_getOpA (data) ) );
1192 ret = constraintList_addList (ret,
1193 exprNode_traversEnsuresConstraints
1194 (exprData_getOpB (data) ) );
1198 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1204 ret = constraintList_addList (ret,
1205 exprNode_traversEnsuresConstraints
1206 (exprData_getSingle (data) ) );
1210 ret = constraintList_addList (ret,
1211 exprNode_traversEnsuresConstraints
1212 (exprData_getFcn (data) ) );
1213 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1217 ret = constraintList_addList (ret,
1218 exprNode_traversEnsuresConstraints
1219 (exprData_getSingle (data) ) );
1222 case XPR_NULLRETURN:
1223 // cstring_makeLiteral ("return");;
1227 ret = constraintList_addList (ret,
1228 exprNode_traversEnsuresConstraints
1229 (exprData_getFieldNode (data) ) );
1230 //exprData_getFieldName (data) ;
1234 ret = constraintList_addList (ret,
1235 exprNode_traversEnsuresConstraints
1236 (exprData_getFieldNode (data) ) );
1237 // exprData_getFieldName (data);
1240 case XPR_STRINGLITERAL:
1241 // cstring_copy (exprData_getLiteral (data));
1245 // cstring_copy (exprData_getLiteral (data));
1249 ret = constraintList_addList (ret,
1250 exprNode_traversEnsuresConstraints
1251 (exprData_getUopNode (data) ) );
1257 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1258 exprNode_unparse (e),
1259 // constraintList_print(e->ensuresConstraints),
1260 constraintList_print(ret)