7 # include <ctype.h> /* for isdigit */
8 # include "lclintMacros.nf"
10 # include "cgrammar.h"
11 # include "cgrammar_tokens.h"
13 # include "exprChecks.h"
14 # include "aliasChecks.h"
15 # include "exprNodeSList.h"
16 //# include "exprData.i"
22 constraint constraint_makeNew (void);
25 constraint makeConstraintParse (sRef x, lltok relOp, exprNode cconstant)
31 ret = constraint_makeNew();
32 llassert (sRef_isValid(x) );
37 ret->lexpr = constraintExpr_makeTermsRef (x);
38 #warning fix abstraction
40 if (relOp.tok == GE_OP)
42 else if (relOp.tok == LE_OP)
44 else if (relOp.tok == EQ_OP)
47 llfatalbug("Unsupported relational operator");
50 t = cstring_toCharsSafe (exprNode_unparse(cconstant));
52 ret->expr = constraintExpr_makeIntLiteral (c);
56 DPRINTF(("GENERATED CONSTRAINT:"));
57 DPRINTF( (message ("%s", constraint_print(ret) ) ) );
61 constraint makeConstraintParse2 (constraintExpr l, lltok relOp, exprNode cconstant)
67 ret = constraint_makeNew();
73 ret->lexpr = constraintExpr_copy (l);
74 #warning fix abstraction
76 if (relOp.tok == GE_OP)
78 else if (relOp.tok == LE_OP)
80 else if (relOp.tok == EQ_OP)
83 llfatalbug("Unsupported relational operator");
86 t = cstring_toCharsSafe (exprNode_unparse(cconstant));
88 ret->expr = constraintExpr_makeIntLiteral (c);
92 DPRINTF(("GENERATED CONSTRAINT:"));
93 DPRINTF( (message ("%s", constraint_print(ret) ) ) );
98 constraint makeConstraintParse3 (constraintExpr l, lltok relOp, constraintExpr r)
101 ret = constraint_makeNew();
107 ret->lexpr = constraintExpr_copy (l);
108 #warning fix abstraction
110 if (relOp.tok == GE_OP)
112 else if (relOp.tok == LE_OP)
114 else if (relOp.tok == EQ_OP)
117 llfatalbug("Unsupported relational operator");
119 ret->expr = constraintExpr_copy (r);
123 DPRINTF(("GENERATED CONSTRAINT:"));
124 DPRINTF( (message ("%s", constraint_print(ret) ) ) );
128 constraint constraint_copy (constraint c)
131 ret = constraint_makeNew();
132 ret->lexpr = constraintExpr_copy (c->lexpr);
134 ret->expr = constraintExpr_copy (c->expr);
136 ret->generatingExpr = c->generatingExpr;
140 ret->orig = constraint_copy (c->orig);
146 /*like copy expect it doesn't allocate memory for the constraint*/
148 void constraint_overWrite (constraint c1, constraint c2)
150 c1->lexpr = constraintExpr_copy (c2->lexpr);
152 c1->expr = constraintExpr_copy (c2->expr);
155 if (c2->orig != NULL)
156 c1->orig = constraint_copy (c2->orig);
159 c1->generatingExpr = c2->generatingExpr;
162 bool constraint_resolve (/*@unused@*/ constraint c)
169 constraint constraint_makeNew (void)
172 ret = dmalloc(sizeof (*ret) );
178 ret->generatingExpr = NULL;
182 constraint constraint_addGeneratingExpr (/*@returned@*/ constraint c, exprNode e)
185 if (c->generatingExpr == NULL)
187 c->generatingExpr = e;
188 DPRINTF ((message ("setting generatingExpr for %s to %s", constraint_print(c), exprNode_unparse(e) ) ));
192 DPRINTF ((message ("Not setting generatingExpr for %s to %s", constraint_print(c), exprNode_unparse(e) ) ));
197 fileloc constraint_getFileloc (constraint c)
199 if (c->generatingExpr)
200 return (exprNode_getfileloc (c->generatingExpr) );
202 return (constraintExpr_getFileloc (c->lexpr) );
207 static bool checkForMaxSet (constraint c)
209 if (constraintExpr_hasMaxSet(c->lexpr) || constraintExpr_hasMaxSet(c->expr) )
215 bool constraint_hasMaxSet(constraint c)
219 if (checkForMaxSet(c->orig) )
223 return (checkForMaxSet(c) );
226 constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
228 constraint ret = constraint_makeNew();
229 // constraintTerm term;
230 po = exprNode_fakeCopy(po);
231 ind = exprNode_fakeCopy(ind);
232 ret->lexpr = constraintExpr_makeMaxReadExpr(po);
234 ret->expr = constraintExpr_makeValueExpr (ind);
238 constraint constraint_makeWriteSafeInt (exprNode po, int ind)
240 constraint ret = constraint_makeNew();
243 ret->lexpr =constraintExpr_makeMaxSetExpr(po);
245 ret->expr = constraintExpr_makeValueInt (ind);
249 constraint constraint_makeSRefSetBufferSize (sRef s, int size)
251 constraint ret = constraint_makeNew();
252 ret->lexpr = constraintExpr_makeSRefMaxset (s);
254 ret->expr = constraintExpr_makeValueInt (size);
259 constraint constraint_makeSRefWriteSafeInt (sRef s, int ind)
261 constraint ret = constraint_makeNew();
264 ret->lexpr = constraintExpr_makeSRefMaxset (s);
266 ret->expr = constraintExpr_makeValueInt (ind);
271 /* drl added 01/12/2000
273 makes the constraint: Ensures index <= MaxRead(buffer) */
275 constraint constraint_makeEnsureLteMaxRead(exprNode index, exprNode buffer)
277 constraint ret = constraint_makeNew();
279 ret->lexpr = constraintExpr_makeValueExpr (index);
281 ret->expr = constraintExpr_makeMaxReadExpr(buffer);
286 constraint constraint_makeWriteSafeExprNode (exprNode po, exprNode ind)
288 constraint ret = constraint_makeNew();
291 ret->lexpr =constraintExpr_makeMaxSetExpr(po);
293 ret->expr = constraintExpr_makeValueExpr (ind);
298 constraint constraint_makeReadSafeInt ( exprNode po, int ind)
300 constraint ret = constraint_makeNew();
302 po = exprNode_fakeCopy(po);
304 ret->lexpr = constraintExpr_makeMaxReadExpr(po);
306 ret->expr = constraintExpr_makeValueInt (ind);
310 constraint constraint_makeEnsureMaxReadAtLeast (exprNode e1, exprNode t2, fileloc sequencePoint)
312 constraint ret = constraint_makeNew();
315 e1 = exprNode_fakeCopy (e1);
316 t2 = exprNode_fakeCopy (t2);
318 ret = constraint_makeReadSafeExprNode(e1, t2);
320 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
324 // fileloc_incColumn (ret->lexpr->term->loc);
329 static constraint constraint_makeEnsuresOp (exprNode e1, exprNode e2, fileloc sequencePoint, arithType ar)
331 constraint ret = constraint_makeNew();
334 e = exprNode_fakeCopy(e1);
337 llcontbug((message("null exprNode, Exprnodes are %s and %s",
338 exprNode_unparse(e1), exprNode_unparse(e2) )
342 ret->lexpr = constraintExpr_makeValueExpr (e);
345 e = exprNode_fakeCopy(e2);
346 ret->expr = constraintExpr_makeValueExpr (e);
348 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
353 /* make constraint ensures e1 == e2 */
355 constraint constraint_makeEnsureEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
357 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, EQ) );
360 /*make constraint ensures e1 < e2 */
361 constraint constraint_makeEnsureLessThan (exprNode e1, exprNode e2, fileloc sequencePoint)
363 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, LT) );
366 constraint constraint_makeEnsureLessThanEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
368 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, LTE) );
371 constraint constraint_makeEnsureGreaterThan (exprNode e1, exprNode e2, fileloc sequencePoint)
373 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, GT) );
376 constraint constraint_makeEnsureGreaterThanEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
378 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, GTE) );
382 exprNode exprNode_copyConstraints (/*@returned@*/ exprNode dst, exprNode src)
384 dst->ensuresConstraints = constraintList_copy (src->ensuresConstraints );
385 dst->requiresConstraints = constraintList_copy (src->requiresConstraints );
386 dst->trueEnsuresConstraints = constraintList_copy (src->trueEnsuresConstraints );
387 dst->falseEnsuresConstraints = constraintList_copy (src->falseEnsuresConstraints );
391 constraint constraint_makeMaxSetSideEffectPostDecrement (exprNode e, fileloc sequencePoint)
393 constraint ret = constraint_makeNew();
394 //constraintTerm term;
396 e = exprNode_fakeCopy(e);
397 ret->lexpr = constraintExpr_makeValueExpr (e);
400 ret->expr = constraintExpr_makeValueExpr (e);
401 ret->expr = constraintExpr_makeDecConstraintExpr (ret->expr);
403 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
404 // fileloc_incColumn ( ret->lexpr->term->loc);
405 // fileloc_incColumn ( ret->lexpr->term->loc);
408 constraint constraint_makeMaxSetSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
410 constraint ret = constraint_makeNew();
411 //constraintTerm term;
413 e = exprNode_fakeCopy(e);
414 ret->lexpr = constraintExpr_makeValueExpr (e);
417 ret->expr = constraintExpr_makeValueExpr (e);
418 ret->expr = constraintExpr_makeIncConstraintExpr (ret->expr);
420 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
421 // fileloc_incColumn ( ret->lexpr->term->loc);
422 // fileloc_incColumn ( ret->lexpr->term->loc);
428 // constraint constraint_makeMaxReadSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
430 // constraint ret = constraint_makeNew();
431 // //constraintTerm term;
433 // e = exprNode_fakeCopy(e);
434 // ret->lexpr = constraintExpr_makeMaxReadExpr(e);
437 // ret->expr = constraintExpr_makeIncConstraintExpr (e);
438 // ret->lexpr = constraintExpr_setFileLoc (ret->lexpr, sequencePoint);
443 cstring arithType_print (arithType ar)
445 cstring st = cstring_undefined;
449 st = cstring_makeLiteral (" < ");
452 st = cstring_makeLiteral (" <= ");
455 st = cstring_makeLiteral (" > ");
458 st = cstring_makeLiteral (" >= ");
461 st = cstring_makeLiteral (" == ");
464 st = cstring_makeLiteral (" NONNEGATIVE ");
467 st = cstring_makeLiteral (" POSITIVE ");
476 void constraint_printError (constraint c, fileloc loc)
481 string = constraint_printDetailed (c);
485 if (constraint_getFileloc(c) )
486 errorLoc = constraint_getFileloc(c);
491 voptgenerror (FLG_FUNCTIONPOST, string, errorLoc);
495 voptgenerror (FLG_FUNCTIONCONSTRAINT, string, errorLoc);
500 cstring constraint_printDetailed (constraint c)
502 cstring st = cstring_undefined;
508 st = message ("Unresolved constraint:\nLclint is unable to resolve %s needed to satisfy %s", constraint_print (c), constraint_print(c->orig) );
510 st = message ("Unresolved constraint:\nLclint is unable to resolve %s", constraint_print (c));
516 st = message ("Block Post condition:\nThis function block has the post condition %s\n based on %s", constraint_print (c), constraint_print(c->orig) );
518 st = message ("Block Post condition:\nThis function block has the post condition %s", constraint_print (c));
521 if (context_getFlag (FLG_CONSTRAINTLOCATION) )
524 // llassert (c->generatingExpr);
525 temp = message ("\nOriginal Generating expression %s: %s\n", fileloc_unparse( exprNode_getfileloc (c->generatingExpr) ),
526 exprNode_unparse(c->generatingExpr) );
527 st = cstring_concat (st, temp);
529 if (constraint_hasMaxSet(c) )
532 temp2 = message ("\nHas MaxSet\n");
533 st = cstring_concat (st, temp2);
539 cstring constraint_print (constraint c) /*@*/
541 cstring st = cstring_undefined;
542 cstring type = cstring_undefined;
546 type = cstring_makeLiteral ("Ensures: ");
550 type = cstring_makeLiteral ("Requires: ");
552 st = message ("%s: %s %s %s",
554 constraintExpr_print (c->lexpr),
555 arithType_print(c->ar),
556 constraintExpr_print(c->expr)
561 constraint constraint_doSRefFixBaseParam (constraint precondition,
562 exprNodeList arglist)
564 precondition->lexpr = constraintExpr_doSRefFixBaseParam (precondition->lexpr,
566 precondition->expr = constraintExpr_doSRefFixBaseParam (precondition->expr,
573 constraint constraint_doFixResult (constraint postcondition, exprNode fcnCall)
575 postcondition = constraint_copy (postcondition);
576 postcondition->lexpr = constraintExpr_doFixResult (postcondition->lexpr, fcnCall);
577 postcondition->expr = constraintExpr_doFixResult (postcondition->expr, fcnCall);
579 return postcondition;
582 constraint constraint_doSRefFixConstraintParam (constraint precondition,
583 exprNodeList arglist)
586 precondition = constraint_copy (precondition);
587 precondition->lexpr = constraintExpr_doSRefFixConstraintParam (precondition->lexpr, arglist);
588 precondition->expr = constraintExpr_doSRefFixConstraintParam (precondition->expr, arglist);
593 // bool constraint_hasTerm (constraint c, constraintTerm term)
595 // DPRINTF((message ("Constraint %s", constraint_print (c) ) ) );
597 // if (constraintExpr_includesTerm (c->lexpr, term) )
600 // if (constraintExpr_includesTerm (c->expr, term) )
606 constraint constraint_preserveOrig (constraint c)
608 c->orig = constraint_copy (c);