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);
138 ret->orig = constraint_copy (c->orig);
144 /*like copy expect it doesn't allocate memory for the constraint*/
146 void constraint_overWrite (constraint c1, constraint c2)
148 c1->lexpr = constraintExpr_copy (c2->lexpr);
150 c1->expr = constraintExpr_copy (c2->expr);
153 if (c2->orig != NULL)
154 c1->orig = constraint_copy (c2->orig);
160 bool constraint_resolve (/*@unused@*/ constraint c)
167 constraint constraint_makeNew (void)
170 ret = dmalloc(sizeof (*ret) );
179 fileloc constraint_getFileloc (constraint c)
181 return (constraintExpr_getFileloc (c->lexpr) );
186 constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
188 constraint ret = constraint_makeNew();
189 // constraintTerm term;
190 po = exprNode_fakeCopy(po);
191 ind = exprNode_fakeCopy(ind);
192 ret->lexpr = constraintExpr_makeMaxReadExpr(po);
194 ret->expr = constraintExpr_makeValueExpr (ind);
198 constraint constraint_makeWriteSafeInt (exprNode po, int ind)
200 constraint ret = constraint_makeNew();
203 ret->lexpr =constraintExpr_makeMaxSetExpr(po);
205 ret->expr = constraintExpr_makeValueInt (ind);
210 constraint constraint_makeSRefWriteSafeInt (sRef s, int ind)
212 constraint ret = constraint_makeNew();
215 ret->lexpr = constraintExpr_makeSRefMaxset (s);
217 ret->expr = constraintExpr_makeValueInt (ind);
223 constraint constraint_makeWriteSafeExprNode (exprNode po, exprNode ind)
225 constraint ret = constraint_makeNew();
228 ret->lexpr =constraintExpr_makeMaxSetExpr(po);
230 ret->expr = constraintExpr_makeValueExpr (ind);
235 constraint constraint_makeReadSafeInt ( exprNode po, int ind)
237 constraint ret = constraint_makeNew();
239 po = exprNode_fakeCopy(po);
241 ret->lexpr = constraintExpr_makeMaxReadExpr(po);
243 ret->expr = constraintExpr_makeValueInt (ind);
247 constraint constraint_makeEnsureMaxReadAtLeast (exprNode e1, exprNode t2, fileloc sequencePoint)
249 constraint ret = constraint_makeNew();
252 e1 = exprNode_fakeCopy (e1);
253 t2 = exprNode_fakeCopy (t2);
255 ret = constraint_makeReadSafeExprNode(e1, t2);
257 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
261 // fileloc_incColumn (ret->lexpr->term->loc);
266 static constraint constraint_makeEnsuresOp (exprNode e1, exprNode e2, fileloc sequencePoint, arithType ar)
268 constraint ret = constraint_makeNew();
271 e = exprNode_fakeCopy(e1);
274 TPRINTF((message("Warning null exprNode, Exprnodes are %s and %s",
275 exprNode_unparse(e1), exprNode_unparse(e2) )
279 ret->lexpr = constraintExpr_makeValueExpr (e);
282 e = exprNode_fakeCopy(e2);
283 ret->expr = constraintExpr_makeValueExpr (e);
285 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
290 /* make constraint ensures e1 == e2 */
292 constraint constraint_makeEnsureEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
294 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, EQ) );
297 /*make constraint ensures e1 < e2 */
298 constraint constraint_makeEnsureLessThan (exprNode e1, exprNode e2, fileloc sequencePoint)
300 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, LT) );
303 constraint constraint_makeEnsureLessThanEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
305 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, LTE) );
308 constraint constraint_makeEnsureGreaterThan (exprNode e1, exprNode e2, fileloc sequencePoint)
310 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, GT) );
313 constraint constraint_makeEnsureGreaterThanEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
315 return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, GTE) );
319 exprNode exprNode_copyConstraints (exprNode dst, exprNode src)
321 dst->ensuresConstraints = constraintList_copy (src->ensuresConstraints );
322 dst->requiresConstraints = constraintList_copy (src->requiresConstraints );
323 dst->trueEnsuresConstraints = constraintList_copy (src->trueEnsuresConstraints );
324 dst->falseEnsuresConstraints = constraintList_copy (src->falseEnsuresConstraints );
328 constraint constraint_makeMaxSetSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
330 constraint ret = constraint_makeNew();
331 //constraintTerm term;
333 e = exprNode_fakeCopy(e);
334 ret->lexpr = constraintExpr_makeValueExpr (e);
337 ret->expr = constraintExpr_makeValueExpr (e);
338 ret->expr = constraintExpr_makeIncConstraintExpr (ret->expr);
340 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
341 // fileloc_incColumn ( ret->lexpr->term->loc);
342 // fileloc_incColumn ( ret->lexpr->term->loc);
348 // constraint constraint_makeMaxReadSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
350 // constraint ret = constraint_makeNew();
351 // //constraintTerm term;
353 // e = exprNode_fakeCopy(e);
354 // ret->lexpr = constraintExpr_makeMaxReadExpr(e);
357 // ret->expr = constraintExpr_makeIncConstraintExpr (e);
358 // ret->lexpr = constraintExpr_setFileLoc (ret->lexpr, sequencePoint);
363 cstring arithType_print (arithType ar)
365 cstring st = cstring_undefined;
369 st = cstring_makeLiteral (" < ");
372 st = cstring_makeLiteral (" <= ");
375 st = cstring_makeLiteral (" > ");
378 st = cstring_makeLiteral (" >= ");
381 st = cstring_makeLiteral (" == ");
384 st = cstring_makeLiteral (" NONNEGATIVE ");
387 st = cstring_makeLiteral (" POSITIVE ");
396 void constraint_printError (constraint c, fileloc loc)
400 string = constraint_printDetailed (c);
404 voptgenerror (FLG_FUNCTIONPOST, string, loc);
408 voptgenerror (FLG_FUNCTIONCONSTRAINT, string, loc);
413 cstring constraint_printDetailed (constraint c)
415 cstring st = cstring_undefined;
421 st = message ("Unresolved constraint:\nLclint is unable to resolve %s needed to satisy %s", constraint_print (c), constraint_print(c->orig) );
423 st = message ("Unresolved constraint:\nLclint is unable to resolve %s", constraint_print (c));
429 st = message ("Block Post condition:\nThis function block has the post condition %s\n based on %s", constraint_print (c), constraint_print(c->orig) );
431 st = message ("Block Post condition:\nThis function block has the post condition %s", constraint_print (c));
436 cstring constraint_print (constraint c) /*@*/
438 cstring st = cstring_undefined;
439 cstring type = cstring_undefined;
443 type = cstring_makeLiteral ("Ensures: ");
447 type = cstring_makeLiteral ("Requires: ");
449 st = message ("%s: %s %s %s",
451 constraintExpr_print (c->lexpr),
452 arithType_print(c->ar),
453 constraintExpr_print(c->expr)
458 constraint constraint_doSRefFixBaseParam (constraint precondition,
459 exprNodeList arglist)
461 precondition->lexpr = constraintExpr_doSRefFixBaseParam (precondition->lexpr,
463 precondition->expr = constraintExpr_doSRefFixBaseParam (precondition->expr,
470 // bool constraint_hasTerm (constraint c, constraintTerm term)
472 // DPRINTF((message ("Constraint %s", constraint_print (c) ) ) );
474 // if (constraintExpr_includesTerm (c->lexpr, term) )
477 // if (constraintExpr_includesTerm (c->expr, term) )
483 constraint constraint_preserveOrig (constraint c)
485 c->orig = constraint_copy (c);