5 # include <ctype.h> /* for isdigit */
6 # include "lclintMacros.nf"
9 # include "cgrammar_tokens.h"
11 # include "exprChecks.h"
12 # include "aliasChecks.h"
13 # include "exprNodeSList.h"
14 //# include "exprData.i"
20 constraint constraint_makeNew (void);
23 constraint makeConstraintParse (sRef x, lltok relOp, exprNode cconstant)
29 ret = constraint_makeNew();
35 ret->lexpr = constraintExpr_makeTermsRef (x);
36 #warning fix abstraction
38 if (relOp.tok == GE_OP)
40 else if (relOp.tok == LE_OP)
42 else if (relOp.tok == EQ_OP)
45 llfatalbug("Unsupported relational operator");
48 t = cstring_toCharsSafe (exprNode_unparse(cconstant));
50 ret->expr = constraintExpr_makeIntLiteral (c);
54 DPRINTF(("GENERATED CONSTRAINT:"));
55 DPRINTF( (message ("%s", constraint_print(ret) ) ) );
59 constraint makeConstraintParse2 (constraintExpr l, lltok relOp, exprNode cconstant)
65 ret = constraint_makeNew();
71 ret->lexpr = constraintExpr_copy (l);
72 #warning fix abstraction
74 if (relOp.tok == GE_OP)
76 else if (relOp.tok == LE_OP)
78 else if (relOp.tok == EQ_OP)
81 llfatalbug("Unsupported relational operator");
84 t = cstring_toCharsSafe (exprNode_unparse(cconstant));
86 ret->expr = constraintExpr_makeIntLiteral (c);
90 DPRINTF(("GENERATED CONSTRAINT:"));
91 DPRINTF( (message ("%s", constraint_print(ret) ) ) );
96 constraint makeConstraintParse3 (constraintExpr l, lltok relOp, constraintExpr r)
99 ret = constraint_makeNew();
105 ret->lexpr = constraintExpr_copy (l);
106 #warning fix abstraction
108 if (relOp.tok == GE_OP)
110 else if (relOp.tok == LE_OP)
112 else if (relOp.tok == EQ_OP)
115 llfatalbug("Unsupported relational operator");
117 ret->expr = constraintExpr_copy (r);
121 DPRINTF(("GENERATED CONSTRAINT:"));
122 DPRINTF( (message ("%s", constraint_print(ret) ) ) );
126 constraint constraint_copy (constraint c)
129 ret = constraint_makeNew();
130 ret->lexpr = constraintExpr_copy (c->lexpr);
132 ret->expr = constraintExpr_copy (c->expr);
136 ret->orig = constraint_copy (c->orig);
142 /*like copy expect it doesn't allocate memory for the constraint*/
144 void constraint_overWrite (constraint c1, constraint c2)
146 c1->lexpr = constraintExpr_copy (c2->lexpr);
148 c1->expr = constraintExpr_copy (c2->expr);
151 if (c2->orig != NULL)
152 c1->orig = constraint_copy (c2->orig);
158 bool constraint_resolve (/*@unused@*/ constraint c)
165 constraint constraint_makeNew (void)
168 ret = dmalloc(sizeof (*ret) );
177 fileloc constraint_getFileloc (constraint c)
179 return (constraintExpr_getFileloc (c->lexpr) );
184 constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
186 constraint ret = constraint_makeNew();
187 // constraintTerm term;
188 po = exprNode_fakeCopy(po);
189 ind = exprNode_fakeCopy(ind);
190 ret->lexpr = constraintExpr_makeMaxReadExpr(po);
192 ret->expr = constraintExpr_makeValueExpr (ind);
196 constraint constraint_makeWriteSafeInt (exprNode po, int ind)
198 constraint ret = constraint_makeNew();
201 ret->lexpr =constraintExpr_makeMaxSetExpr(po);
203 ret->expr = constraintExpr_makeValueInt (ind);
207 constraint constraint_makeWriteSafeExprNode (exprNode po, exprNode ind)
209 constraint ret = constraint_makeNew();
212 ret->lexpr =constraintExpr_makeMaxSetExpr(po);
214 ret->expr = constraintExpr_makeValueExpr (ind);
218 constraint constraint_makeReadSafeInt ( exprNode po, int ind)
220 constraint ret = constraint_makeNew();
222 po = exprNode_fakeCopy(po);
224 ret->lexpr = constraintExpr_makeMaxReadExpr(po);
226 ret->expr = constraintExpr_makeValueInt (ind);
230 constraint constraint_makeEnsureMaxReadAtLeast (exprNode e1, exprNode t2, fileloc sequencePoint)
232 constraint ret = constraint_makeNew();
235 e1 = exprNode_fakeCopy (e1);
236 t2 = exprNode_fakeCopy (t2);
238 ret = constraint_makeReadSafeExprNode(e1, t2);
240 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
244 // fileloc_incColumn (ret->lexpr->term->loc);
249 /* make constraint ensures e1 == e2 */
251 constraint constraint_makeEnsureEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
253 constraint ret = constraint_makeNew();
256 e = exprNode_fakeCopy(e1);
257 ret->lexpr = constraintExpr_makeValueExpr (e);
260 e = exprNode_fakeCopy(e2);
261 ret->expr = constraintExpr_makeValueExpr (e);
263 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
264 // fileloc_incColumn ( ret->lexpr->term->loc);
265 // fileloc_incColumn ( ret->lexpr->term->loc);
270 exprNode exprNode_copyConstraints (exprNode dst, exprNode src)
272 dst->ensuresConstraints = constraintList_copy (src->ensuresConstraints );
273 dst->requiresConstraints = constraintList_copy (src->requiresConstraints );
274 dst->trueEnsuresConstraints = constraintList_copy (src->trueEnsuresConstraints );
275 dst->falseEnsuresConstraints = constraintList_copy (src->falseEnsuresConstraints );
279 constraint constraint_makeMaxSetSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
281 constraint ret = constraint_makeNew();
282 //constraintTerm term;
284 e = exprNode_fakeCopy(e);
285 ret->lexpr = constraintExpr_makeValueExpr (e);
288 ret->expr = constraintExpr_makeValueExpr (e);
289 ret->expr = constraintExpr_makeIncConstraintExpr (ret->expr);
291 ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
292 // fileloc_incColumn ( ret->lexpr->term->loc);
293 // fileloc_incColumn ( ret->lexpr->term->loc);
299 // constraint constraint_makeMaxReadSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
301 // constraint ret = constraint_makeNew();
302 // //constraintTerm term;
304 // e = exprNode_fakeCopy(e);
305 // ret->lexpr = constraintExpr_makeMaxReadExpr(e);
308 // ret->expr = constraintExpr_makeIncConstraintExpr (e);
309 // ret->lexpr = constraintExpr_setFileLoc (ret->lexpr, sequencePoint);
314 cstring arithType_print (arithType ar)
316 cstring st = cstring_undefined;
320 st = cstring_makeLiteral (" < ");
323 st = cstring_makeLiteral (" <= ");
326 st = cstring_makeLiteral (" > ");
329 st = cstring_makeLiteral (" >= ");
332 st = cstring_makeLiteral (" == ");
335 st = cstring_makeLiteral (" NONNEGATIVE ");
338 st = cstring_makeLiteral (" POSITIVE ");
348 cstring constraint_printDetailed (constraint c)
350 cstring st = cstring_undefined;
355 st = message ("Unresolved constraint:\nLclint is unable to resolve %s needed to satisy %s", constraint_print (c), constraint_print(c->orig) );
357 st = message ("Unresolved constraint:\nLclint is unable to resolve %s", constraint_print (c));
363 st = message ("Block Post condition:\nThis function block has the post condition %s\n based on %s", constraint_print (c), constraint_print(c->orig) );
365 st = message ("Block Post condition:\nThis function block has the post condition %s", constraint_print (c));
370 cstring constraint_print (constraint c)
372 cstring st = cstring_undefined;
373 cstring type = cstring_undefined;
377 type = cstring_makeLiteral ("Ensures: ");
381 type = cstring_makeLiteral ("Requires: ");
383 st = message ("%s: %s %s %s",
385 constraintExpr_print (c->lexpr),
386 arithType_print(c->ar),
387 constraintExpr_print(c->expr)
392 constraint constraint_doSRefFixBaseParam (constraint precondition,
393 exprNodeList arglist)
395 precondition->lexpr = constraintExpr_doSRefFixBaseParam (precondition->lexpr,
397 precondition->expr = constraintExpr_doSRefFixBaseParam (precondition->expr,
404 // bool constraint_hasTerm (constraint c, constraintTerm term)
406 // DPRINTF((message ("Constraint %s", constraint_print (c) ) ) );
408 // if (constraintExpr_includesTerm (c->lexpr, term) )
411 // if (constraintExpr_includesTerm (c->expr, term) )
417 constraint constraint_preserveOrig (constraint c)
419 c->orig = constraint_copy (c);