** constraintList.c
*/
+//#define DEBUGPRINT 1
+
# include <ctype.h> /* for isdigit */
# include "lclintMacros.nf"
# include "basic.h"
# include "exprChecks.h"
# include "aliasChecks.h"
# include "exprNodeSList.h"
-# include "exprData.i"
+//# include "exprData.i"
/*@i33*/
/*@-fcnuse*/
/*@-assignexpose*/
-/*@notnull@*/
-/*@special@*/ constraint constraint_makeNew (void)
- /*@post:isnull result->term, result->expr, result->constrType@*/
- /*@defines result->ar, result->post@*/;
+constraint constraint_makeNew (void);
-constraint constraint_copy (constraint c)
+
+constraint makeConstraintParse (sRef x, lltok relOp, exprNode cconstant)
+
{
+ char *t;
+ int c;
constraint ret;
ret = constraint_makeNew();
- ret->lexpr = c->lexpr;
- ret->ar = c->ar;
- ret->expr = c->expr;
- ret->post = c->post;
+ llassert (sRef_isValid(x) );
+ if (!sRef_isValid(x))
+ return ret;
+
+
+ ret->lexpr = constraintExpr_makeTermsRef (x);
+ #warning fix abstraction
+
+ if (relOp.tok == GE_OP)
+ ret->ar = GTE;
+ else if (relOp.tok == LE_OP)
+ ret->ar = LTE;
+ else if (relOp.tok == EQ_OP)
+ ret->ar = EQ;
+ else
+ llfatalbug("Unsupported relational operator");
+
+
+ t = cstring_toCharsSafe (exprNode_unparse(cconstant));
+ c = atoi( t );
+ ret->expr = constraintExpr_makeIntLiteral (c);
+
+ ret->post = TRUE;
+ // ret->orig = ret;
+ DPRINTF(("GENERATED CONSTRAINT:"));
+ DPRINTF( (message ("%s", constraint_print(ret) ) ) );
return ret;
}
-bool constraint_resolve (/*@unused@*/ constraint c)
+constraint makeConstraintParse2 (constraintExpr l, lltok relOp, exprNode cconstant)
+
{
- return FALSE;
+ char *t;
+ int c;
+ constraint ret;
+ ret = constraint_makeNew();
+ llassert (l);
+ if (!l)
+ return ret;
+
+
+ ret->lexpr = constraintExpr_copy (l);
+ #warning fix abstraction
+
+ if (relOp.tok == GE_OP)
+ ret->ar = GTE;
+ else if (relOp.tok == LE_OP)
+ ret->ar = LTE;
+ else if (relOp.tok == EQ_OP)
+ ret->ar = EQ;
+ else
+ llfatalbug("Unsupported relational operator");
+
+
+ t = cstring_toCharsSafe (exprNode_unparse(cconstant));
+ c = atoi( t );
+ ret->expr = constraintExpr_makeIntLiteral (c);
+
+ ret->post = TRUE;
+ // ret->orig = ret;
+ DPRINTF(("GENERATED CONSTRAINT:"));
+ DPRINTF( (message ("%s", constraint_print(ret) ) ) );
+ return ret;
}
-/*@notnull@*/
-/*@special@*/ constraint constraint_makeNew (void)
- /*@post:isnull result->term, result->expr, result->constrType@*/
- /*@defines result->ar, result->post@*/
+
+constraint makeConstraintParse3 (constraintExpr l, lltok relOp, constraintExpr r)
{
constraint ret;
- ret = dmalloc(sizeof (*ret) );
- ret->lexpr = NULL;
- ret->expr = NULL;
- ret->ar = LT;
- ret->post = FALSE;
- /*@i23*/return ret;
-}
-/*@-czechfcns@*/
-constraintExpr constraintExpr_alloc ()
-{
- constraintExpr ret;
- ret = dmalloc (sizeof (*ret) );
- ret->term = NULL;
- ret->expr = NULL;
- ret->op = PLUS;
+ ret = constraint_makeNew();
+ llassert (l);
+ if (!l)
+ return ret;
+
+
+ ret->lexpr = constraintExpr_copy (l);
+ #warning fix abstraction
+
+ if (relOp.tok == GE_OP)
+ ret->ar = GTE;
+ else if (relOp.tok == LE_OP)
+ ret->ar = LTE;
+ else if (relOp.tok == EQ_OP)
+ ret->ar = EQ;
+ else
+ llfatalbug("Unsupported relational operator");
+
+ ret->expr = constraintExpr_copy (r);
+
+ ret->post = TRUE;
+ // ret->orig = ret;
+ DPRINTF(("GENERATED CONSTRAINT:"));
+ DPRINTF( (message ("%s", constraint_print(ret) ) ) );
return ret;
}
-constraintExpr constraintExpr_copy (constraintExpr expr)
+constraint constraint_copy (constraint c)
{
- constraintExpr ret;
- ret = constraintExpr_alloc();
- ret->term = constraintTerm_copy(expr->term);
- ret->op = expr->op;
- if (expr->expr != NULL)
- {
- ret->expr = constraintExpr_copy (expr->expr);
- }
+ constraint ret;
+ ret = constraint_makeNew();
+ ret->lexpr = constraintExpr_copy (c->lexpr);
+ ret->ar = c->ar;
+ ret->expr = constraintExpr_copy (c->expr);
+ ret->post = c->post;
+ /*@i33 fix this*/
+ if (c->orig != NULL)
+ ret->orig = constraint_copy (c->orig);
else
- {
- ret->expr = NULL;
- }
-
+ ret->orig = NULL;
+ return ret;
}
-constraintExpr constraintExpr_makeMaxSetExpr (exprNode expr)
+/*like copy expect it doesn't allocate memory for the constraint*/
+
+void constraint_overWrite (constraint c1, constraint c2)
{
- constraintExpr ret;
- ret = constraintExpr_alloc();
- ret->term = constraintTerm_makeMaxSetexpr(expr);
- return ret;
+ c1->lexpr = constraintExpr_copy (c2->lexpr);
+ c1->ar = c2->ar;
+ c1->expr = constraintExpr_copy (c2->expr);
+ c1->post = c2->post;
+ /*@i33 fix this*/
+ if (c2->orig != NULL)
+ c1->orig = constraint_copy (c2->orig);
+ else
+ c1->orig = NULL;
+
}
-constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
+bool constraint_resolve (/*@unused@*/ constraint c)
{
- constraintExpr ret;
- ret = constraintExpr_alloc();
- ret->term = constraintTerm_makeMaxReadexpr(expr);
- return ret;
+ return FALSE;
}
-constraintExpr constraintExpr_makeMinSetExpr (exprNode expr)
+
+
+constraint constraint_makeNew (void)
{
- constraintExpr ret;
- ret = constraintExpr_alloc();
- ret->term = constraintTerm_makeMinSetexpr(expr);
- return ret;
+ constraint ret;
+ ret = dmalloc(sizeof (*ret) );
+ ret->lexpr = NULL;
+ ret->expr = NULL;
+ ret->ar = LT;
+ ret->post = FALSE;
+ ret->orig = NULL;
+ /*@i23*/return ret;
}
-constraintExpr constraintExpr_makeMinReadExpr (exprNode expr)
+fileloc constraint_getFileloc (constraint c)
{
- constraintExpr ret;
- ret = constraintExpr_alloc();
- ret->term = constraintTerm_makeMinReadexpr(expr);
- return ret;
+ return (constraintExpr_getFileloc (c->lexpr) );
+
+
}
-constraintExpr constraintExpr_makeValueExpr (exprNode expr)
+constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
{
- constraintExpr ret;
- ret = constraintExpr_alloc();
- ret->term = constraintTerm_makeValueexpr(expr);
+ constraint ret = constraint_makeNew();
+ // constraintTerm term;
+ po = exprNode_fakeCopy(po);
+ ind = exprNode_fakeCopy(ind);
+ ret->lexpr = constraintExpr_makeMaxReadExpr(po);
+ ret->ar = GTE;
+ ret->expr = constraintExpr_makeValueExpr (ind);
return ret;
}
-
-constraintExpr makeConstraintExprIntlit (int i)
+constraint constraint_makeWriteSafeInt (exprNode po, int ind)
{
- constraintExpr ret;
- ret = dmalloc (sizeof (*ret) );
- ret->term = constraintTerm_makeIntLitValue(i);
- ret->expr = NULL;
- ret->op = PLUS;
- /*@i1*/ return ret;
-}
+ constraint ret = constraint_makeNew();
+
+ ret->lexpr =constraintExpr_makeMaxSetExpr(po);
+ ret->ar = GTE;
+ ret->expr = constraintExpr_makeValueInt (ind);
+ /*@i1*/return ret;
+}
-constraintExpr constraintExpr_makeValueInt (int i)
+constraint constraint_makeSRefSetBufferSize (sRef s, int size)
{
- return makeConstraintExprIntlit(i);
+ constraint ret = constraint_makeNew();
+ ret->lexpr = constraintExpr_makeSRefMaxset (s);
+ ret->ar = EQ;
+ ret->expr = constraintExpr_makeValueInt (size);
+ ret->post = TRUE;
+ /*@i1*/return ret;
}
-constraint constraint_makeWriteSafeExprNode (exprNode po, exprNode ind)
+constraint constraint_makeSRefWriteSafeInt (sRef s, int ind)
{
constraint ret = constraint_makeNew();
- constraintTerm term;
+
- ret->lexpr =constraintExpr_makeMaxSetExpr(po);
+ ret->lexpr = constraintExpr_makeSRefMaxset (s);
ret->ar = GTE;
- ret->expr = constraintExpr_makeValueExpr (ind);
+ ret->expr = constraintExpr_makeValueInt (ind);
+ ret->post = TRUE;
/*@i1*/return ret;
}
-
-constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
+
+/* drl added 01/12/2000
+
+ makes the constraint: Ensures index <= MaxRead(buffer) */
+
+constraint constraint_makeEnsureLteMaxRead(exprNode index, exprNode buffer)
{
constraint ret = constraint_makeNew();
- // constraintTerm term;
- po = exprNode_fakeCopy(po);
- ind = exprNode_fakeCopy(ind);
- ret->lexpr = constraintExpr_makeMaxReadExpr(po);
- ret->ar = GTE;
- ret->expr = constraintExpr_makeValueExpr (ind);
+
+ ret->lexpr = constraintExpr_makeValueExpr (index);
+ ret->ar = LTE;
+ ret->expr = constraintExpr_makeMaxReadExpr(buffer);
+ ret->post = TRUE;
return ret;
}
-constraint constraint_makeWriteSafeInt (exprNode po, int ind)
+constraint constraint_makeWriteSafeExprNode (exprNode po, exprNode ind)
{
constraint ret = constraint_makeNew();
- constraintTerm term;
+
ret->lexpr =constraintExpr_makeMaxSetExpr(po);
ret->ar = GTE;
- ret->expr = constraintExpr_makeValueInt (ind);
+ ret->expr = constraintExpr_makeValueExpr (ind);
/*@i1*/return ret;
}
-
+
+
constraint constraint_makeReadSafeInt ( exprNode po, int ind)
{
constraint ret = constraint_makeNew();
constraint constraint_makeEnsureMaxReadAtLeast (exprNode e1, exprNode t2, fileloc sequencePoint)
{
constraint ret = constraint_makeNew();
- constraintTerm term;
+
e1 = exprNode_fakeCopy (e1);
t2 = exprNode_fakeCopy (t2);
ret = constraint_makeReadSafeExprNode(e1, t2);
- if (ret->lexpr->term->loc != NULL)
- fileloc_free(ret->lexpr->term->loc);
+
+ ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
- ret->lexpr->term->loc = fileloc_copy (sequencePoint);
ret->post = TRUE;
- fileloc_incColumn (ret->lexpr->term->loc);
+ // fileloc_incColumn (ret->lexpr->term->loc);
return ret;
}
-constraint constraint_makeEnsureMinReadAtMost (exprNode po, exprNode ind, fileloc sequencePoint)
+static constraint constraint_makeEnsuresOp (exprNode e1, exprNode e2, fileloc sequencePoint, arithType ar)
{
constraint ret = constraint_makeNew();
- constraintTerm term;
- po = exprNode_fakeCopy(po);
- ind = exprNode_fakeCopy(ind);
-
- ret->lexpr = constraintExpr_makeMinReadExpr(po);
- ret->ar = LTE;
- ret->expr = constraintExpr_makeValueExpr (ind);
+ exprNode e;
+
+ e = exprNode_fakeCopy(e1);
+ if (! (e1 && e2) )
+ {
+ llcontbug((message("null exprNode, Exprnodes are %s and %s",
+ exprNode_unparse(e1), exprNode_unparse(e2) )
+ ));
+ }
+
+ ret->lexpr = constraintExpr_makeValueExpr (e);
+ ret->ar = ar;
ret->post = TRUE;
-
- if (ret->lexpr->term->loc != NULL)
- fileloc_free(ret->lexpr->term->loc);
+ e = exprNode_fakeCopy(e2);
+ ret->expr = constraintExpr_makeValueExpr (e);
- ret->lexpr->term->loc = fileloc_copy (sequencePoint);
- /*make this refer to element after preconditions */
- fileloc_incColumn (ret->lexpr->term->loc);
- /*@i1*/ return ret;
+ ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
+ return ret;
+}
+
+
+/* make constraint ensures e1 == e2 */
+
+constraint constraint_makeEnsureEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
+{
+ return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, EQ) );
}
-constraintExpr makeMaxSetPostOpInc (exprNode e)
+/*make constraint ensures e1 < e2 */
+constraint constraint_makeEnsureLessThan (exprNode e1, exprNode e2, fileloc sequencePoint)
{
- constraintExpr ret;
- ret = constraintExpr_makeValueExpr (e);
- ret->term = constraintTerm_makeMaxSetexpr (e);
- ret->op = MINUS;
- ret->expr = makeConstraintExprIntlit (1);
- return ret;
+ return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, LT) );
}
-constraint constraint_makeMaxSetSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
+constraint constraint_makeEnsureLessThanEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
+{
+ return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, LTE) );
+}
+
+constraint constraint_makeEnsureGreaterThan (exprNode e1, exprNode e2, fileloc sequencePoint)
+{
+ return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, GT) );
+}
+
+constraint constraint_makeEnsureGreaterThanEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
+{
+ return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, GTE) );
+}
+
+
+exprNode exprNode_copyConstraints (/*@returned@*/ exprNode dst, exprNode src)
+{
+ dst->ensuresConstraints = constraintList_copy (src->ensuresConstraints );
+ dst->requiresConstraints = constraintList_copy (src->requiresConstraints );
+ dst->trueEnsuresConstraints = constraintList_copy (src->trueEnsuresConstraints );
+ dst->falseEnsuresConstraints = constraintList_copy (src->falseEnsuresConstraints );
+ return dst;
+}
+
+constraint constraint_makeMaxSetSideEffectPostDecrement (exprNode e, fileloc sequencePoint)
{
constraint ret = constraint_makeNew();
//constraintTerm term;
- exprNode t2;
+
e = exprNode_fakeCopy(e);
- ret->lexpr = constraintExpr_makeMaxSetExpr(e);
+ ret->lexpr = constraintExpr_makeValueExpr (e);
ret->ar = EQ;
ret->post = TRUE;
- ret->expr = makeMaxSetPostOpInc(e);
-
- fileloc_incColumn ( ret->lexpr->term->loc);
- fileloc_incColumn ( ret->lexpr->term->loc);
- return ret;
-}
+ ret->expr = constraintExpr_makeValueExpr (e);
+ ret->expr = constraintExpr_makeDecConstraintExpr (ret->expr);
-constraintExpr makeMaxReadPostOpInc (exprNode e)
-{
- constraintExpr ret;
- ret = constraintExpr_makeValueExpr (e);
- ret->term = constraintTerm_makeMaxReadexpr (e);
- ret->op = MINUS;
- ret->expr = makeConstraintExprIntlit (1);
+ ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
+// fileloc_incColumn ( ret->lexpr->term->loc);
+// fileloc_incColumn ( ret->lexpr->term->loc);
return ret;
}
-
-constraint constraint_makeMaxReadSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
+constraint constraint_makeMaxSetSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
{
constraint ret = constraint_makeNew();
//constraintTerm term;
- exprNode t2;
+
e = exprNode_fakeCopy(e);
- ret->lexpr = constraintExpr_makeMaxReadExpr(e);
+ ret->lexpr = constraintExpr_makeValueExpr (e);
ret->ar = EQ;
ret->post = TRUE;
- ret->expr = makeMaxReadPostOpInc(e);
+ ret->expr = constraintExpr_makeValueExpr (e);
+ ret->expr = constraintExpr_makeIncConstraintExpr (ret->expr);
- fileloc_incColumn ( ret->lexpr->term->loc);
- fileloc_incColumn ( ret->lexpr->term->loc);
+ ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
+// fileloc_incColumn ( ret->lexpr->term->loc);
+// fileloc_incColumn ( ret->lexpr->term->loc);
return ret;
}
+
+// constraint constraint_makeMaxReadSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
+// {
+// constraint ret = constraint_makeNew();
+// //constraintTerm term;
+
+// e = exprNode_fakeCopy(e);
+// ret->lexpr = constraintExpr_makeMaxReadExpr(e);
+// ret->ar = EQ;
+// ret->post = TRUE;
+// ret->expr = constraintExpr_makeIncConstraintExpr (e);
+// ret->lexpr = constraintExpr_setFileLoc (ret->lexpr, sequencePoint);
+// return ret;
+// }
+
+
cstring arithType_print (arithType ar)
{
cstring st = cstring_undefined;
return st;
}
-cstring constraintExpr_print (constraintExpr ex)
+void constraint_printError (constraint c, fileloc loc)
{
- cstring st;
- cstring opStr;
- llassert (ex != NULL);
+ cstring string;
- st = message ("%s",
- constraintTerm_print (ex->term));
+ string = constraint_printDetailed (c);
- if (ex->expr != NULL)
+ if (c->post)
+ {
+ voptgenerror (FLG_FUNCTIONPOST, string, loc);
+ }
+ else
+ {
+ voptgenerror (FLG_FUNCTIONCONSTRAINT, string, loc);
+ }
+
+}
+
+cstring constraint_printDetailed (constraint c)
+{
+ cstring st = cstring_undefined;
+
+
+ if (!c->post)
{
- if (ex->op == PLUS)
- {
- opStr = cstring_makeLiteral (" + ");
- }
+ if (c->orig)
+ st = message ("Unresolved constraint:\nLclint is unable to resolve %s needed to satisfy %s", constraint_print (c), constraint_print(c->orig) );
+ else
+ st = message ("Unresolved constraint:\nLclint is unable to resolve %s", constraint_print (c));
+
+ }
+ else
+ {
+ if (c->orig)
+ st = message ("Block Post condition:\nThis function block has the post condition %s\n based on %s", constraint_print (c), constraint_print(c->orig) );
else
- {
- opStr = cstring_makeLiteral (" - ");
- }
- st = message ("%s %s %s", st, opStr, constraintExpr_print (ex->expr) );
+ st = message ("Block Post condition:\nThis function block has the post condition %s", constraint_print (c));
}
return st;
}
-
-cstring constraint_print (constraint c)
+cstring constraint_print (constraint c) /*@*/
{
cstring st = cstring_undefined;
cstring type = cstring_undefined;
return st;
}
+constraint constraint_doSRefFixBaseParam (constraint precondition,
+ exprNodeList arglist)
+{
+ precondition->lexpr = constraintExpr_doSRefFixBaseParam (precondition->lexpr,
+ arglist);
+ precondition->expr = constraintExpr_doSRefFixBaseParam (precondition->expr,
+ arglist);
+
+ return precondition;
+}
+
+
+constraint constraint_doFixResult (constraint postcondition, exprNode fcnCall)
+{
+ postcondition = constraint_copy (postcondition);
+ postcondition->lexpr = constraintExpr_doFixResult (postcondition->lexpr, fcnCall);
+ postcondition->expr = constraintExpr_doFixResult (postcondition->expr, fcnCall);
+
+ return postcondition;
+}
+
+constraint constraint_doSRefFixConstraintParam (constraint precondition,
+ exprNodeList arglist)
+{
+
+ precondition = constraint_copy (precondition);
+ precondition->lexpr = constraintExpr_doSRefFixConstraintParam (precondition->lexpr, arglist);
+ precondition->expr = constraintExpr_doSRefFixConstraintParam (precondition->expr, arglist);
+
+ return precondition;
+}
+
+// bool constraint_hasTerm (constraint c, constraintTerm term)
+// {
+// DPRINTF((message ("Constraint %s", constraint_print (c) ) ) );
+
+// if (constraintExpr_includesTerm (c->lexpr, term) )
+// return TRUE;
+
+// if (constraintExpr_includesTerm (c->expr, term) )
+// return TRUE;
+
+// return FALSE;
+// }
+
+constraint constraint_preserveOrig (constraint c)
+{
+ c->orig = constraint_copy (c);
+ return c;
+}
/*@=fcnuse*/
/*@=assignexpose*/
/*@=czechfcns@*/