]> andersk Git - splint.git/blobdiff - src/constraint.c
Readded files.
[splint.git] / src / constraint.c
index f6090836e3487ad148b6314ef69d3cb32822083e..ec5eb02d513dba3fd74a7fa7a2fa02060bc6b261 100644 (file)
@@ -2,6 +2,8 @@
 ** 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();
@@ -185,97 +270,136 @@ constraint constraint_makeReadSafeInt ( exprNode po, int ind)
 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;
@@ -309,32 +433,47 @@ cstring arithType_print (arithType ar)
   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;
@@ -356,6 +495,56 @@ cstring  constraint_print (constraint c)
   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@*/
This page took 0.053551 seconds and 4 git commands to generate.