3 ** constraintGeneration.c
8 # include <ctype.h> /* for isdigit */
9 # include "lclintMacros.nf"
11 # include "cgrammar.h"
12 # include "cgrammar_tokens.h"
14 # include "exprChecks.h"
15 # include "aliasChecks.h"
16 # include "exprNodeSList.h"
18 # include "exprData.i"
19 # include "exprDataQuite.i"
21 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e);
22 static bool exprNode_handleError( exprNode p_e);
24 //static cstring exprNode_findConstraints ( exprNode p_e);
25 static bool exprNode_isMultiStatement(exprNode p_e);
26 static bool exprNode_multiStatement (exprNode p_e);
27 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint);
28 //static void exprNode_constraintPropagateUp (exprNode p_e);
29 constraintList exprNode_traversRequiresConstraints (exprNode e);
30 constraintList exprNode_traversEnsuresConstraints (exprNode e);
32 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e);
34 extern constraintList reflectChanges (constraintList pre2, constraintList post1);
36 void mergeResolve (exprNode parent, exprNode child1, exprNode child2);
37 exprNode makeDataTypeConstraints (exprNode e);
38 constraintList constraintList_makeFixedArrayConstraints (sRefSet s);
39 constraintList checkCall (exprNode fcn, exprNodeList arglist);
41 //bool exprNode_testd()
43 /* if ( ( (exprNode_isError ) ) )
52 bool exprNode_isUnhandled (exprNode e)
54 llassert( exprNode_isDefined(e) );
83 DPRINTF((message ("Warning current constraint generation does not handle expression %s", exprNode_unparse(e)) ) );
95 bool exprNode_handleError( exprNode e)
97 if (exprNode_isError (e) || exprNode_isUnhandled(e) )
99 static /*@only@*/ cstring error = cstring_undefined;
101 if (!cstring_isDefined (error))
103 error = cstring_makeLiteral ("<error>");
106 /*@-unqualifiedtrans*/ return TRUE; /*@=unqualifiedtrans*/
111 bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e)
113 if (exprNode_isError (e) )
116 if (exprNode_isUnhandled (e) )
118 DPRINTF( (message("Warning ignoring %s", exprNode_unparse (e) ) ) );
119 e->requiresConstraints = constraintList_new();
120 e->ensuresConstraints = constraintList_new();
121 e->trueEnsuresConstraints = constraintList_new();
122 e->falseEnsuresConstraints = constraintList_new();
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);
146 c = constraintList_makeFixedArrayConstraints (e->uses);
147 e->requiresConstraints = reflectChanges (e->requiresConstraints, c);
149 // e->ensuresConstraints = constraintList_mergeEnsures(c, e->ensuresConstraints);
153 /* printf ("%s", (message ("%s", constraintList_printDetailed (e->requiresConstraints) ) ) );
154 printf ("%s", (message ("%s", constraintList_printDetailed (e->ensuresConstraints) ) ) ); */
159 /* handles multiple statements */
161 bool exprNode_isMultiStatement(exprNode e)
163 if (exprNode_handleError (e) != NULL)
185 bool exprNode_stmt (exprNode e)
191 if (exprNode_isError(e) )
195 e->requiresConstraints = constraintList_new();
196 e->ensuresConstraints = constraintList_new();
197 // e = makeDataTypeConstraints(e);
200 DPRINTF(( "STMT:") );
201 DPRINTF ( ( cstring_toCharsSafe ( exprNode_unparse(e)) )
203 if (e->kind == XPR_INIT)
206 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
207 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
208 notError = exprNode_exprTraverse (e, FALSE, FALSE, loc);
209 e->requiresConstraints = exprNode_traversRequiresConstraints(e);
210 e->ensuresConstraints = exprNode_traversEnsuresConstraints(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 DPRINTF ((message ("doIf: %s ", exprNode_unparse(e) ) ) );
301 test->ensuresConstraints = exprNode_traversEnsuresConstraints (test);
302 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
304 e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
305 e->requiresConstraints = reflectChanges (e->requiresConstraints,
306 test->ensuresConstraints);
308 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
312 constraintList constraintList_makeFixedArrayConstraints (sRefSet s)
315 ret = constraintList_new();
317 sRefSet_elements (s, el)
320 if (sRef_isFixedArray(el) )
324 s = sRef_getArraySize(el);
325 DPRINTF( (message("%s is a fixed array with size %d",
326 sRef_unparse(el), s) ) );
327 con = constraint_makeSRefSetBufferSize (el, (s - 1));
328 //con = constraint_makeSRefWriteSafeInt (el, (s - 1));
329 ret = constraintList_add(ret, con);
333 DPRINTF( (message("%s is not a fixed array",
334 sRef_unparse(el)) ) );
342 exprNode makeDataTypeConstraints (exprNode e)
345 DPRINTF(("makeDataTypeConstraints"));
347 c = constraintList_makeFixedArrayConstraints (e->uses);
349 e->ensuresConstraints = constraintList_addList (e->ensuresConstraints, c);
354 void doFor (exprNode e, exprNode forPred, exprNode forBody)
356 exprNode init, test, inc;
357 //merge the constraints: modle as if statement
362 init = exprData_getTripleInit (forPred->edata);
363 test = exprData_getTripleTest (forPred->edata);
364 inc = exprData_getTripleInc (forPred->edata);
366 if ( ( (exprNode_isError (test) /*|| (exprNode_isError(init) )*/ ) || (exprNode_isError (inc) ) ) )
368 DPRINTF ((message ("strange for statement:%s, ignoring it", exprNode_unparse(e) ) ) );
372 forLoopHeuristics(e, forPred, forBody);
374 e->requiresConstraints = reflectChanges (forBody->requiresConstraints, test->ensuresConstraints);
375 e->requiresConstraints = reflectChanges (e->requiresConstraints, test->trueEnsuresConstraints);
376 e->requiresConstraints = reflectChanges (e->requiresConstraints, forPred->ensuresConstraints);
378 if (!forBody->canBreak)
380 e->ensuresConstraints = constraintList_addList(e->ensuresConstraints, forPred->ensuresConstraints);
381 e->ensuresConstraints = constraintList_addList(e->ensuresConstraints, test->falseEnsuresConstraints);
385 DPRINTF(("Can break") );
390 bool exprNode_multiStatement (exprNode e)
396 exprNode p, trueBranch, falseBranch;
397 exprNode forPred, forBody;
398 exprNode init, test, inc;
401 e->requiresConstraints = constraintList_new();
402 e->ensuresConstraints = constraintList_new();
403 e->trueEnsuresConstraints = constraintList_new();
404 e->falseEnsuresConstraints = constraintList_new();
406 // e = makeDataTypeConstraints(e);
408 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
409 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
411 if (exprNode_handleError (e))
424 // ret = message ("%s %s",
425 forPred = exprData_getPairA (data);
426 forBody = exprData_getPairB (data);
428 //first generate the constraints
429 exprNode_generateConstraints (forPred);
430 exprNode_generateConstraints (forBody);
433 doFor (e, forPred, forBody);
438 // ret = message ("for (%s; %s; %s)",
439 exprNode_generateConstraints (exprData_getTripleInit (data) );
440 test = exprData_getTripleTest (data);
441 exprNode_exprTraverse (test,FALSE, FALSE, exprNode_loc(e));
442 if (!exprNode_isError(test) )
443 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
445 exprNode_generateConstraints (exprData_getTripleInc (data));
449 DPRINTF ((exprNode_unparse(e) ) );
450 // ret = message ("if (%s) %s",
451 e1 = exprData_getPairA (data);
452 e2 = exprData_getPairB (data);
454 exprNode_exprTraverse (e1,
455 FALSE, FALSE, exprNode_loc(e1));
457 exprNode_generateConstraints (e2);
459 e = doIf (e, e1, e2);
462 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
466 DPRINTF(("Starting IFELSE"));
467 // ret = message ("if (%s) %s else %s",
468 p = exprData_getTriplePred (data);
469 trueBranch = exprData_getTripleTrue (data);
470 falseBranch = exprData_getTripleFalse (data);
472 exprNode_exprTraverse (p,
473 FALSE, FALSE, exprNode_loc(p));
474 exprNode_generateConstraints (trueBranch);
475 exprNode_generateConstraints (falseBranch);
477 // do requires clauses
479 cons = reflectChanges (trueBranch->requiresConstraints, p->trueEnsuresConstraints);
480 cons = reflectChanges (cons,
481 p->ensuresConstraints);
482 e->requiresConstraints = constraintList_copy (cons);
484 cons = reflectChanges (falseBranch->requiresConstraints, p->falseEnsuresConstraints);
485 cons = reflectChanges (cons,
486 p->ensuresConstraints);
487 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
489 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
490 p->requiresConstraints);
492 // do ensures clauses
493 // find the the ensures lists for each subbranch
494 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
495 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
497 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
498 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
500 // find ensures for whole if/else statement
502 e->ensuresConstraints = constraintList_logicalOr (t, f);
503 DPRINTF( ("Done IFELSE") );
506 e1 = exprData_getPairA (data);
507 e2 = exprData_getPairB (data);
508 exprNode_exprTraverse (e1,
509 FALSE, FALSE, exprNode_loc(e1));
511 exprNode_generateConstraints (e2);
513 e1->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(e1);
515 e->requiresConstraints = reflectChanges (e2->requiresConstraints, e1->trueEnsuresConstraints);
517 e->requiresConstraints = reflectChanges (e->requiresConstraints,
518 e1->ensuresConstraints);
520 e->ensuresConstraints = constraintList_copy (e1->ensuresConstraints);
522 // ret = message ("while (%s) %s",
523 exprNode_generateConstraints (exprData_getPairA (data));
524 exprNode_generateConstraints (exprData_getPairB (data));
525 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data), exprData_getPairB (data) );
529 // ret = message ("do { %s } while (%s)",
530 exprNode_generateConstraints (exprData_getPairB (data));
531 exprNode_generateConstraints (exprData_getPairA (data));
535 // ret = message ("{ %s }",
536 exprNode_generateConstraints (exprData_getSingle (data));
537 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
538 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
539 // e->constraints = (exprData_getSingle (data))->constraints;
544 return exprNode_stmtList (e);
553 bool lltok_isBoolean_Op (lltok tok)
555 /*this should really be a switch statement but
556 I don't want to violate the abstraction
557 maybe this should go in lltok.c */
559 if (lltok_isEq_Op (tok) )
563 if (lltok_isAnd_Op (tok) )
569 if (lltok_isOr_Op (tok) )
574 if (lltok_isGt_Op (tok) )
578 if (lltok_isLt_Op (tok) )
583 if (lltok_isLe_Op (tok) )
588 if (lltok_isGe_Op (tok) )
598 void exprNode_booleanTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint)
604 constraintList tempList;
607 tok = exprData_getOpTok (data);
610 t1 = exprData_getOpA (data);
611 t2 = exprData_getOpB (data);
614 /* arithmetic tests */
616 if (lltok_isEq_Op (tok) )
618 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
619 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
623 if (lltok_isLt_Op (tok) )
625 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
626 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
627 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
628 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
632 if (lltok_isGe_Op (tok) )
635 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
636 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
638 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
639 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
644 if (lltok_isGt_Op (tok) )
646 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
647 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
648 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
649 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
652 if (lltok_isLe_Op (tok) )
654 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
655 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
657 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
658 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
663 /*Logical operations */
665 if (lltok_isAnd_Op (tok) )
669 tempList = constraintList_copy (t1->trueEnsuresConstraints);
670 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
671 e->trueEnsuresConstraints = constraintList_addList(e->trueEnsuresConstraints, tempList);
673 //false ensures: fens t1 or tens t1 and fens t2
674 tempList = constraintList_copy (t1->trueEnsuresConstraints);
675 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
676 tempList = constraintList_logicalOr (tempList, t1->falseEnsuresConstraints);
677 e->falseEnsuresConstraints =constraintList_addList(e->falseEnsuresConstraints, tempList);
681 if (lltok_isOr_Op (tok) )
684 tempList = constraintList_copy (t1->falseEnsuresConstraints);
685 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
686 e->falseEnsuresConstraints = constraintList_addList(e->falseEnsuresConstraints, tempList);
688 //true ensures: tens t1 or fens t1 and tens t2
689 tempList = constraintList_copy (t1->falseEnsuresConstraints);
690 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
691 tempList = constraintList_logicalOr (tempList, t1->trueEnsuresConstraints);
692 e->trueEnsuresConstraints =constraintList_addList(e->trueEnsuresConstraints, tempList);
698 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, fileloc sequencePoint)
702 bool handledExprNode;
706 if (exprNode_isError(e) )
711 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
712 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
714 e->requiresConstraints = constraintList_new();
715 e->ensuresConstraints = constraintList_new();
716 e->trueEnsuresConstraints = constraintList_new();;
717 e->falseEnsuresConstraints = constraintList_new();;
719 if (exprNode_isUnhandled (e) )
723 // e = makeDataTypeConstraints (e);
725 handledExprNode = TRUE;
734 t1 = exprData_getSingle (data);
735 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint);
736 e = exprNode_copyConstraints (e, t1);
743 t1 = (exprData_getPairA (data) );
744 t2 = (exprData_getPairB (data) );
745 cons = constraint_makeWriteSafeExprNode (t1, t2);
749 t1 = (exprData_getPairA (data) );
750 t2 = (exprData_getPairB (data) );
751 cons = constraint_makeReadSafeExprNode (t1, t2 );
754 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
755 cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
756 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
758 cons = constraint_makeEnsureLteMaxRead (t1, t2);
759 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
761 // cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
762 // e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
764 exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
765 exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
767 /*@i325 Should check which is array/index. */
771 exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
772 // e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
775 /* //t1 = exprData_getInitId (data); */
776 t2 = exprData_getInitNode (data);
777 //exprNode_exprTraverse (t1, TRUE, FALSE, sequencePoint );
779 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
781 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
782 if ( (!exprNode_isError (e)) && (!exprNode_isError(t2)) )
784 cons = constraint_makeEnsureEqual (e, t2, sequencePoint);
785 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
790 t1 = exprData_getOpA (data);
791 t2 = exprData_getOpB (data);
792 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
793 lltok_unparse (exprData_getOpTok (data));
794 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
796 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
797 if ( (!exprNode_isError (t1)) && (!exprNode_isError(t2)) )
799 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
800 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
804 t1 = exprData_getOpA (data);
805 t2 = exprData_getOpB (data);
807 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
808 tok = exprData_getOpTok (data);
809 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
811 if (lltok_isBoolean_Op (tok) )
812 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
814 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
817 ctype_unparse (qtype_getType (exprData_getType (data) ) );
822 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
823 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
827 exprNode_exprTraverse (exprData_getFcn (data), definatelv, definaterv, sequencePoint );
828 exprNodeList_unparse (exprData_getArgs (data) );
829 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(exprData_getFcn(data) ), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
833 e->requiresConstraints = constraintList_addList (e->requiresConstraints,
834 checkCall (exprData_getFcn (data), exprData_getArgs (data) ) );
836 e->ensuresConstraints = constraintList_addList (e->ensuresConstraints,
837 getPostConditions(exprData_getFcn (data), exprData_getArgs (data),e ) );
838 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
842 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
846 cstring_makeLiteral ("return");;
851 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
852 exprData_getFieldName (data) ;
856 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
857 exprData_getFieldName (data);
860 case XPR_STRINGLITERAL:
861 cstring_copy (exprData_getLiteral (data));
865 cstring_copy (exprData_getLiteral (data));
869 t1 = exprData_getUopNode(data);
870 tok = (exprData_getUopTok (data));
871 //lltok_unparse (exprData_getUopTok (data));
872 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
873 /*handle * pointer access */
874 if (lltok_isInc_Op (tok) )
876 DPRINTF(("doing ++(var)"));
877 t1 = exprData_getUopNode (data);
878 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
879 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
881 else if (lltok_isDec_Op (tok) )
883 DPRINTF(("doing --(var)"));
884 t1 = exprData_getUopNode (data);
885 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
886 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
889 if (lltok_isMult( exprData_getUopTok (data) ) )
893 cons = constraint_makeWriteSafeInt (t1, 0);
897 cons = constraint_makeReadSafeInt (t1, 0);
899 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
903 if (lltok_isNot_Op (exprData_getUopTok (data) ) )
905 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
906 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
912 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
913 lltok_unparse (exprData_getUopTok (data));
914 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
916 DPRINTF(("doing ++"));
917 t1 = exprData_getUopNode (data);
918 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
919 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
921 if (lltok_isDec_Op (exprData_getUopTok (data) ) )
923 DPRINTF(("doing --"));
924 t1 = exprData_getUopNode (data);
925 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
926 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
930 handledExprNode = FALSE;
933 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
934 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
935 DPRINTF((message ("ensures constraint for %s are %s", exprNode_unparse(e), constraintList_print(e->ensuresConstraints) ) ));
937 return handledExprNode;
941 constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
945 bool handledExprNode;
950 if (exprNode_handleError (e))
952 ret = constraintList_new();
955 ret = constraintList_copy (e->trueEnsuresConstraints );
957 handledExprNode = TRUE;
966 ret = constraintList_addList (ret,
967 exprNode_traversTrueEnsuresConstraints
968 (exprData_getPairA (data) ) );
970 ret = constraintList_addList (ret,
971 exprNode_traversTrueEnsuresConstraints
972 (exprData_getPairB (data) ) );
976 ret = constraintList_addList (ret,
977 exprNode_traversTrueEnsuresConstraints
978 (exprData_getUopNode (data) ) );
982 ret = constraintList_addList (ret, exprNode_traversTrueEnsuresConstraints
983 (exprData_getUopNode (data) ) );
986 ret = constraintList_addList (ret,
987 exprNode_traversTrueEnsuresConstraints
988 (exprData_getOpA (data) ) );
990 ret = constraintList_addList (ret,
991 exprNode_traversTrueEnsuresConstraints
992 (exprData_getOpB (data) ) );
995 ret = constraintList_addList (ret,
996 exprNode_traversTrueEnsuresConstraints
997 (exprData_getOpA (data) ) );
999 ret = constraintList_addList (ret,
1000 exprNode_traversTrueEnsuresConstraints
1001 (exprData_getOpB (data) ) );
1005 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1011 ret = constraintList_addList (ret,
1012 exprNode_traversTrueEnsuresConstraints
1013 (exprData_getSingle (data) ) );
1017 ret = constraintList_addList (ret,
1018 exprNode_traversTrueEnsuresConstraints
1019 (exprData_getFcn (data) ) );
1020 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1024 ret = constraintList_addList (ret,
1025 exprNode_traversTrueEnsuresConstraints
1026 (exprData_getSingle (data) ) );
1029 case XPR_NULLRETURN:
1030 // cstring_makeLiteral ("return");;
1034 ret = constraintList_addList (ret,
1035 exprNode_traversTrueEnsuresConstraints
1036 (exprData_getFieldNode (data) ) );
1037 //exprData_getFieldName (data) ;
1041 ret = constraintList_addList (ret,
1042 exprNode_traversTrueEnsuresConstraints
1043 (exprData_getFieldNode (data) ) );
1044 // exprData_getFieldName (data);
1047 case XPR_STRINGLITERAL:
1048 // cstring_copy (exprData_getLiteral (data));
1052 // cstring_copy (exprData_getLiteral (data));
1056 ret = constraintList_addList (ret,
1057 exprNode_traversTrueEnsuresConstraints
1058 (exprData_getUopNode (data) ) );
1068 /* walk down the tree and get all requires Constraints in each subexpression*/
1069 constraintList exprNode_traversRequiresConstraints (exprNode e)
1073 bool handledExprNode;
1078 if (exprNode_handleError (e))
1080 ret = constraintList_new();
1083 ret = constraintList_copy (e->requiresConstraints );
1085 handledExprNode = TRUE;
1094 ret = constraintList_addList (ret,
1095 exprNode_traversRequiresConstraints
1096 (exprData_getPairA (data) ) );
1098 ret = constraintList_addList (ret,
1099 exprNode_traversRequiresConstraints
1100 (exprData_getPairB (data) ) );
1104 ret = constraintList_addList (ret,
1105 exprNode_traversRequiresConstraints
1106 (exprData_getUopNode (data) ) );
1110 ret = constraintList_addList (ret, exprNode_traversRequiresConstraints
1111 (exprData_getUopNode (data) ) );
1114 ret = constraintList_addList (ret,
1115 exprNode_traversRequiresConstraints
1116 (exprData_getOpA (data) ) );
1118 ret = constraintList_addList (ret,
1119 exprNode_traversRequiresConstraints
1120 (exprData_getOpB (data) ) );
1123 ret = constraintList_addList (ret,
1124 exprNode_traversRequiresConstraints
1125 (exprData_getOpA (data) ) );
1127 ret = constraintList_addList (ret,
1128 exprNode_traversRequiresConstraints
1129 (exprData_getOpB (data) ) );
1133 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1139 ret = constraintList_addList (ret,
1140 exprNode_traversRequiresConstraints
1141 (exprData_getSingle (data) ) );
1145 ret = constraintList_addList (ret,
1146 exprNode_traversRequiresConstraints
1147 (exprData_getFcn (data) ) );
1148 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1152 ret = constraintList_addList (ret,
1153 exprNode_traversRequiresConstraints
1154 (exprData_getSingle (data) ) );
1157 case XPR_NULLRETURN:
1158 // cstring_makeLiteral ("return");;
1162 ret = constraintList_addList (ret,
1163 exprNode_traversRequiresConstraints
1164 (exprData_getFieldNode (data) ) );
1165 //exprData_getFieldName (data) ;
1169 ret = constraintList_addList (ret,
1170 exprNode_traversRequiresConstraints
1171 (exprData_getFieldNode (data) ) );
1172 // exprData_getFieldName (data);
1175 case XPR_STRINGLITERAL:
1176 // cstring_copy (exprData_getLiteral (data));
1180 // cstring_copy (exprData_getLiteral (data));
1184 ret = constraintList_addList (ret,
1185 exprNode_traversRequiresConstraints
1186 (exprData_getUopNode (data) ) );
1196 /* walk down the tree and get all Ensures Constraints in each subexpression*/
1197 constraintList exprNode_traversEnsuresConstraints (exprNode e)
1201 bool handledExprNode;
1204 // constraintExpr tmp;
1209 if (exprNode_handleError (e))
1211 ret = constraintList_new();
1215 ret = constraintList_copy (e->ensuresConstraints );
1216 handledExprNode = TRUE;
1221 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1222 exprNode_unparse (e),
1223 constraintList_print(e->ensuresConstraints)
1233 ret = constraintList_addList (ret,
1234 exprNode_traversEnsuresConstraints
1235 (exprData_getPairA (data) ) );
1237 ret = constraintList_addList (ret,
1238 exprNode_traversEnsuresConstraints
1239 (exprData_getPairB (data) ) );
1243 ret = constraintList_addList (ret,
1244 exprNode_traversEnsuresConstraints
1245 (exprData_getUopNode (data) ) );
1249 ret = constraintList_addList (ret, exprNode_traversEnsuresConstraints
1250 (exprData_getUopNode (data) ) );
1253 ret = constraintList_addList (ret,
1254 exprNode_traversEnsuresConstraints
1255 (exprData_getOpA (data) ) );
1257 ret = constraintList_addList (ret,
1258 exprNode_traversEnsuresConstraints
1259 (exprData_getOpB (data) ) );
1262 ret = constraintList_addList (ret,
1263 exprNode_traversEnsuresConstraints
1264 (exprData_getOpA (data) ) );
1266 ret = constraintList_addList (ret,
1267 exprNode_traversEnsuresConstraints
1268 (exprData_getOpB (data) ) );
1272 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1278 ret = constraintList_addList (ret,
1279 exprNode_traversEnsuresConstraints
1280 (exprData_getSingle (data) ) );
1284 ret = constraintList_addList (ret,
1285 exprNode_traversEnsuresConstraints
1286 (exprData_getFcn (data) ) );
1287 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1291 ret = constraintList_addList (ret,
1292 exprNode_traversEnsuresConstraints
1293 (exprData_getSingle (data) ) );
1296 case XPR_NULLRETURN:
1297 // cstring_makeLiteral ("return");;
1301 ret = constraintList_addList (ret,
1302 exprNode_traversEnsuresConstraints
1303 (exprData_getFieldNode (data) ) );
1304 //exprData_getFieldName (data) ;
1308 ret = constraintList_addList (ret,
1309 exprNode_traversEnsuresConstraints
1310 (exprData_getFieldNode (data) ) );
1311 // exprData_getFieldName (data);
1314 case XPR_STRINGLITERAL:
1315 // cstring_copy (exprData_getLiteral (data));
1319 // cstring_copy (exprData_getLiteral (data));
1323 ret = constraintList_addList (ret,
1324 exprNode_traversEnsuresConstraints
1325 (exprData_getUopNode (data) ) );
1331 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1332 exprNode_unparse (e),
1333 // constraintList_print(e->ensuresConstraints),
1334 constraintList_print(ret)