/*
-** constraintList.c
+** constraint.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*/
+/*@access exprNode @*/
+
+
+static /*@notnull@*/ /*@special@*/ constraint constraint_makeNew (void)
+ /*@post:isnull result->or, result->orig, result->generatingExpr, result->fcnPre @*/ /*@defines result->or, result->generatingExpr, result->orig, result->fcnPre @*/;
+
+/* constraint makeConstraintParse (sRef x, lltok relOp, exprNode cconstant) */
+
+/* { */
+/* char *t; */
+/* int c; */
+/* constraint ret; */
+/* ret = constraint_makeNew(); */
+/* 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(message ("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; */
+/* } */
+
+constraint makeConstraintParse2 (constraintExpr l, lltok relOp, exprNode cconstant)
+{
+ char *t;
+ int c;
+ constraint ret;
+ ret = constraint_makeNew();
+ llassert (l!=NULL);
+
+ 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(message("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_same (constraint c1, constraint c2)
+{
+
+ if (c1->ar != c2->ar)
+ return FALSE;
+
+ if (!constraintExpr_similar (c1->lexpr, c2->lexpr) )
+ return FALSE;
+
+ if (!constraintExpr_similar (c1->expr, c2->expr) )
+ return FALSE;
+
+ return TRUE;
+}
+
+constraint makeConstraintParse3 (constraintExpr l, lltok relOp, constraintExpr r)
+{
+ constraint ret;
+ ret = constraint_makeNew();
+ llassert (l !=NULL);
+
+ 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( message("Unsupported relational operator") );
+
+ ret->expr = constraintExpr_copy (r);
+
+ ret->post = TRUE;
+
+ ret->orig = constraint_copy(ret);
+
+ ret = constraint_simplify (ret);
+
+ // ret->orig = ret;
+ DPRINTF(("GENERATED CONSTRAINT:"));
+ DPRINTF( (message ("%s", constraint_print(ret) ) ) );
+ return ret;
+}
+
constraint constraint_copy (constraint c)
{
constraint ret;
+
+ llassert (constraint_isDefined(c) );
+ // TPRINTF((message("Copying constraint %q", constraint_print) ));
+
ret = constraint_makeNew();
- ret->c1 = c->c1;
- ret->t1 = c->t1;
+ ret->lexpr = constraintExpr_copy (c->lexpr);
ret->ar = c->ar;
- ret->e1 = c->e1;
+ ret->expr = constraintExpr_copy (c->expr);
ret->post = c->post;
+ ret->generatingExpr = exprNode_fakeCopy(c->generatingExpr);
+
+ /*@i33 fix this*/
+ if (c->orig != NULL)
+ ret->orig = constraint_copy (c->orig);
+ else
+ ret->orig = NULL;
+
+ if (c->or != NULL)
+ ret->or = constraint_copy (c->or);
+ else
+ ret->or = NULL;
+
+ ret->fcnPre = c->fcnPre;
+
return ret;
}
-bool constraint_resolve (/*@unused@*/ constraint c)
+/*like copy expect it doesn't allocate memory for the constraint*/
+
+void constraint_overWrite (constraint c1, constraint c2)
{
- return FALSE;
+ llassert (constraint_isDefined(c1) );
+
+ llassert (c1 != c2);
+
+ DPRINTF((message("OverWriteing constraint %q with %q", constraint_print(c1),
+ constraint_print(c2) ) ));
+
+ constraintExpr_free(c1->lexpr);
+ constraintExpr_free(c1->expr);
+
+ c1->lexpr = constraintExpr_copy (c2->lexpr);
+ c1->ar = c2->ar;
+ c1->expr = constraintExpr_copy (c2->expr);
+ c1->post = c2->post;
+
+ if (c1->orig != NULL)
+ constraint_free (c1->orig);
+
+ if (c2->orig != NULL)
+ c1->orig = constraint_copy (c2->orig);
+ else
+ c1->orig = NULL;
+
+ /*@i33 make sure that the or is freed correctly*/
+ if (c1->or != NULL)
+ constraint_free (c1->or);
+
+ if (c2->or != NULL)
+ c1->or = constraint_copy (c2->or);
+ else
+ c1->or = NULL;
+
+ c1->fcnPre = c2->fcnPre;
+
+ c1->generatingExpr = c2->generatingExpr;
}
-/*@notnull@*/
-/*@special@*/ constraint constraint_makeNew (void)
- /*@post:isnull result->t1, result->e1, result->c1@*/
- /*@defines result->ar, result->post@*/
+
+
+static /*@notnull@*/ /*@special@*/ constraint constraint_makeNew (void)
+ /*@post:isnull result->or, result->orig, result->generatingExpr, result->fcnPre @*/ /*@defines result->or, result->generatingExpr, result->orig, result->fcnPre @*/
{
constraint ret;
ret = dmalloc(sizeof (*ret) );
- ret->t1 = NULL;
- ret->e1 = NULL;
- ret->c1 = NULL;
+ ret->lexpr = NULL;
+ ret->expr = NULL;
ret->ar = LT;
ret->post = FALSE;
- /*@i23*/return ret;
+ ret->orig = NULL;
+ ret->or = NULL;
+ ret->generatingExpr = NULL;
+ ret->fcnPre = NULL;
+ return ret;
}
-/*@-czechfcns@*/
-/*@out@*/ constraintTerm new_constraintTermExpr (void)
+constraint constraint_addGeneratingExpr (/*@returned@*/ constraint c, exprNode e)
{
- constraintTerm ret;
- ret = dmalloc (sizeof (* ret ) );
-
- return ret;
+
+ if (c->generatingExpr == NULL)
+ {
+ c->generatingExpr = exprNode_fakeCopy(e);
+ DPRINTF ((message ("setting generatingExpr for %s to %s", constraint_print(c), exprNode_unparse(e) ) ));
+ }
+ else
+ {
+ DPRINTF ((message ("Not setting generatingExpr for %s to %s", constraint_print(c), exprNode_unparse(e) ) ));
+ }
+ return c;
}
-constraintTerm exprNode_makeConstraintTerm (/*@only@*/ exprNode e)
+constraint constraint_origAddGeneratingExpr (/*@returned@*/ constraint c, exprNode e)
{
- constraintTerm ret = new_constraintTermExpr();
- ret->loc = exprNode_getfileloc(e);
- ret->value.expr = e;
- ret->kind = EXPRNODE;
- return ret;
+
+ if (c->orig != constraint_undefined)
+ {
+ c->orig = constraint_addGeneratingExpr(c->orig, e);
+ }
+ else
+ {
+ DPRINTF ((message ("constraint_origAddGeneratingExpr: Not setting generatingExpr for %s to %s", constraint_print(c), exprNode_unparse(e) ) ));
+ }
+ return c;
}
-constraintTerm intLit_makeConstraintTerm (int i)
+
+constraint constraint_setFcnPre (/*@returned@*/ constraint c )
{
- constraintTerm ret = new_constraintTermExpr();
- ret->value.intlit = i;
- ret->kind = INTLITERAL;
- ret->loc = fileloc_undefined;
- return ret;
+
+ if (c->orig != constraint_undefined)
+ {
+ c->orig->fcnPre = TRUE;
+ }
+ else
+ {
+ c->fcnPre = TRUE;
+ TPRINTF(( message("Warning Setting fcnPre directly") ));
+ }
+ return c;
}
-
-/*@special@*/ constraintExpr makeConstraintExpr (/*@only@*/ /*@notnull@*/ constraintTerm term)
- /*@post:isnull result->e1@*/
- /*@post:notnull result->t1@*/
- /*@defines result->e1, result->t1, result->c1@, result->op*/
-{
- constraintExpr ret;
- ret = dmalloc (sizeof (*ret) );
- ret->t1 = term;
- ret->e1 = NULL;
- ret->c1 = UNDEFINED;
- ret->op = PLUS;
- return ret;
+
+
+
+fileloc constraint_getFileloc (constraint c)
+{
+ if (exprNode_isDefined(c->generatingExpr) )
+ return (fileloc_copy (exprNode_getfileloc (c->generatingExpr) ) );
+
+ return (constraintExpr_getFileloc (c->lexpr) );
+
+
}
+static bool checkForMaxSet (constraint c)
+{
+ if (constraintExpr_hasMaxSet(c->lexpr) || constraintExpr_hasMaxSet(c->expr) )
+ return TRUE;
- constraintExpr makeConstraintExprIntlit (int i)
+ return FALSE;
+}
+
+bool constraint_hasMaxSet(constraint c)
{
- constraintExpr ret;
- ret = dmalloc (sizeof (*ret) );
- ret->t1 = intLit_makeConstraintTerm (i);
- ret->e1 = NULL;
- ret->c1 = VALUE;
- ret->op = PLUS;
- /*@i1*/ return ret;
+ if (c->orig != NULL)
+ {
+ if (checkForMaxSet(c->orig) )
+ return TRUE;
+ }
+
+ return (checkForMaxSet(c) );
}
-
-/*@i33*/
-/*@null@*/ constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
+constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
{
constraint ret = constraint_makeNew();
- constraintTerm term;
+ // constraintTerm term;
po = exprNode_fakeCopy(po);
ind = exprNode_fakeCopy(ind);
- printf ("Requires maxr(%s) >= %s\n", cstring_toCharsSafe (exprNode_unparse (po ) ),
- cstring_toCharsSafe ( exprNode_unparse (ind) ) );
- ret->t1 = exprNode_makeConstraintTerm(po);
- ret->c1 = MAXREAD;
+ ret->lexpr = constraintExpr_makeMaxReadExpr(po);
+ ret->ar = GTE;
+ ret->expr = constraintExpr_makeValueExpr (ind);
+ ret->post = FALSE;
+ return ret;
+}
+
+constraint constraint_makeWriteSafeInt (exprNode po, int ind)
+{
+ constraint ret = constraint_makeNew();
+
+
+ ret->lexpr =constraintExpr_makeMaxSetExpr(po);
ret->ar = GTE;
+ ret->expr = constraintExpr_makeIntLiteral (ind);
+ /*@i1*/return ret;
+}
- term = exprNode_makeConstraintTerm (ind);
-
- ret->e1 = makeConstraintExpr (term);
- ret->e1->c1 = VALUE;
+constraint constraint_makeSRefSetBufferSize (sRef s, long int size)
+{
+ constraint ret = constraint_makeNew();
+ ret->lexpr = constraintExpr_makeSRefMaxset (s);
+ ret->ar = EQ;
+ ret->expr = constraintExpr_makeIntLiteral ((int)size);
+ ret->post = TRUE;
+ /*@i1*/return ret;
+}
+
+constraint constraint_makeSRefWriteSafeInt (sRef s, int ind)
+{
+ constraint ret = constraint_makeNew();
+
+
+ ret->lexpr = constraintExpr_makeSRefMaxset ( s );
+ ret->ar = GTE;
+ ret->expr = constraintExpr_makeIntLiteral (ind);
+ ret->post = TRUE;
/*@i1*/return ret;
}
+/* drl added 01/12/2000
+
+ makes the constraint: Ensures index <= MaxRead(buffer) */
+
+constraint constraint_makeEnsureLteMaxRead(exprNode index, exprNode buffer)
+{
+ constraint ret = constraint_makeNew();
+
+ ret->lexpr = constraintExpr_makeValueExpr (index);
+ ret->ar = LTE;
+ ret->expr = constraintExpr_makeMaxReadExpr(buffer);
+ ret->post = TRUE;
+ return ret;
+}
+
constraint constraint_makeWriteSafeExprNode (exprNode po, exprNode ind)
{
constraint ret = constraint_makeNew();
- constraintTerm term;
- printf ("Requires maxw(%s) >= %s\n", cstring_toCharsSafe (exprNode_unparse (po ) ),
- cstring_toCharsSafe( exprNode_unparse (ind) ) );
- ret->t1 = exprNode_makeConstraintTerm(po);
- ret->c1 = MAXSET;
- ret->ar = GTE;
- term = exprNode_makeConstraintTerm(ind);
-
- ret->e1 = makeConstraintExpr (term);
- ret->e1->c1 = VALUE;
+
+ ret->lexpr =constraintExpr_makeMaxSetExpr(po);
+ ret->ar = GTE;
+ ret->expr = constraintExpr_makeValueExpr (ind);
/*@i1*/return ret;
}
-constraint constraint_makeReadSafeInt (exprNode t1, int index)
+constraint constraint_makeReadSafeInt ( exprNode po, int ind)
{
constraint ret = constraint_makeNew();
- constraintTerm term;
- printf ("Ensures maxr((valueof(%s)) >= %d\n", cstring_toCharsSafe (exprNode_unparse (t1 ) ),
- index );
- t1 = exprNode_fakeCopy(t1);
- ret->t1 = exprNode_makeConstraintTerm(t1);
- ret->c1 = MAXREAD;
- ret->ar = GTE;
- ret->post = TRUE;
- term = intLit_makeConstraintTerm(index);
+
+ po = exprNode_fakeCopy(po);
- ret->e1 = makeConstraintExpr (term);
- ret->e1->c1 = VALUE;
- /*make this refer to element after preconditions */
- fileloc_incColumn (ret->t1->loc);
- /*@i1*/ return ret;
+ ret->lexpr = constraintExpr_makeMaxReadExpr(po);
+ ret->ar = GTE;
+ ret->expr = constraintExpr_makeIntLiteral (ind);
+ ret->post = FALSE;
+ return ret;
}
-
-constraint constraint_makeEnsureMaxReadAtLeast (exprNode t1, exprNode t2, fileloc sequencePoint)
+constraint constraint_makeSRefReadSafeInt (sRef s, int ind)
{
constraint ret = constraint_makeNew();
- constraintTerm term;
- t1 = exprNode_fakeCopy (t1);
+
+ ret->lexpr = constraintExpr_makeSRefMaxRead (s );
+ ret->ar = GTE;
+ ret->expr = constraintExpr_makeIntLiteral (ind);
+ ret->post = TRUE;
+ /*@i1*/return ret;
+}
+
+constraint constraint_makeEnsureMaxReadAtLeast (exprNode e1, exprNode t2, fileloc sequencePoint)
+{
+ constraint ret;
+
+ e1 = exprNode_fakeCopy (e1);
t2 = exprNode_fakeCopy (t2);
- ret->t1 = exprNode_makeConstraintTerm(t1);
+ ret = constraint_makeReadSafeExprNode(e1, t2);
- if (ret->t1->loc != NULL)
- fileloc_free(ret->t1->loc);
+ ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
- ret->t1->loc = fileloc_copy (sequencePoint);
- ret->c1 = MAXREAD;
- ret->ar = GTE;
ret->post = TRUE;
- term = exprNode_makeConstraintTerm (t2);
-
- ret->e1 = makeConstraintExpr (term);
- ret->e1->c1 = VALUE;
- /*make this refer to element after preconditions */
- fileloc_incColumn (ret->t1->loc);
- /*@i1*/ return ret;
+
+ // fileloc_incColumn (ret->lexpr->term->loc);
+ return ret;
}
-constraint constraint_makeEnsureMinReadAtMost (exprNode po, exprNode ind, fileloc sequencePoint)
+static constraint constraint_makeEnsuresOpConstraintExpr (/*@only@*/ constraintExpr c1, /*@only@*/ constraintExpr c2, fileloc sequencePoint, arithType ar)
{
- constraint ret = constraint_makeNew();
- constraintTerm term;
- po = exprNode_fakeCopy (po);
- ind = exprNode_fakeCopy (ind);
+ constraint ret;
- ret->t1 = exprNode_makeConstraintTerm(po);
- ret->c1 = MINREAD;
- ret->ar = LTE;
- ret->post = TRUE;
- term = exprNode_makeConstraintTerm (ind);
+ llassert(c1 && c2);
+ // llassert(sequencePoint);
+
+ ret = constraint_makeNew();
- ret->e1 = makeConstraintExpr (term);
- ret->e1->c1 = VALUE;
- /*make this refer to element after preconditions */
- fileloc_incColumn (ret->t1->loc);
- /*@i1*/ return ret;
+ ret->lexpr = c1;
+ ret->ar = ar;
+ ret->post = TRUE;
+ ret->expr = c2;
+ ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
+ return ret;
}
-constraintExpr makePostOpInc (exprNode t1)
+static constraint constraint_makeEnsuresOp (exprNode e1, exprNode e2, fileloc sequencePoint, arithType ar)
{
- constraintExpr ret;
- constraintTerm term;
+ constraintExpr c1, c2;
+ constraint ret;
+ exprNode e;
+
+ if (! (e1 && e2) )
+ {
+ llcontbug((message("null exprNode, Exprnodes are %s and %s",
+ exprNode_unparse(e1), exprNode_unparse(e2) )
+ ));
+ }
- t1 = exprNode_fakeCopy (t1);
- term = exprNode_makeConstraintTerm(t1);
- ret = makeConstraintExpr (term);
- ret->op = PLUS;
- ret->c1 = VALUE;
- ret->e1 = makeConstraintExprIntlit (1);
+ // llassert (sequencePoint);
+
+ e = exprNode_fakeCopy(e1);
+ c1 = constraintExpr_makeValueExpr (e);
+
+ e = exprNode_fakeCopy(e2);
+ c2 = constraintExpr_makeValueExpr (e);
+
+ ret = constraint_makeEnsuresOpConstraintExpr (c1, c2, sequencePoint, ar);
+
return ret;
}
-constraint constraint_makeSideEffectPostIncrement (exprNode t1, fileloc sequencePoint)
+
+/* make constraint ensures e1 == e2 */
+
+constraint constraint_makeEnsureEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
+{
+ return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, EQ) );
+}
+
+/*make constraint ensures e1 < e2 */
+constraint constraint_makeEnsureLessThan (exprNode e1, exprNode e2, fileloc sequencePoint)
+{
+ constraintExpr t1, t2;
+
+ t1 = constraintExpr_makeValueExpr (e1);
+ t2 = constraintExpr_makeValueExpr (e2);
+
+ /*change this to e1 <= (e2 -1) */
+
+ t2 = constraintExpr_makeDecConstraintExpr (t2);
+
+ return ( constraint_makeEnsuresOpConstraintExpr (t1, t2, sequencePoint, LTE) );
+}
+
+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)
+{
+ constraintExpr t1, t2;
+
+ t1 = constraintExpr_makeValueExpr (e1);
+ t2 = constraintExpr_makeValueExpr (e2);
+
+
+ /* change this to e1 >= (e2 + 1) */
+ t2 = constraintExpr_makeIncConstraintExpr (t2);
+
+
+ return ( constraint_makeEnsuresOpConstraintExpr (t1, t2, sequencePoint, GTE) );
+}
+
+constraint constraint_makeEnsureGreaterThanEqual (exprNode e1, exprNode e2, fileloc sequencePoint)
+{
+ return ( constraint_makeEnsuresOp (e1, e2, sequencePoint, GTE) );
+}
+
+
+exprNode exprNode_copyConstraints (/*@returned@*/ exprNode dst, exprNode src)
+{
+ constraintList_free(dst->ensuresConstraints);
+ constraintList_free(dst->requiresConstraints);
+ constraintList_free(dst->trueEnsuresConstraints);
+ constraintList_free(dst->falseEnsuresConstraints);
+
+ 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;
- t1 = exprNode_fakeCopy(t1);
- t2 = exprNode_fakeCopy(t1);
-
- ret->t1 = exprNode_makeConstraintTerm(t1);
- ret->c1 = VALUE;
+
+ e = exprNode_fakeCopy(e);
+ ret->lexpr = constraintExpr_makeValueExpr (e);
ret->ar = EQ;
ret->post = TRUE;
- ret->e1 = makePostOpInc(t2);
+ ret->expr = constraintExpr_makeValueExpr (e);
+ ret->expr = constraintExpr_makeDecConstraintExpr (ret->expr);
+
+ ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
+// fileloc_incColumn ( ret->lexpr->term->loc);
+// fileloc_incColumn ( ret->lexpr->term->loc);
+ return ret;
+}
+constraint constraint_makeMaxSetSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
+{
+ constraint ret = constraint_makeNew();
+ //constraintTerm term;
+
+ e = exprNode_fakeCopy(e);
+ ret->lexpr = constraintExpr_makeValueExpr (e);
+ ret->ar = EQ;
+ ret->post = TRUE;
+ ret->expr = constraintExpr_makeValueExpr (e);
+ ret->expr = constraintExpr_makeIncConstraintExpr (ret->expr);
+
+ ret->lexpr = constraintExpr_setFileloc (ret->lexpr, sequencePoint);
+// fileloc_incColumn ( ret->lexpr->term->loc);
+// fileloc_incColumn ( ret->lexpr->term->loc);
+ return ret;
+}
+
+
+void constraint_free (/*@only@*/ /*@notnull@*/ constraint c)
+{
+ llassert(constraint_isDefined (c) );
+
+
+ if (constraint_isDefined(c->orig) )
+ constraint_free (c->orig);
+ if ( constraint_isDefined(c->or) )
+ constraint_free (c->or);
- fileloc_incColumn ( ret->t1->loc);
- fileloc_incColumn ( ret->t1->loc);
- /*@i6*/return ret;
+ constraintExpr_free(c->lexpr);
+ constraintExpr_free(c->expr);
+
+ c->orig = NULL;
+ c->or = NULL;
+ c->lexpr = NULL;
+ c->expr = NULL;
+
+ free (c);
+
}
-void constraintType_print (constraintType c1)
+
+// 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) /*@*/
{
- switch (c1)
+ cstring st = cstring_undefined;
+ switch (ar)
{
- case VALUE:
- printf("VALUE");
- break;
- case CALLSAFE:
- printf("CALLSAFE");
+ case LT:
+ st = cstring_makeLiteral (" < ");
break;
- case MAXSET:
- printf ("MAXSET");
+ case LTE:
+ st = cstring_makeLiteral (" <= ");
break;
- case MINSET:
- printf ("MINSET");
+ case GT:
+ st = cstring_makeLiteral (" > ");
break;
- case MAXREAD:
- printf ("MAXREAD");
+ case GTE:
+ st = cstring_makeLiteral (" >= ");
break;
- case MINREAD:
- printf ("MINREAD");
+ case EQ:
+ st = cstring_makeLiteral (" == ");
break;
- case NULLTERMINATED:
- printf ("NULLTERMINATED");
+ case NONNEGATIVE:
+ st = cstring_makeLiteral (" NONNEGATIVE ");
break;
- case UNDEFINED:
- TPRINTF(("Unhandled value for constraintType"));
- llassert(FALSE);
+ case POSITIVE:
+ st = cstring_makeLiteral (" POSITIVE ");
break;
default:
- TPRINTF(("Unhandled value for constraintType"));
llassert(FALSE);
+ break;
}
+ return st;
}
-void constraintTerm_print (constraintTerm term)
+
+
+void constraint_printErrorPostCondition (constraint c, fileloc loc)
{
- cstring s;
+ cstring string;
+ fileloc errorLoc, temp;
+
+ string = constraint_printDetailedPostCondition (c);
- llassert (term != NULL);
- switch (term->kind)
- {
- case EXPRNODE:
- s = exprNode_unparse (term->value.expr);
- printf(" %s", cstring_toCharsSafe(s) );
- s = fileloc_unparse (term->loc);
- printf("@ %s", cstring_toCharsSafe(s) );
- cstring_free(s);
- break;
- case INTLITERAL:
+ errorLoc = loc;
+
+ loc = NULL;
+
+ temp = constraint_getFileloc(c);
+
+ if (fileloc_isDefined(temp) )
{
- char * buf = malloc (15);
- /*@i1*/snprintf (buf, 14, "intliteral(%d)", term->value.intlit);
- /*@i1*/ printf(" %s ", buf);
- free (buf);
- break;
+ errorLoc = temp;
+ voptgenerror ( FLG_CHECKPOST, string, errorLoc);
+ fileloc_free(temp);
}
- case SREF:
- TPRINTF( ("Not Implemented\n"));
- llassert(FALSE);
- break;
+ else
+ {
+ voptgenerror ( FLG_CHECKPOST, string, errorLoc);
}
- /*@-unreachable*/
- return;
- /*@=unreachable*/
}
-void arithType_print (arithType ar)
+
+
+
+void constraint_printError (constraint c, fileloc loc)
{
- switch (ar)
+ cstring string;
+ fileloc errorLoc, temp;
+
+ string = constraint_printDetailed (c);
+
+ errorLoc = loc;
+
+ loc = NULL;
+
+ temp = constraint_getFileloc(c);
+
+ if (fileloc_isDefined(temp) )
{
- case LT:
- printf(" < ");
- return;
- case LTE:
- printf(" <= ");
- return;
- case GT:
- printf(" > ");
- return;
- case GTE:
- printf(" <= ");
- return;
- case EQ:
- printf(" == ");
- return;
- case NONNEGATIVE:
- printf(" NONNEGATIVE ");
- return;
- case POSITIVE:
- printf(" POSITIVE ");
- return;
- default:
- llassert(FALSE);
+ errorLoc = temp;
+
+ if (c->post)
+ {
+ voptgenerror (FLG_FUNCTIONPOST, string, errorLoc);
+ }
+ else
+ {
+ voptgenerror (FLG_FUNCTIONCONSTRAINT, string, errorLoc);
+ }
+ fileloc_free(temp);
+ }
+ else
+ {
+ if (c->post)
+ {
+ voptgenerror (FLG_FUNCTIONPOST, string, errorLoc);
+ }
+ else
+ {
+ voptgenerror (FLG_FUNCTIONCONSTRAINT, string, errorLoc);
+ }
}
}
-void constraintExpr_print (constraintExpr ex)
+
+cstring constraint_printDeep (constraint c)
{
- llassert (ex != NULL);
- constraintType_print (ex->c1 );
- constraintTerm_print (ex->t1);
- if (ex->e1 != NULL)
+ cstring st = cstring_undefined;
+
+ st = constraint_print(c);
+
+ if (c->orig != constraint_undefined)
{
- if (ex->op == PLUS)
+ if (!c->post)
{
- printf(" + ");
+ if (c->orig->fcnPre)
+ st = cstring_concatFree(st, (message(" derived from %s precondition: %q", exprNode_unparse(c->orig->generatingExpr), constraint_printDeep(c->orig) )
+ ) );
+ else
+ st = cstring_concatFree(st,(message(" needed to satisfy %q",
+ constraint_printDeep(c->orig) )
+ ) );
+
}
else
{
- printf (" - ");
+ st = cstring_concatFree(st,(message("derived from: %q",
+ constraint_printDeep(c->orig) )
+ ) );
}
-
- constraintExpr_print (ex->e1);
}
-
+
+ return st;
+
+}
+
+cstring constraint_printDetailedPostCondition (constraint c)
+{
+ cstring st = cstring_undefined;
+
+ st = message ("Unsatisfied ensures constraint condition:\nLCLint is unable to verify the constraint %q", constraint_printDeep (c) );
+
+ if (context_getFlag (FLG_CONSTRAINTLOCATION) )
+ {
+ cstring temp;
+ // llassert (c->generatingExpr);
+ temp = message ("\nOriginal Generating expression %q: %s\n", fileloc_unparse( exprNode_getfileloc (c->generatingExpr) ),
+ exprNode_unparse(c->generatingExpr) );
+ st = cstring_concatFree (st, temp);
+
+ if (constraint_hasMaxSet(c) )
+ {
+ temp = message ("Has MaxSet\n");
+ st = cstring_concatFree (st, temp);
+ }
+ }
+ return st;
}
+cstring constraint_printDetailed (constraint c)
+{
+ cstring st = cstring_undefined;
+
+ if (!c->post)
+ {
+ st = message ("Unresolved constraint:\nLclint is unable to resolve %q", constraint_printDeep (c) );
+ }
+ else
+ {
+ st = message ("Block Post condition:\nThis function block has the post condition %q", constraint_printDeep (c) );
+ }
+
+ if (context_getFlag (FLG_CONSTRAINTLOCATION) )
+ {
+ cstring temp;
+ // llassert (c->generatingExpr);
+ temp = message ("\nOriginal Generating expression %q: %s\n", fileloc_unparse( exprNode_getfileloc (c->generatingExpr) ),
+ exprNode_unparse(c->generatingExpr) );
+ st = cstring_concatFree (st, temp);
-void constraint_print (constraint c)
+ if (constraint_hasMaxSet(c) )
+ {
+ temp = message ("Has MaxSet\n");
+ st = cstring_concatFree (st, temp);
+ }
+ }
+ return st;
+}
+
+/*@only@*/ cstring constraint_print (constraint c) /*@*/
{
+ cstring st = cstring_undefined;
+ cstring type = cstring_undefined;
+ llassert (c !=NULL);
if (c->post)
{
- printf("Ensures: ");
+ type = cstring_makeLiteral ("Ensures: ");
}
else
{
- printf("requires: ");
+ type = cstring_makeLiteral ("Requires: ");
}
+ st = message ("%q: %q %q %q",
+ type,
+ constraintExpr_print (c->lexpr),
+ arithType_print(c->ar),
+ constraintExpr_print(c->expr)
+ );
+ return st;
+}
+
+cstring constraint_printOr (constraint c) /*@*/
+{
+ cstring ret;
+ constraint temp;
+
+ ret = cstring_undefined;
+ temp = c;
+
+ ret = cstring_concatFree (ret, constraint_print(temp) );
+
+ temp = temp->or;
- constraintType_print (c->c1);
- constraintTerm_print (c->t1);
- arithType_print(c->ar);
- constraintExpr_print(c->e1);
- printf("\n");
+ while ( constraint_isDefined(temp) )
+ {
+ ret = cstring_concatFree (ret, cstring_makeLiteral (" OR ") );
+ ret = cstring_concatFree (ret, constraint_print(temp) );
+ temp = temp->or;
+ }
+
+ return ret;
+
+}
+
+/*@only@*/ constraint constraint_doSRefFixBaseParam (/*@returned@*/ /*@only@*/ 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;
+}
+
+/*@only@*/ 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);
+
+ precondition->fcnPre = FALSE;
+ 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 (/*@returned@*/ constraint c) /*@modifies c @*/
+{
+
+ DPRINTF( (message("Doing constraint_preserverOrig for %q ", constraint_printDetailed(c) ) ));
+
+ if (c->orig == constraint_undefined)
+ c->orig = constraint_copy (c);
+
+ else if (c->orig->fcnPre)
+ {
+ constraint temp;
+
+ temp = c->orig;
+
+ /* avoid infinite loop */
+ c->orig = NULL;
+ c->orig = constraint_copy (c);
+ if (c->orig->orig == NULL)
+ c->orig->orig = temp;
+ else
+ llcontbug((message("Expected c->orig->orig to be null" ) ));
+ }
+ else
+ {
+ DPRINTF( (message("Not changing constraint") ));
+ }
+
+ DPRINTF( (message("After Doing constraint_preserverOrig for %q ", constraint_printDetailed(c) ) ));
+
+ return c;
+}
/*@=fcnuse*/
/*@=assignexpose*/
/*@=czechfcns@*/
+constraint constraint_togglePost (/*@returned@*/ constraint c)
+{
+ c->post = !c->post;
+ return c;
+}