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"
21 /*@special@*/ constraint constraint_makeNew (void)
22 /*@post:isnull result->term, result->expr, result->constrType@*/
23 /*@defines result->ar, result->post@*/;
25 constraint constraint_copy (constraint c)
28 ret = constraint_makeNew();
29 ret->lexpr = constraintExpr_copy (c->lexpr);
31 ret->expr = constraintExpr_copy (c->expr);
35 ret->orig = constraint_copy (c->orig);
41 bool constraint_resolve (/*@unused@*/ constraint c)
47 /*@special@*/ constraint constraint_makeNew (void)
48 /*@post:isnull result->term, result->expr, result->constrType@*/
49 /*@defines result->ar, result->post@*/
52 ret = dmalloc(sizeof (*ret) );
61 constraintExpr constraintExpr_alloc ()
64 ret = dmalloc (sizeof (*ret) );
71 constraintExpr constraintExpr_copy (constraintExpr expr)
74 ret = constraintExpr_alloc();
75 ret->term = constraintTerm_copy(expr->term);
77 if (expr->expr != NULL)
79 ret->expr = constraintExpr_copy (expr->expr);
88 constraintExpr constraintExpr_makeMaxSetExpr (exprNode expr)
91 ret = constraintExpr_alloc();
92 ret->term = constraintTerm_makeMaxSetexpr(expr);
96 constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
99 ret = constraintExpr_alloc();
100 ret->term = constraintTerm_makeMaxReadexpr(expr);
104 constraintExpr constraintExpr_makeMinSetExpr (exprNode expr)
107 ret = constraintExpr_alloc();
108 ret->term = constraintTerm_makeMinSetexpr(expr);
112 constraintExpr constraintExpr_makeMinReadExpr (exprNode expr)
115 ret = constraintExpr_alloc();
116 ret->term = constraintTerm_makeMinReadexpr(expr);
120 constraintExpr constraintExpr_makeValueExpr (exprNode expr)
123 ret = constraintExpr_alloc();
124 ret->term = constraintTerm_makeValueexpr(expr);
129 constraintExpr makeConstraintExprIntlit (int i)
132 ret = dmalloc (sizeof (*ret) );
133 ret->term = constraintTerm_makeIntLitValue(i);
140 constraintExpr constraintExpr_makeValueInt (int i)
142 return makeConstraintExprIntlit(i);
145 constraint constraint_makeWriteSafeExprNode (exprNode po, exprNode ind)
147 constraint ret = constraint_makeNew();
150 ret->lexpr =constraintExpr_makeMaxSetExpr(po);
152 ret->expr = constraintExpr_makeValueExpr (ind);
156 constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
158 constraint ret = constraint_makeNew();
159 // constraintTerm term;
160 po = exprNode_fakeCopy(po);
161 ind = exprNode_fakeCopy(ind);
162 ret->lexpr = constraintExpr_makeMaxReadExpr(po);
164 ret->expr = constraintExpr_makeValueExpr (ind);
168 constraint constraint_makeWriteSafeInt (exprNode po, int ind)
170 constraint ret = constraint_makeNew();
173 ret->lexpr =constraintExpr_makeMaxSetExpr(po);
175 ret->expr = constraintExpr_makeValueInt (ind);
179 constraint constraint_makeReadSafeInt ( exprNode po, int ind)
181 constraint ret = constraint_makeNew();
183 po = exprNode_fakeCopy(po);
185 ret->lexpr = constraintExpr_makeMaxReadExpr(po);
187 ret->expr = constraintExpr_makeValueInt (ind);
191 constraint constraint_makeEnsureMaxReadAtLeast (exprNode e1, exprNode t2, fileloc sequencePoint)
193 constraint ret = constraint_makeNew();
196 e1 = exprNode_fakeCopy (e1);
197 t2 = exprNode_fakeCopy (t2);
199 ret = constraint_makeReadSafeExprNode(e1, t2);
200 if (ret->lexpr->term->loc != NULL)
201 fileloc_free(ret->lexpr->term->loc);
203 ret->lexpr->term->loc = fileloc_copy (sequencePoint);
206 fileloc_incColumn (ret->lexpr->term->loc);
211 constraint constraint_makeEnsureMinReadAtMost (exprNode po, exprNode ind, fileloc sequencePoint)
213 constraint ret = constraint_makeNew();
215 po = exprNode_fakeCopy(po);
216 ind = exprNode_fakeCopy(ind);
218 ret->lexpr = constraintExpr_makeMinReadExpr(po);
220 ret->expr = constraintExpr_makeValueExpr (ind);
223 if (ret->lexpr->term->loc != NULL)
224 fileloc_free(ret->lexpr->term->loc);
226 ret->lexpr->term->loc = fileloc_copy (sequencePoint);
227 /*make this refer to element after preconditions */
228 fileloc_incColumn (ret->lexpr->term->loc);
232 constraintExpr makeMaxSetPostOpInc (exprNode e)
235 ret = constraintExpr_makeValueExpr (e);
237 ret->expr = makeConstraintExprIntlit (1);
241 constraint constraint_makeMaxSetSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
243 constraint ret = constraint_makeNew();
244 //constraintTerm term;
246 e = exprNode_fakeCopy(e);
247 ret->lexpr = constraintExpr_makeValueExpr (e);
250 ret->expr = makeMaxSetPostOpInc(e);
252 fileloc_incColumn ( ret->lexpr->term->loc);
253 fileloc_incColumn ( ret->lexpr->term->loc);
257 constraintExpr makeMaxReadPostOpInc (exprNode e)
260 ret = constraintExpr_makeValueExpr (e);
261 ret->term = constraintTerm_makeMaxReadexpr (e);
263 ret->expr = makeConstraintExprIntlit (1);
267 constraint constraint_makeMaxReadSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
269 constraint ret = constraint_makeNew();
270 //constraintTerm term;
272 e = exprNode_fakeCopy(e);
273 ret->lexpr = constraintExpr_makeMaxReadExpr(e);
276 ret->expr = makeMaxReadPostOpInc(e);
278 fileloc_incColumn ( ret->lexpr->term->loc);
279 fileloc_incColumn ( ret->lexpr->term->loc);
284 cstring arithType_print (arithType ar)
286 cstring st = cstring_undefined;
290 st = cstring_makeLiteral (" < ");
293 st = cstring_makeLiteral (" <= ");
296 st = cstring_makeLiteral (" > ");
299 st = cstring_makeLiteral (" >= ");
302 st = cstring_makeLiteral (" == ");
305 st = cstring_makeLiteral (" NONNEGATIVE ");
308 st = cstring_makeLiteral (" POSITIVE ");
317 cstring constraintExpr_print (constraintExpr ex)
321 llassert (ex != NULL);
324 constraintTerm_print (ex->term));
326 if (ex->expr != NULL)
330 opStr = cstring_makeLiteral (" + ");
334 opStr = cstring_makeLiteral (" - ");
336 st = message ("%s %s %s", st, opStr, constraintExpr_print (ex->expr) );
342 cstring constraint_printDetailed (constraint c)
344 cstring st = cstring_undefined;
349 st = message ("Unresolved constraint:\nLclint is unable to resolve %s needed to satisy %s", constraint_print (c), constraint_print(c->orig) );
353 st = message ("Function Post condition:\nBased on the constraint %s this function appears to have the post condition %s", constraint_print (c), constraint_print(c->orig) );
358 cstring constraint_print (constraint c)
360 cstring st = cstring_undefined;
361 cstring type = cstring_undefined;
365 type = cstring_makeLiteral ("Ensures: ");
369 type = cstring_makeLiteral ("Requires: ");
371 st = message ("%s: %s %s %s",
373 constraintExpr_print (c->lexpr),
374 arithType_print(c->ar),
375 constraintExpr_print(c->expr)
380 bool constraint_hasTerm (constraint c, constraintTerm term)
382 DPRINTF((message ("Constraint %s", constraint_print (c) ) ) );
384 if (constraintExpr_includesTerm (c->lexpr, term) )
387 if (constraintExpr_includesTerm (c->expr, term) )
393 bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term)
395 if (constraintTerm_hasTerm (expr->term, term) )
398 if ( (expr->expr) != NULL)
400 return ( constraintExpr_includesTerm (expr->expr, term) );
406 constraint constraint_preserveOrig (constraint c)
408 c->orig = constraint_copy (c);