]> andersk Git - splint.git/commitdiff
Most of the constraint resolving works.
authordrl7x <drl7x>
Fri, 22 Sep 2000 09:14:07 +0000 (09:14 +0000)
committerdrl7x <drl7x>
Fri, 22 Sep 2000 09:14:07 +0000 (09:14 +0000)
can do g[0] = '2'; g++; g[0] = 'g';  I think...

17 files changed:
src/Headers/constraint.h
src/Headers/constraintList.h
src/Headers/constraintTerm.h [new file with mode: 0644]
src/Headers/exprNode.h
src/Headers/herald.h
src/Headers/herald.last
src/Headers/usymtab.h
src/Makefile.sources
src/cgrammar.tab.c
src/constraint.c
src/constraintGeneration.c
src/constraintList.c
src/constraintList2.c [new file with mode: 0644]
src/constraintListold.c [new file with mode: 0644]
src/constraintResolve.c [new file with mode: 0644]
src/constraintTerm.c [new file with mode: 0644]
src/exprNode.c

index 89ae374a5a8d8d742c04b6c264ff4e30e8f0a27d..18785213012c313cc5b83435a2c8e8239d8013cc 100644 (file)
@@ -37,6 +37,7 @@ INTLITERAL
 
 
 struct _constraintTerm {
+  constraintType constrType;
   fileloc loc;
   constraintTermValue value;
   constraintTermType kind;
@@ -45,10 +46,10 @@ struct _constraintTerm {
 abst_typedef struct _constraintTerm * constraintTerm;
 
 struct constraintExpr_ {
-  constraintType c1;
-  constraintTerm t1;
+
+  constraintTerm term;
   constraintExprOp op;
-  struct constraintExpr_ * e1;
+  struct constraintExpr_ * expr;
 };
 # define constraintExpr_undefined ((constraintExpr)NULL)
 
@@ -57,10 +58,9 @@ abst_typedef struct constr_ * constr;
 
 
 struct _constraint {
-  constraintType c1;
-  constraintTerm t1;
+  constraintExpr lexpr;
   arithType       ar;
-  constraintExpr  e1;
+  constraintExpr  expr;
   bool post;
 } ;
 
@@ -82,9 +82,9 @@ constraintTerm exprNode_makeConstraintTerm (/*@only@*/ exprNode e);
 constraintTerm intLit_makeConstraintTerm (int p_i);
 
 /*@special@*/ constraintExpr makeConstraintExpr (/*@only@*/ /*@notnull@*/ constraintTerm term)
- /*@post:isnull result->e1@*/
+ /*@post:isnull result->expr@*/
      /*@post:notnull result->t1@*/
-     /*@defines result->e1, result->t1, result->c1@, result->op*/;
+     /*@defines result->expr, result->t1, result->c1@, result->op*/;
      
 constraintExpr makeConstraintExprIntlit (int p_i);
 
@@ -99,24 +99,26 @@ constraint constraint_makeEnsureMaxReadAtLeast (exprNode p_t1, exprNode p_t2, fi
 constraint constraint_makeEnsureMinReadAtMost (exprNode po, exprNode ind, fileloc sequencePoint);
 
 constraint constraint_makeSideEffectPostIncrement (exprNode t1,  fileloc p_sequencePoint);
-void constraintType_print (constraintType c1);
+cstring constraintType_print (constraintType c1);
 
+constraint constraint_copy (constraint c);
 
 constraintExpr makePostOpInc (exprNode t1);
 
 
 
-void constraintTerm_print (constraintTerm term);
+cstring constraintTerm_print (constraintTerm term);
 
-void arithType_print (arithType ar);
+cstring arithType_print (arithType ar);
 
-void constraintExpr_print (constraintExpr ex);
+cstring constraintExpr_print (constraintExpr ex);
 
-void constraint_print (constraint c);
+cstring constraint_print (constraint c);
 /*@=czechfcns*/
-//#warning take this out
+#warning take this out
 #include "constraintList.h"
 
+#include "constraintTerm.h"
 
 
 
index 4160a455d47b5c9478751c5e792719ebffa8d227..c4740c8e658be35dae8d7ee91417d241cbeab8d2 100644 (file)
@@ -25,11 +25,18 @@ abst_typedef struct _constraintList
 extern /*@only@*/ constraintList constraintList_new(void);
 extern constraintList constraintList_add (/*@returned@*/ constraintList p_s, /*@only@*/ constraint p_el) ;
 
+extern constraintList constraintList_addList (/*@returned@*/ constraintList s, /*@only@*/constraintList new);
+
+
 extern constraintList constraintList_copy (constraintList p_s);
 
 //extern /*@only@*/ cstring constraintList_unparse (constraintList p_s) ;
 extern void constraintList_free (/*@only@*/ constraintList p_s) ;
 
+
+extern constraintList constraintList_copy (constraintList s);
+
+extern cstring constraintList_print (constraintList s);
 /*@constant int constraintListBASESIZE;@*/
 # define constraintListBASESIZE SMALLBASESIZE
 
diff --git a/src/Headers/constraintTerm.h b/src/Headers/constraintTerm.h
new file mode 100644 (file)
index 0000000..be1c39e
--- /dev/null
@@ -0,0 +1,24 @@
+
+constraintTerm constraintTerm_copy (constraintTerm term);
+
+constraintTerm exprNode_makeConstraintTerm (/*@only@*/ exprNode e);
+
+constraintTerm constraintTerm_makeMaxSetexpr (exprNode e);
+
+constraintTerm constraintTerm_makeMinSetexpr (exprNode e);
+
+constraintTerm constraintTerm_makeMaxReadexpr (exprNode e);
+
+constraintTerm constraintTerm_makeMinReadexpr (exprNode e);
+
+constraintTerm constraintTerm_makeValueexpr (exprNode e);
+
+constraintTerm intLit_makeConstraintTerm (int i);
+
+constraintTerm constraintTerm_makeIntLitValue (int i);
+
+cstring  constraintType_print (constraintType constrType);
+
+cstring constraintTerm_print (constraintTerm term);
+
+
index 3f24b70f8365b719dc7880a3aac209b95dcfa48f..322def8063179f9d1b7ee29a7410192e576f9a34 100644 (file)
@@ -160,7 +160,8 @@ struct _exprNode
   /*@relnull@*/ exprData edata;
   cstring etext;
   environmentTable environment;
-  constraintList constraints;
+  constraintList requiresConstraints;
+  constraintList ensuresConstraints;
 } ;
 
 /*@constant null exprNode exprNode_undefined; @*/
index d585e600e580ecfb5f75fcc2d4cb0808dc3ab787..a19b9467ad766868642fde45e539dbae5c08bd19 100644 (file)
@@ -4,4 +4,4 @@
 /*@constant observer char *LCL_PARSE_VERSION;@*/
 # define LCL_PARSE_VERSION "LCLint 2.5q"
 /*@constant observer char *LCL_COMPILE;@*/
-# define LCL_COMPILE "Compiled using gcc -DSTDC_HEADERS=1 -g on FreeBSD shankly.cs.virginia.edu 3.2-RELEASE FreeBSD 3.2-RELEASE #0: Tue May 18 04:05:08 GMT 1999 jkh@cathair:/usr/src/sys/compile/GENERIC i386 by drl7x"
+# define LCL_COMPILE "Compiled using gcc -DSTDC_HEADERS=1 -g -Wall on SunOS cobra.cs.Virginia.EDU 5.6 Generic_105181-13 sun4u sparc SUNW,Ultra-60 by drl7x"
index d585e600e580ecfb5f75fcc2d4cb0808dc3ab787..a19b9467ad766868642fde45e539dbae5c08bd19 100644 (file)
@@ -4,4 +4,4 @@
 /*@constant observer char *LCL_PARSE_VERSION;@*/
 # define LCL_PARSE_VERSION "LCLint 2.5q"
 /*@constant observer char *LCL_COMPILE;@*/
-# define LCL_COMPILE "Compiled using gcc -DSTDC_HEADERS=1 -g on FreeBSD shankly.cs.virginia.edu 3.2-RELEASE FreeBSD 3.2-RELEASE #0: Tue May 18 04:05:08 GMT 1999 jkh@cathair:/usr/src/sys/compile/GENERIC i386 by drl7x"
+# define LCL_COMPILE "Compiled using gcc -DSTDC_HEADERS=1 -g -Wall on SunOS cobra.cs.Virginia.EDU 5.6 Generic_105181-13 sun4u sparc SUNW,Ultra-60 by drl7x"
index c250c75b87a55ad680bf842299529487917763b8..b0b258fc7c7c9ac6a5636b0f34af915a9a736d7f 100644 (file)
@@ -404,7 +404,6 @@ extern void usymtab_checkDistinctName (uentry p_e, int p_scope)
 
 
   /*DRL add 9/4/00 */
-extern 
 extern void usymtab_testInRange (sRef p_s, int p_index)  /*@modifies internalState;@*/;
 extern void usymtab_postopVar (sRef p_sr) /*@modifies internalState;@*/ ;
 
index 345cf05b6ed3a1b6d16654f6687823ec0a0dac00..7e8cf283c0fa887394ec6a7c204f4fa9db14c582 100644 (file)
@@ -26,6 +26,8 @@ GRAMSRC    = cgrammar.c cscanner.c
 GENERALSRC = cstring.c fileloc.c message.c source.c \
     fileTable.c hashTable.c llerror.c messageLog.c \
     constraint.c \
+    constraintTerm.c \
+    constraintResolve.c \
     environmentTable.c \
     constraintList.c \
     constraintGeneration.c \
index df50147eac4c72721d0a89d81a0e8fc800db5a8c..62f00e2f9d0e541bb1cba642d8437e17490ed9f8 100644 (file)
@@ -2528,7 +2528,7 @@ static const short yycheck[] = {     0,
     -1,    -1,   185
 };
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
-#line 3 "/usr/share/misc/bison.simple"
+#line 3 "/gnu/share/bison.simple"
 
 /* Skeleton output parser for bison,
    Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
@@ -2721,7 +2721,7 @@ __yy_memcpy (char *to, char *from, int count)
 #endif
 #endif
 \f
-#line 196 "/usr/share/misc/bison.simple"
+#line 196 "/gnu/share/bison.simple"
 
 /* The user can define YYPARSE_PARAM as the name of an argument to be passed
    into yyparse.  The argument should have type void *.
@@ -5275,7 +5275,7 @@ case 632:
     break;}
 }
    /* the action file gets copied in in place of this dollarsign */
-#line 498 "/usr/share/misc/bison.simple"
+#line 498 "/gnu/share/bison.simple"
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
index 45d5a79a5cc2d54b1e30c77cd0425dde18110f2d..f6090836e3487ad148b6314ef69d3cb32822083e 100644 (file)
 /*@-fcnuse*/
 /*@-assignexpose*/
 
+/*@notnull@*/ 
+/*@special@*/ constraint constraint_makeNew (void)
+     /*@post:isnull result->term, result->expr, result->constrType@*/
+     /*@defines result->ar, result->post@*/;
+
 constraint constraint_copy (constraint c)
 {
   constraint ret;
   ret = constraint_makeNew();
-  ret->c1 = c->c1;
-  ret->t1 = c->t1;
+  ret->lexpr = c->lexpr;
   ret->ar = c->ar;
-  ret->e1 = c->e1;
+  ret->expr = c->expr;
   ret->post = c->post;
   return ret;
 }
@@ -36,352 +40,322 @@ bool constraint_resolve (/*@unused@*/ constraint c)
 
 /*@notnull@*/ 
 /*@special@*/ constraint constraint_makeNew (void)
-     /*@post:isnull result->t1, result->e1, result->c1@*/
+     /*@post:isnull result->term, result->expr, result->constrType@*/
      /*@defines result->ar, result->post@*/
 {
   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;
 }
 /*@-czechfcns@*/
+constraintExpr constraintExpr_alloc ()
+{
+  constraintExpr ret;
+  ret = dmalloc (sizeof (*ret) );
+  ret->term = NULL;
+  ret->expr = NULL;
+  ret->op = PLUS;
+  return ret;
+}
 
-/*@out@*/ constraintTerm new_constraintTermExpr (void)
+constraintExpr constraintExpr_copy (constraintExpr expr)
 {
-  constraintTerm ret;
-  ret = dmalloc (sizeof (* ret ) );
+  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);
+    }
+  else
+    {
+      ret->expr = NULL;
+    }
   
+}
+
+constraintExpr constraintExpr_makeMaxSetExpr (exprNode expr)
+{
+  constraintExpr ret;
+  ret = constraintExpr_alloc();
+  ret->term = constraintTerm_makeMaxSetexpr(expr);
   return ret;
 }
 
-constraintTerm exprNode_makeConstraintTerm (/*@only@*/ exprNode e)
+constraintExpr  constraintExpr_makeMaxReadExpr (exprNode expr)
 {
-  constraintTerm ret = new_constraintTermExpr();
-  ret->loc =  exprNode_getfileloc(e);
-  ret->value.expr = e;
-  ret->kind = EXPRNODE;
+  constraintExpr ret;
+  ret = constraintExpr_alloc();
+  ret->term = constraintTerm_makeMaxReadexpr(expr);
   return ret;
 }
 
+constraintExpr  constraintExpr_makeMinSetExpr (exprNode expr)
+{
+  constraintExpr ret;
+  ret = constraintExpr_alloc();
+  ret->term = constraintTerm_makeMinSetexpr(expr);
+  return ret;
+}
 
-constraintTerm intLit_makeConstraintTerm (int i)
+constraintExpr  constraintExpr_makeMinReadExpr (exprNode expr)
 {
-  constraintTerm ret = new_constraintTermExpr();
-  ret->value.intlit = i;
-  ret->kind = INTLITERAL;
-  ret->loc =  fileloc_undefined;
+  constraintExpr ret;
+  ret = constraintExpr_alloc();
+  ret->term = constraintTerm_makeMinReadexpr(expr);
   return ret;
 }
-     
 
-/*@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 constraintExpr_makeValueExpr (exprNode expr)
 {
   constraintExpr ret;
-  ret = dmalloc (sizeof (*ret) );
-  ret->t1 = term;
-  ret->e1 = NULL;
-  ret->c1 = UNDEFINED;
-  ret->op = PLUS;
+  ret = constraintExpr_alloc();
+  ret->term = constraintTerm_makeValueexpr(expr);
   return ret;
 }
 
 
- constraintExpr makeConstraintExprIntlit (int i)
+constraintExpr makeConstraintExprIntlit (int i)
 {
   constraintExpr ret;
   ret = dmalloc (sizeof (*ret) );
-  ret->t1 = intLit_makeConstraintTerm (i);
-  ret->e1 = NULL;
-  ret->c1 = VALUE;
+  ret->term = constraintTerm_makeIntLitValue(i);
+  ret->expr = NULL;
   ret->op = PLUS;
   /*@i1*/ return ret;
 }
 
-                                      
-/*@i33*/
-/*@null@*/ constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
-{
-  constraint ret = constraint_makeNew();
-  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->ar = GTE;
 
-  term = exprNode_makeConstraintTerm (ind);
-  
-  ret->e1 =  makeConstraintExpr (term);
-  ret->e1->c1 = VALUE;
-  /*@i1*/return ret;
+constraintExpr constraintExpr_makeValueInt (int i)
+{
+  return makeConstraintExprIntlit(i);
 }
 
 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->lexpr =constraintExpr_makeMaxSetExpr(po);
   ret->ar = GTE;
-
-  term = exprNode_makeConstraintTerm(ind);
-  
-  ret->e1 =  makeConstraintExpr (term);
-  ret->e1->c1 = VALUE;
+  ret->expr =  constraintExpr_makeValueExpr (ind);
   /*@i1*/return ret;
 }
+                                      
+constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
+{
+  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;
+}
 
-
-constraint constraint_makeReadSafeInt (exprNode t1, int index)
+constraint constraint_makeWriteSafeInt (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->lexpr =constraintExpr_makeMaxSetExpr(po);
   ret->ar = GTE;
-  ret->post = TRUE;
-  term = intLit_makeConstraintTerm(index);
-  
-  ret->e1 =  makeConstraintExpr (term);
-  ret->e1->c1 = VALUE;
-  /*make this refer to element after preconditions */
-  fileloc_incColumn (ret->t1->loc);
-  /*@i1*/ return ret;
+  ret->expr =  constraintExpr_makeValueInt (ind);
+  /*@i1*/return ret;
 }
+                                      
+constraint constraint_makeReadSafeInt ( exprNode po, int ind)
+{
+  constraint ret = constraint_makeNew();
 
+  po = exprNode_fakeCopy(po);
+  
+  ret->lexpr = constraintExpr_makeMaxReadExpr(po);
+  ret->ar    = GTE;
+  ret->expr  = constraintExpr_makeValueInt (ind);
+  return ret;
+}
 
-constraint constraint_makeEnsureMaxReadAtLeast (exprNode t1, exprNode t2, fileloc sequencePoint)
+constraint constraint_makeEnsureMaxReadAtLeast (exprNode e1, exprNode t2, fileloc sequencePoint)
 {
   constraint ret = constraint_makeNew();
   constraintTerm term;
 
-  t1 = exprNode_fakeCopy (t1);
+  e1 = exprNode_fakeCopy (e1);
   t2 = exprNode_fakeCopy (t2);
   
-  ret->t1 = exprNode_makeConstraintTerm(t1);
-
-  if (ret->t1->loc != NULL)
-    fileloc_free(ret->t1->loc);
+  ret = constraint_makeReadSafeExprNode(e1, t2);
+  if (ret->lexpr->term->loc != NULL) 
+    fileloc_free(ret->lexpr->term->loc);
   
-  ret->t1->loc = fileloc_copy (sequencePoint);
-  ret->c1 = MAXREAD;
-  ret->ar = GTE;
+  ret->lexpr->term->loc = fileloc_copy (sequencePoint);
   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)
 {
   constraint ret = constraint_makeNew();
   constraintTerm term;
+  po = exprNode_fakeCopy(po);
+  ind = exprNode_fakeCopy(ind);
 
-  po = exprNode_fakeCopy (po);
-  ind = exprNode_fakeCopy (ind);
-  
-  ret->t1 = exprNode_makeConstraintTerm(po);
-  ret->c1 = MINREAD;
+  ret->lexpr = constraintExpr_makeMinReadExpr(po);
   ret->ar = LTE;
+  ret->expr = constraintExpr_makeValueExpr (ind);
   ret->post = TRUE;
-  term = exprNode_makeConstraintTerm (ind);
+
+  if (ret->lexpr->term->loc != NULL)
+    fileloc_free(ret->lexpr->term->loc);
   
-  ret->e1 =  makeConstraintExpr (term);
-  ret->e1->c1 = VALUE;
+  ret->lexpr->term->loc = fileloc_copy (sequencePoint);
   /*make this refer to element after preconditions */
-  fileloc_incColumn (ret->t1->loc);
+  fileloc_incColumn (ret->lexpr->term->loc);
   /*@i1*/ return ret;
 }
 
-constraintExpr makePostOpInc (exprNode t1)
+constraintExpr makeMaxSetPostOpInc (exprNode e)
 {
   constraintExpr ret;
-  constraintTerm term;
-
-  t1 = exprNode_fakeCopy (t1);
-  term =   exprNode_makeConstraintTerm(t1);
-  ret = makeConstraintExpr (term);
-  ret->op = PLUS;
-  ret->c1 = VALUE;
-  ret->e1 =  makeConstraintExprIntlit (1);
+  ret = constraintExpr_makeValueExpr (e);
+  ret->term  = constraintTerm_makeMaxSetexpr (e);
+  ret->op = MINUS;
+  ret->expr =  makeConstraintExprIntlit (1);
   return ret;
 }
 
-constraint constraint_makeSideEffectPostIncrement (exprNode t1, fileloc sequencePoint)
+constraint constraint_makeMaxSetSideEffectPostIncrement (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_makeMaxSetExpr(e);
   ret->ar = EQ;
   ret->post = TRUE;
-  ret->e1 = makePostOpInc(t2);
+  ret->expr = makeMaxSetPostOpInc(e);
 
-  fileloc_incColumn (  ret->t1->loc);
-  fileloc_incColumn (  ret->t1->loc);
-  
-  /*@i6*/return ret;
+  fileloc_incColumn (  ret->lexpr->term->loc);
+  fileloc_incColumn (  ret->lexpr->term->loc);
+  return ret;
 }
 
-void constraintType_print (constraintType c1)
+constraintExpr makeMaxReadPostOpInc (exprNode e)
 {
-  switch (c1)
-    {
-    case VALUE:
-      printf("VALUE");
-      break;
-    case CALLSAFE:
-      printf("CALLSAFE");
-      break;
-    case  MAXSET:
-      printf ("MAXSET");
-      break;
-    case    MINSET:
-      printf ("MINSET");
-      break;
-    case MAXREAD:
-      printf ("MAXREAD");
-      break;
-    case MINREAD:
-      printf ("MINREAD");
-      break;
-    case NULLTERMINATED:
-      printf ("NULLTERMINATED");
-      break;
-    case UNDEFINED:
-      TPRINTF(("Unhandled value for constraintType"));
-      llassert(FALSE);
-      break;
-    default:
-      TPRINTF(("Unhandled value for constraintType"));
-      llassert(FALSE);
-    }
+  constraintExpr ret;
+  ret = constraintExpr_makeValueExpr (e);
+  ret->term  = constraintTerm_makeMaxReadexpr (e);
+  ret->op = MINUS;
+  ret->expr =  makeConstraintExprIntlit (1);
+  return ret;
 }
-void constraintTerm_print (constraintTerm term)
+
+constraint constraint_makeMaxReadSideEffectPostIncrement (exprNode e, fileloc sequencePoint)
 {
-  cstring s;
+  constraint ret = constraint_makeNew();
+  //constraintTerm term;
+  exprNode t2;
+  e = exprNode_fakeCopy(e);
+  ret->lexpr = constraintExpr_makeMaxReadExpr(e);
+  ret->ar = EQ;
+  ret->post = TRUE;
+  ret->expr = makeMaxReadPostOpInc(e);
 
-  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:
-    {
-      char * buf = malloc (15);
-      /*@i1*/snprintf (buf, 14, "intliteral(%d)", term->value.intlit);
-      /*@i1*/ printf(" %s  ", buf);
-      free (buf);
-      break;
-    }
-    case SREF:
-      TPRINTF( ("Not Implemented\n"));
-      llassert(FALSE);
-      break;
-    }
-    /*@-unreachable*/
-  return;
-  /*@=unreachable*/
+  fileloc_incColumn (  ret->lexpr->term->loc);
+  fileloc_incColumn (  ret->lexpr->term->loc);
+  return ret;
 }
 
-void arithType_print (arithType ar)
+
+cstring arithType_print (arithType ar)
 {
+  cstring st = cstring_undefined;
   switch (ar)
     {
     case LT:
-      printf(" <  ");
-      return;
+      st = cstring_makeLiteral (" < ");
+      break;
     case       LTE:
-      printf(" <= ");
-      return;
+      st = cstring_makeLiteral (" <= ");
+      break;
     case       GT:
-      printf(" >  ");
-      return;
+      st = cstring_makeLiteral (" > ");
+      break;
     case       GTE:
-      printf(" <= ");
-      return;
+      st = cstring_makeLiteral (" >= ");
+      break;
     case       EQ:
-      printf(" == ");
-      return;
+      st = cstring_makeLiteral (" == ");
+      break;
     case       NONNEGATIVE:
-      printf(" NONNEGATIVE ");
-      return;
+      st = cstring_makeLiteral (" NONNEGATIVE ");
+      break;
     case       POSITIVE:
-      printf(" POSITIVE ");
-      return;
+      st = cstring_makeLiteral (" POSITIVE ");
+      break;
     default:
       llassert(FALSE);
+      break;
     }
+  return st;
 }
 
-void constraintExpr_print (constraintExpr ex)
+cstring constraintExpr_print (constraintExpr ex)
 {
+  cstring st;
+  cstring opStr;
   llassert (ex != NULL);
-  constraintType_print (ex->c1 );
-  constraintTerm_print (ex->t1);
-  if (ex->e1 != NULL)
+
+  st = message ("%s",
+               constraintTerm_print (ex->term));
+  
+    if (ex->expr != NULL)
     {
       if (ex->op == PLUS)
        {
-         printf(" + ");
+        opStr = cstring_makeLiteral (" + ");
        }
       else
        {
-         printf (" - ");
+         opStr = cstring_makeLiteral (" - ");
        }
-      
-      constraintExpr_print (ex->e1);
+    st = message ("%s %s %s", st, opStr, constraintExpr_print (ex->expr) );
     }
-  
+  return st;
 }
 
 
-void constraint_print (constraint c)
+cstring  constraint_print (constraint c)
 {
+  cstring st = cstring_undefined;
+  cstring type = cstring_undefined;
+  llassert (c);
   if (c->post)
     {
-      printf("Ensures: ");
+      type = cstring_makeLiteral ("Ensures: ");
     }
   else
     {
-      printf("requires: ");
+      type = cstring_makeLiteral ("Requires: ");
     }
-  
-  constraintType_print (c->c1);
-  constraintTerm_print (c->t1);
-  arithType_print(c->ar);
-  constraintExpr_print(c->e1);
-  printf("\n");
+  st = message ("%s: %s %s %s",
+               type,
+               constraintExpr_print (c->lexpr),
+               arithType_print(c->ar),
+               constraintExpr_print(c->expr)
+               );
+  return st;
 }
 
 /*@=fcnuse*/
 /*@=assignexpose*/
 /*@=czechfcns@*/
-
index bfbe1fdb335f9039811d2dbd879eed40477b517a..e7f4f7b7e61c58e678ac0fb8f1d3ab2f711a4d70 100644 (file)
 void /*@alt bool@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e);
 static bool exprNode_handleError( exprNode p_e);
 
-static cstring exprNode_findConstraints ( exprNode p_e);
+//static cstring exprNode_findConstraints ( exprNode p_e);
 static bool exprNode_isMultiStatement(exprNode p_e);
 static bool exprNode_multiStatement (exprNode p_e);
 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv,  fileloc sequencePoint);
-static void exprNode_constraintPropagateUp (exprNode p_e);
+//static void exprNode_constraintPropagateUp (exprNode p_e);
+constraintList exprNode_traversRequiresConstraints (exprNode e);
+constraintList exprNode_traversEnsuresConstraints (exprNode e);
+void mergeResolve (exprNode parent, exprNode child1, exprNode child2);
 
 
+     
 bool exprNode_isUnhandled (exprNode e)
 {
   llassert( exprNode_isDefined(e) );
@@ -130,26 +134,35 @@ if (exprNode_handleError (e) != NULL)
 bool exprNode_stmt (exprNode e)
 {
   exprNode snode;
+  fileloc loc;
+  bool notError;
 
   if (exprNode_isError(e) )
     {
       return FALSE;
     }
+  e->requiresConstraints = constraintList_new();
+  e->ensuresConstraints  = constraintList_new();
   
-  TPRINTF(( "STMT:") );
-  TPRINTF ( ( cstring_toCharsSafe ( exprNode_unparse(e)) )
+  DPRINTF(( "STMT:") );
+  DPRINTF ( ( cstring_toCharsSafe ( exprNode_unparse(e)) )
           );
   if (e->kind != XPR_STMT)
     {
       
-      TPRINTF (("Not Stmt") );
+      DPRINTF (("Not Stmt") );
+      DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
       if (exprNode_isMultiStatement (e) )
        {
          return exprNode_multiStatement (e );
        }
       llassert(FALSE);
     }
-
+  DPRINTF (("Stmt") );
+  DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
+     
   snode = exprData_getUopNode (e->edata);
   
   /* could be stmt involving multiple statements:
@@ -161,25 +174,30 @@ bool exprNode_stmt (exprNode e)
       llassert(FALSE);
       return exprNode_multiStatement (snode);
     }
-  else
-    {
-      fileloc loc;
-      bool notError;
-      loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
-      notError = exprNode_exprTraverse (snode, FALSE, FALSE, loc);
-      llassert(notError);
-      fileloc_free (loc);
-      return notError;
-    }
+  
+  loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
+  notError = exprNode_exprTraverse (snode, FALSE, FALSE, loc);
+  e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
+  printf ("%s\n", constraintList_print(e->requiresConstraints) );
+  e->ensuresConstraints  = exprNode_traversEnsuresConstraints(snode);
+  printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
+  llassert(notError);
+  return notError;
+  
 }
 
 
 bool exprNode_stmtList  (exprNode e)
 {
+  exprNode stmt1, stmt2;
   if (exprNode_isError (e) )
     {
       return FALSE;
     }
+
+  e->requiresConstraints = constraintList_new();
+  e->ensuresConstraints  = constraintList_new();
+  
   /*Handle case of stmtList with only one statement:
    The parse tree stores this as stmt instead of stmtList*/
   if (e->kind != XPR_STMTLIST)
@@ -187,14 +205,25 @@ bool exprNode_stmtList  (exprNode e)
       return exprNode_stmt(e);
     }
   llassert (e->kind == XPR_STMTLIST);
-  TPRINTF(( "STMTLIST:") );
-  TPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
-  (void) exprNode_stmt (exprData_getPairA (e->edata));
-  TPRINTF(("\nstmt after stmtList call " ));
-  //  e->constraints = constraintList_exprNodemerge (exprData_getPairA (e->edata), exprData_getPairB (e->edata) );
-  return exprNode_stmt (exprData_getPairB (e->edata));
+  DPRINTF(( "STMTLIST:") );
+  DPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
+  stmt1 = exprData_getPairA (e->edata);
+  stmt2 = exprData_getPairB (e->edata);
+
+  
+  exprNode_stmt (stmt1);
+  DPRINTF(("\nstmt after stmtList call " ));
+
+  exprNode_stmt (stmt2);
+
+  mergeResolve (e, stmt1, stmt2 );
+  TPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
+                     constraintList_print(e->requiresConstraints),
+                     constraintList_print(e->ensuresConstraints) ) ) );
+  return TRUE;
 }
 
+
 bool exprNode_multiStatement (exprNode e)
 {
   
@@ -230,8 +259,8 @@ bool exprNode_multiStatement (exprNode e)
                     exprNode_generateConstraints (exprData_getTripleInc (data));
       break;
     case XPR_IF:
-      TPRINTF(( "IF:") );
-      TPRINTF ((exprNode_unparse(e) ) );
+      DPRINTF(( "IF:") );
+      DPRINTF ((exprNode_unparse(e) ) );
       //      ret = message ("if (%s) %s", 
                     exprNode_generateConstraints (exprData_getPairA (data));
                     exprNode_generateConstraints (exprData_getPairB (data));
@@ -266,7 +295,9 @@ bool exprNode_multiStatement (exprNode e)
     case XPR_BLOCK:
       //      ret = message ("{ %s }",
                     exprNode_generateConstraints (exprData_getSingle (data));
-      e->constraints = (exprData_getSingle (data))->constraints;
+                    e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
+                    e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
+                    //      e->constraints = (exprData_getSingle (data))->constraints;
       break;
 
     case XPR_STMT:
@@ -281,26 +312,19 @@ bool exprNode_multiStatement (exprNode e)
 }
 
 
-/*  void upwrap (exprNode e) */
-/*  { */
-/*    printf ("in upwrap with e = %X\n" , e); */
-/*    printf ("%s\n", exprNode_unparse (e)   );  */
-/*  } */
-
-
-
 bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv,  fileloc sequencePoint)
 {
   exprNode t1, t2;
 
   bool handledExprNode;
-  char * mes;
   exprData data;
-  constraintExpr tmp;
   constraint cons;
   
    DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
                    fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
+
+   e->requiresConstraints = constraintList_new();
+   e->ensuresConstraints = constraintList_new();
    
    if (exprNode_handleError (e))
      {
@@ -316,41 +340,29 @@ bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv,  filel
       
     case XPR_FETCH:
 
-      /*
-       Make sure these are right!
-       
-       if (rvalue)
-          valueOf (index) <= maxRead (array)
-          valueOf (index) >= minRead (array)
-          else   lvalue 
-                   valueOf (index) <= maxSet (array)
-                   valueOf (index) >= minSet (array)
-      */
       if (definatelv )
        {
          t1 =  (exprData_getPairA (data) );
          t2 =  (exprData_getPairB (data) );
-       cons =  constraint_makeWriteSafeExprNode (t1, t2);
+         cons =  constraint_makeWriteSafeExprNode (t1, t2);
        }
       else 
        {
          t1 =  (exprData_getPairA (data) );
          t2 =  (exprData_getPairB (data) );
-        cons = constraint_makeReadSafeExprNode (t1, t2 );
+         cons = constraint_makeReadSafeExprNode (t1, t2 );
        }
-      e->constraints = constraintList_add(e->constraints, cons);
-      constraint_print (cons);
+      
+      e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
       cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
-      constraint_print (cons);
+      e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
       cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
-      constraint_print (cons);
-      
+      e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
+       
       exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
       exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
       
             /*@i325 Should check which is array/index. */
-      
-
       break;
     case XPR_PREOP: 
       t1 = exprData_getUopNode(data);
@@ -363,33 +375,37 @@ bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv,  filel
        {
          if (definatelv)
            {
-             printf ("Requires maxs(%s) > %d \n", exprNode_unparse (exprData_getUopNode (data) ), 0 );
+             cons = constraint_makeWriteSafeInt (t1, 0);
            }
          else
            {
              cons = constraint_makeReadSafeInt (t1, 0);
-             constraint_print(cons);
            }
+             e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
+       }
+      if (lltok_isInc_Op (exprData_getUopTok (data) ) )
+       {
+         //      cons = constraint_makeSideEffectPostIncrement (t1, sequencePoint);
+         // e->ensuresConstraints = constraintList_add(e->requiresConstraints, cons);
        }
-      
       break;
       
     case XPR_PARENS: 
       exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
-       e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
+      //    e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
       break;
     case XPR_ASSIGN:
       exprNode_exprTraverse (exprData_getOpA (data), TRUE, definaterv, sequencePoint ); 
       lltok_unparse (exprData_getOpTok (data));
       exprNode_exprTraverse (exprData_getOpB (data), definatelv, TRUE, sequencePoint );
-      e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data) );
+      //  e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data) );
       break;
     case XPR_OP:
       exprNode_exprTraverse (exprData_getOpA (data), definatelv, definaterv, sequencePoint );
       lltok_unparse (exprData_getOpTok (data));
       exprNode_exprTraverse (exprData_getOpB  (data), definatelv, definaterv, sequencePoint );
       
-      e->constraints  = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
+      //      e->constraints  = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
       break;
     case XPR_SIZEOFT:
       ctype_unparse (qtype_getType (exprData_getType (data) ) );
@@ -398,7 +414,7 @@ bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv,  filel
       
     case XPR_SIZEOF:
       exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
-      e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
+      //      e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
       break;
       
     case XPR_CALL:
@@ -437,13 +453,14 @@ bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv,  filel
       
       exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
       lltok_unparse (exprData_getUopTok (data));
-      e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
       if (lltok_isInc_Op (exprData_getUopTok (data) ) )
        {
+         TPRINTF(("doing ++"));
          t1 = exprData_getUopNode (data);
-         cons = constraint_makeSideEffectPostIncrement (t1, sequencePoint );
-         constraint_print (cons);
-         // printf("Side Effect: %s = (%s)0 +1 ", exprNode_unparse (exprData_getUopNode (data) ), exprNode_unparse (exprData_getUopNode(data) ) );
+         cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
+         e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
+         cons = constraint_makeMaxReadSideEffectPostIncrement (t1, sequencePoint );
+         e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
        }
       break;
     default:
@@ -453,220 +470,272 @@ bool exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv,  filel
   return handledExprNode; 
 }
 
-/*  void exprNode_constraintPropagateUp (exprNode e) */
-/*  { */
-
-/*     cstring ret; */
-/*    exprData data; */
-
-/*    if (exprNode_handleError (e) ) */
-/*      { */
-/*        return; */
-/*      } */
-
-/*    data = e->edata; */
-
-/*    switch (e->kind) */
-/*      { */
-/*      case XPR_PARENS:  */
-/*        e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined); */
-/*        break; */
-/*      case XPR_ASSIGN: */
-/*        e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data) ); */
-/*        break; */
-/*      case XPR_CALL: */
-/*        //      e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT,  CALLSAFE ) ); */
-/*        break; */
-/*      case XPR_INITBLOCK: */
-/*        //("{ %q }"  */
-/*        exprNodeList_unparse (exprData_getArgs (data) ); */
-/*     //       e->constraints = constraintList_exprNodemerge (exprData_getArgs (data), exprData_getOpB (data) ); */
-/*        break; */
-/*      case XPR_OP: */
-/*        //   ret = message ("%s %s %s", */
-/*                  exprNode_generateConstraints (exprData_getOpA (data)),  */
-/*                  lltok_unparse (exprData_getOpTok (data)), */
-/*                          exprNode_generateConstraints (exprData_getOpB (data))); */
-/*        e->constraints  = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data); */
-/*        break; */
-/*      case XPR_ALIGNOF: */
-/*           e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined); */
-/*        break; */
-      
-/*      case XPR_VAARG: */
-/*            e->constraints = constraintList_exprNodemerge (exprData_getCastNode (data), exprNode_undefined); */
-/*        break; */
-      
-/*      case XPR_ITERCALL: */
-/*        //    ret = message ("%q(%q)",  */
-/*        //        uentry_getName (exprData_getIterCallIter (data)), */
-/*        //        exprNodeList_unparse (exprData_getIterCallArgs (data))); */
-/*        ////      e->constraints = constraintList_exprNodemerge (exprData_getIterCallArgs (data), exprNode_undefined); */
-/*        break; */
-/*      case XPR_ITER: */
-/*        DPRINTF(("XPR_ITER NOT IMPLEMENTED" )); */
-/*     //    ret = message ("%q(%q) %s %q",  */
-/*  //                      uentry_getName (exprData_getIterSname (data)), */
-/*  //                      exprNodeList_unparse (exprData_getIterAlist (data)), */
-/*  //                      exprNode_generateConstraints (exprData_getIterBody (data)), */
-/*  //                      uentry_getName (exprData_getIterEname (data))); */
-/*        break; */
-/*      case XPR_CAST: */
-/*        e->constraints = constraintList_exprNodemerge (exprData_getCastNode (data), exprNode_undefined); */
-/*        break; */
-
-/*      default: */
-/*        DPRINTF(("NOT Currently IMplemented")); */
-/*      } */
-/*  } */
-
-/*  //Not used below */
-      
-/*     case XPR_FOR: */
-/*       ret = message ("%s %s",  */
-/*                  exprNode_generateConstraints (exprData_getPairA (data)),  */
-/*                  exprNode_generateConstraints (exprData_getPairB (data))); */
-/*       break; */
-
-/*     case XPR_FORPRED: */
-/*             ret = message ("for (%s; %s; %s)", */
-/*                  exprNode_generateConstraints (exprData_getTripleInit (data)), */
-/*                  exprNode_generateConstraints (exprData_getTripleTest (data)), */
-/*                  exprNode_generateConstraints (exprData_getTripleInc (data))); */
-/*       break; */
-      
-/*     case XPR_GOTO: */
-/*       ret = message ("goto %s", exprData_getLiteral (data)); */
-/*       break; */
-
-/*     case XPR_CONTINUE: */
-/*       ret = cstring_makeLiteral ("continue"); */
-/*       break; */
-
-/*     case XPR_BREAK: */
-/*       ret = cstring_makeLiteral ("break"); */
-/*       break; */
-
-/*     case XPR_RETURN: */
-/*       ret = message ("return %s", exprNode_generateConstraints (exprData_getSingle (data))); */
-/*       break; */
-
-/*     case XPR_NULLRETURN: */
-/*       ret = cstring_makeLiteral ("return"); */
-/*       break; */
-
-/*     case XPR_COMMA: */
-/*       ret = message ("%s, %s",  */
-/*                  exprNode_generateConstraints (exprData_getPairA (data)), */
-/*                  exprNode_generateConstraints (exprData_getPairB (data))); */
-/*       break; */
-      
-/*     case XPR_COND: */
-/*       ret = message ("%s ? %s : %s", */
-/*                  exprNode_generateConstraints (exprData_getTriplePred (data)), */
-/*                  exprNode_generateConstraints (exprData_getTripleTrue (data)), */
-/*                  exprNode_generateConstraints (exprData_getTripleFalse (data))); */
-/*       break; */
-/*     case XPR_IF: */
-/*       ret = message ("if (%s) %s",  */
-/*                  exprNode_generateConstraints (exprData_getPairA (data)), */
-/*                  exprNode_generateConstraints (exprData_getPairB (data))); */
-/*       e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data)); */
-/*       break; */
-      
-/*     case XPR_IFELSE: */
-/*       ret = message ("if (%s) %s else %s", */
-/*                  exprNode_generateConstraints (exprData_getTriplePred (data)), */
-/*                  exprNode_generateConstraints (exprData_getTripleTrue (data)), */
-/*                  exprNode_generateConstraints (exprData_getTripleFalse (data))); */
-/*       break; */
-/*     case XPR_WHILE: */
-/*       ret = message ("while (%s) %s", */
-/*                  exprNode_generateConstraints (exprData_getPairA (data)), */
-/*                  exprNode_generateConstraints (exprData_getPairB (data))); */
-/*       e->constraints = constraintList_exprNodemerge (exprData_getPairA (data), exprData_getPairB (data) ); */
-/*       break; */
-
-/*     case XPR_WHILEPRED: */
-/*       ret = cstring_copy (exprNode_generateConstraints (exprData_getSingle (data))); */
-/*       break; */
-
-/*     case XPR_TOK: */
-/*       ret = cstring_copy (lltok_unparse (exprData_getTok (data))); */
-/*       break; */
-
-/*     case XPR_DOWHILE: */
-/*       ret = message ("do { %s } while (%s)", */
-/*                  exprNode_generateConstraints (exprData_getPairB (data)), */
-/*                  exprNode_generateConstraints (exprData_getPairA (data))); */
-/*       break; */
-      
-/*     case XPR_BLOCK: */
-/*       ret = message ("{ %s }", exprNode_generateConstraints (exprData_getSingle (data))); */
-/*       e->constraints = (exprData_getSingle (data))->constraints; */
-/*       break; */
-
-/*     case XPR_STMT: */
-/*       ret = cstring_copy (exprNode_generateConstraints (exprData_getSingle (data))); */
-/*       e->constraints = (exprData_getSingle (data))->constraints; */
-/*       break; */
-
-/*     case XPR_STMTLIST: */
-/*       ret = message ("%s; %s",  */
-/*                  exprNode_generateConstraints (exprData_getPairA (data)), */
-/*                  exprNode_generateConstraints (exprData_getPairB (data))); */
-/*       e->constraints = constraintList_exprNodemerge (exprData_getPairA (data), exprData_getPairB (data) ); */
-/*       break; */
-      
-/*     case XPR_FTDEFAULT: */
-/*     case XPR_DEFAULT: */
-/*       ret = cstring_makeLiteral ("default:"); */
-/*       break; */
-
-/*     case XPR_SWITCH: */
-/*       ret = message ("switch (%s) %s",  */
-/*                  exprNode_generateConstraints (exprData_getPairA (data)), */
-/*                  exprNode_generateConstraints (exprData_getPairB (data))); */
-/*       break; */
-
-/*     case XPR_FTCASE: */
-/*     case XPR_CASE: */
-/*       ret = message ("case %s:",  */
-/*                  exprNode_generateConstraints (exprData_getSingle (data))); */
-/*       break; */
-      
-/*     case XPR_INIT: */
-/*       ret = message ("%s = %s", */
-/*                  idDecl_getName (exprData_getInitId (data)), */
-/*                  exprNode_generateConstraints (exprData_getInitNode (data))); */
-/*       break; */
-      
-/*     case XPR_FACCESS: */
-/*       ret = message ("%s.%s", */
-/*                  exprNode_generateConstraints (exprData_getFieldNode (data)), */
-/*                  exprData_getFieldName (data)); */
-/*       break; */
-      
-/*     case XPR_ARROW: */
-/*             ret = message ("%s->%s", */
-/*                  exprNode_generateConstraints (exprData_getFieldNode (data)), */
-/*                  exprData_getFieldName (data)); */
-/*       break; */
-
-/*     case XPR_STRINGLITERAL: */
-/*       ret = cstring_copy (exprData_getLiteral (data)); */
-/*       break; */
-
-/*     case XPR_NUMLIT: */
-/*       ret = cstring_copy (exprData_getLiteral (data)); */
-/*       break; */
-
-/*     case XPR_NODE: */
-/*       ret = cstring_makeLiteral ("<node>"); */
-/*       break; */
-/*     } */
-
-/*   return ret;  */
-/* } */
+/* walk down the tree and get all requires Constraints in each subexpression*/
+constraintList exprNode_traversRequiresConstraints (exprNode e)
+{
+  //  exprNode t1, t2;
+
+  bool handledExprNode;
+  //  char * mes;
+  exprData data;
+  constraintList ret;
+  ret = constraintList_copy (e->requiresConstraints );
+   if (exprNode_handleError (e))
+     {
+       return ret;
+     }
+   
+   handledExprNode = TRUE;
+   
+  data = e->edata;
+  
+  switch (e->kind)
+    {
+      
+    case XPR_FETCH:
+      
+      ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getPairA (data) ) );
+        
+      ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getPairB (data) ) );
+      break;
+    case XPR_PREOP:
+          
+      ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getUopNode (data) ) );
+      break;
+      
+    case XPR_PARENS: 
+      ret = constraintList_addList (ret, exprNode_traversRequiresConstraints
+                                   (exprData_getUopNode (data) ) );
+      break;
+    case XPR_ASSIGN:
+        ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getOpA (data) ) );
+        
+       ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getOpB (data) ) );
+       break;
+    case XPR_OP:
+       ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getOpA (data) ) );
+        
+       ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getOpB (data) ) );
+       break;
+    case XPR_SIZEOFT:
+      
+      //      ctype_unparse (qtype_getType (exprData_getType (data) ) );
+      
+      break;
+      
+    case XPR_SIZEOF:
+          
+       ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                    (exprData_getSingle (data) ) );
+       break;
+      
+    case XPR_CALL:
+      ret = constraintList_addList (ret,
+                                    exprNode_traversRequiresConstraints
+                                   (exprData_getFcn (data) ) );
+      /*@i11*/      //   exprNodeList_unparse (exprData_getArgs (data) );
+         break;
+      
+    case XPR_RETURN:
+      ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getSingle (data) ) );
+      break;
+  
+    case XPR_NULLRETURN:
+      //      cstring_makeLiteral ("return");;
+      break;
+            
+    case XPR_FACCESS:
+          ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getFieldNode (data) ) );
+       //exprData_getFieldName (data) ;
+      break;
+   
+    case XPR_ARROW:
+        ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getFieldNode (data) ) );
+       //      exprData_getFieldName (data);
+      break;
+   
+    case XPR_STRINGLITERAL:
+      //      cstring_copy (exprData_getLiteral (data));
+      break;
+      
+    case XPR_NUMLIT:
+      //      cstring_copy (exprData_getLiteral (data));
+      break;
+    case XPR_POSTOP:
+
+           ret = constraintList_addList (ret,
+                                   exprNode_traversRequiresConstraints
+                                   (exprData_getUopNode (data) ) );
+          break;
+    default:
+      break;
+    }
+
+  return ret;
+}
+
+
+/* walk down the tree and get all Ensures Constraints in each subexpression*/
+constraintList exprNode_traversEnsuresConstraints (exprNode e)
+{
+  //  exprNode t1, t2;
+
+  bool handledExprNode;
+  //  char * mes;
+  exprData data;
+  //  constraintExpr tmp;
+  //  constraint cons;
+  constraintList ret;
+  ret = constraintList_copy (e->ensuresConstraints );
+   if (exprNode_handleError (e))
+     {
+       return ret;
+     }
+   
+   handledExprNode = TRUE;
+   
+  data = e->edata;
+
+  DPRINTF( (message (
+                    "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
+                    exprNode_unparse (e),
+                    constraintList_print(e->ensuresConstraints)
+                    )
+           ));
+  
+  
+  switch (e->kind)
+    {
+      
+    case XPR_FETCH:
+      
+      ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getPairA (data) ) );
+        
+      ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getPairB (data) ) );
+      break;
+    case XPR_PREOP:
+          
+      ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getUopNode (data) ) );
+      break;
+      
+    case XPR_PARENS: 
+      ret = constraintList_addList (ret, exprNode_traversEnsuresConstraints
+                                   (exprData_getUopNode (data) ) );
+      break;
+    case XPR_ASSIGN:
+        ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getOpA (data) ) );
+        
+       ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getOpB (data) ) );
+       break;
+    case XPR_OP:
+       ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getOpA (data) ) );
+        
+       ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getOpB (data) ) );
+       break;
+    case XPR_SIZEOFT:
+      
+      //      ctype_unparse (qtype_getType (exprData_getType (data) ) );
+      
+      break;
+      
+    case XPR_SIZEOF:
+          
+       ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                    (exprData_getSingle (data) ) );
+       break;
+      
+    case XPR_CALL:
+      ret = constraintList_addList (ret,
+                                    exprNode_traversEnsuresConstraints
+                                   (exprData_getFcn (data) ) );
+      /*@i11*/      //   exprNodeList_unparse (exprData_getArgs (data) );
+         break;
+      
+    case XPR_RETURN:
+      ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getSingle (data) ) );
+      break;
+  
+    case XPR_NULLRETURN:
+      //      cstring_makeLiteral ("return");;
+      break;
+            
+    case XPR_FACCESS:
+          ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getFieldNode (data) ) );
+       //exprData_getFieldName (data) ;
+      break;
+   
+    case XPR_ARROW:
+        ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getFieldNode (data) ) );
+       //      exprData_getFieldName (data);
+      break;
+   
+    case XPR_STRINGLITERAL:
+      //      cstring_copy (exprData_getLiteral (data));
+      break;
+      
+    case XPR_NUMLIT:
+      //      cstring_copy (exprData_getLiteral (data));
+      break;
+    case XPR_POSTOP:
+
+           ret = constraintList_addList (ret,
+                                   exprNode_traversEnsuresConstraints
+                                   (exprData_getUopNode (data) ) );
+          break;
+    default:
+      break;
+    }
+DPRINTF( (message (
+                    "exprnode_traversEnsuresConstraints call for %s with constraintList of  is returning %s",
+                    exprNode_unparse (e),
+            //              constraintList_print(e->ensuresConstraints),
+                    constraintList_print(ret)
+                    )
+           ));
+  
+
+  return ret;
+}
+
index 427638acc527112bdd00b8679c0372571534cbde..88488b6ab350eaef5aed8542e9ece51acd9269f1 100644 (file)
@@ -63,7 +63,7 @@ constraintList_grow (constraintList s)
   s->elements = newelements;
 }
 
-constraintList_exprNodemerge()
+void constraintList_exprNodemerge()
 {
 }
 constraintList 
@@ -78,41 +78,47 @@ constraintList_add (constraintList s, constraint el)
   return s;
 }
 
-/*  cstring */
-/*  constraintList_unparse (constraintList s) */
-/*  { */
-/*    int i; */
-/*    cstring st = cstring_undefined; */
-/*    bool first = TRUE; */
-
-/*    for (i = 0; i < s->nelements; i++) */
-/*      { */
-/*        cstring type = cstring_undefined; */
-/*        constraint current = s->elements[i]; */
-
-/*        if (current->isObj) */
-/*     { */
-/*       type = cstring_makeLiteral ("obj "); */
-/*     } */
-
-/*        if (current->type != NULL) */
-/*     { */
-/*       type = message (": %q%q", type, lclTypeSpecNode_unparse (current->type)); */
-/*     } */
-
-/*        if (first) */
-/*     { */
-/*       st = type; */
-/*       first = FALSE; */
-/*     } */
-/*        else */
-/*     { */
-/*       st = message ("%q, %q", st, type); */
-/*     } */
-/*      } */
-
-/*    return st; */
-/*  } */
+constraintList constraintList_addList (constraintList s, constraintList new)
+{
+  constraintList_elements(new, elem)
+    s = constraintList_add (s, elem);
+  end_constraintList_elements
+    return s;
+}
+
+cstring
+constraintList_print (constraintList s)
+{
+  int i;
+  cstring st = cstring_undefined;
+  bool first = TRUE;
+
+  if (s->nelements == 0)
+    st = cstring_makeLiteral("<List Empty>");
+  
+  for (i = 0; i < s->nelements; i++)
+    {
+      cstring type = cstring_undefined;
+      constraint current = s->elements[i];
+
+      if (current != NULL)
+       {
+         cstring temp1 = constraint_print(current);
+         type = message ("%q %q\n", type, temp1 );
+       }
+
+      if (first)
+       {
+         st = type;
+         first = FALSE;
+       }
+      else
+       {
+         st = message ("%q, %q", st, type);
+       }
+    }
+  return st;
+}
 
 void
 constraintList_free (constraintList s)
@@ -139,3 +145,5 @@ constraintList_copy (constraintList s)
 
   return ret;
 }
+
+
diff --git a/src/constraintList2.c b/src/constraintList2.c
new file mode 100644 (file)
index 0000000..0273d91
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+** LCLint - annotation-assisted static program checker
+** Copyright (C) 1994-2000 University of Virginia,
+**         Massachusetts Institute of Technology
+**
+** This program is free software; you can redistribute it and/or modify it
+** under the terms of the GNU General Public License as published by the
+** Free Software Foundation; either version 2 of the License, or (at your
+** option) any later version.
+** 
+** This program is distributed in the hope that it will be useful, but
+** WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** General Public License for more details.
+** 
+** The GNU General Public License is available from http://www.gnu.org/ or
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+** MA 02111-1307, USA.
+**
+** For information on lclint: lclint-request@cs.virginia.edu
+** To report a bug: lclint-bug@cs.virginia.edu
+** For more information: http://lclint.cs.virginia.edu
+*/
+/*
+** termNodeList.c
+**
+** based on list_template.c
+**
+** where T has T_equal (or change this) and T_unparse
+*/
+
+# include "lclintMacros.nf"
+# include "llbasic.h"
+
+constraintList constraintList_new ()
+{
+  constraintList s = (constraintList) dmalloc (sizeof (*s));
+  
+  s->nelements = 0;
+  s->nspacelow = constraintListGROWLOW;
+  s->nspacehigh = constraintListGROWHI;
+  s->elementsroot = (constraint *) dmalloc (sizeof (*s->elements) * (s->nspacelow + s->nspacehigh));
+  s->elements = s->elementsroot + constraintListGROWLOW;
+  s->current = 0;
+
+  return (s);
+}
+
+static void
+constraintList_grow (constraintList s)
+{
+  int i;
+  constraint *newelements = (constraint *) dmalloc (sizeof (*newelements)
+                                               * (s->nelements + constraintListBASESIZE));
+
+  for (i = 0; i < s->nelements; i++)
+    {
+      newelements[i + constraintListGROWLOW] = s->elements[i];
+    }
+  
+  sfree (s->elementsroot);
+
+  s->nspacelow = constraintListGROWLOW;
+  s->nspacehigh = constraintListGROWHI; 
+
+  s->elementsroot = newelements;
+  s->elements = s->elementsroot + s->nspacelow;
+}
+
+void 
+constraintList_addh (constraintList s, constraint el)
+{
+  llassert (constraintListGROWHI > 0);
+
+  if (s->nspacehigh <= 0)
+    constraintList_grow (s);
+
+  s->nspacehigh--;
+  s->elements[s->nelements] = el;
+  s->nelements++;
+}
+
+constraintList 
+constraintList_push (constraintList s, constraint el)
+{
+  constraintList_addh (s, el);
+  return s;
+}
+
+void constraintList_insertList (constraintList 
+
+void 
+constraintList_addl (constraintList s, constraint el)
+{
+  llassert (constraintListGROWLOW > 0);
+
+  if (s->nspacelow <= 0)
+    constraintList_grow (s);
+
+  s->nspacelow--;
+  s->elements--;
+  s->elements[0] = el;
+  s->current++;
+  s->nelements++;
+}
+
+void 
+constraintList_reset (constraintList s)
+{
+  s->current = 0;
+}
+
+void 
+constraintList_finish (constraintList s)
+{
+  s->current = s->nelements - 1;
+}
+
+void 
+constraintList_advance (constraintList s)
+{
+  s->current++;
+  llassert (s->current < s->nelements);
+}
+
+/*@exposed@*/ constraint 
+constraintList_head (constraintList s)
+{
+  llassert (s->nelements > 0);
+  return (s->elements[0]);
+}
+
+/*@only@*/ constraintList 
+constraintList_copy (constraintList s)
+{
+  constraintList r = constraintList_new ();
+
+  constraintList_elements (s, x)
+  {
+    constraintList_addh (r, constraint_copySafe (x));
+  } end_constraintList_elements;
+
+  return r;
+}
+
+/*@exposed@*/ constraint 
+constraintList_current (constraintList s)
+{
+  llassert (!(s->current >= s->nelements));
+  return (s->elements[s->current]);
+}
+
+constraint 
+constraintList_getN (constraintList s, int n)
+{
+  llassert (n >= 0 && n < s->nelements);
+
+  return (s->elements[n]);
+}
+
+/*@only@*/ cstring
+constraintList_unparse (constraintList s)
+{
+  bool first = TRUE;
+  cstring st = cstring_undefined;
+
+  constraintList_elements (s, current)
+  {
+    if (first)
+      {
+       st = constraint_unparse (current);
+       first = FALSE;
+      }
+    else
+      st = message ("%q, %q", st, constraint_unparse (current));
+  } end_constraintList_elements;
+
+  return st;
+}
+
+///*  /*@only@*/ cstring */
+/*  constraintList_unparseTail (constraintList s) */
+/*  { */
+/*    bool head = TRUE; */
+/*    bool first = TRUE; */
+/*    cstring st = cstring_undefined; */
+
+/*    constraintList_elements (s, current) */
+/*    { */
+/*      if (head) */
+/*        { */
+/*     head = FALSE; */
+/*        } */
+/*      else */
+/*        { */
+/*     if (first) */
+/*       { */
+/*         st = constraint_unparse (current); */
+/*         first = FALSE; */
+/*       } */
+/*     else */
+/*       st = message ("%q, %q", st, constraint_unparse (current)); */
+/*        } */
+/*    } end_constraintList_elements; */
+
+/*    return st; */
+/*  } */
+
+// /*@only@*/ cstring 
+/*  constraintList_unparseToCurrent (constraintList s) */
+/*  { */
+/*    int i; */
+/*    cstring st = cstring_undefined; */
+
+/*    for (i = 0; i < s->current; i++) */
+/*      { */
+/*        constraint current = s->elements[i]; */
+
+/*        if (i == 0) */
+/*     st = constraint_unparse (current); */
+/*        else */
+/*     st = message ("%q, %q", st, constraint_unparse (current)); */
+/*      } */
+
+/*    return st; */
+/*  } */
+
+///*@only@*/ cstring
+/*  constraintList_unparseSecondToCurrent (constraintList s) */
+/*  { */
+/*    int i; */
+/*    cstring st = cstring_undefined; */
+
+/*    for (i = 1; i < s->current; i++) */
+/*      { */
+/*        constraint current = s->elements[i]; */
+
+/*        if (i == 1) */
+/*     { */
+/*       st = constraint_unparse (current); */
+/*     } */
+/*        else */
+/*     { */
+/*       st = message ("%q, %q", st, constraint_unparse (current)); */
+/*     } */
+/*      } */
+
+/*    return st; */
+/*  } */
+
+void
+constraintList_free (constraintList s)
+{
+  int i;
+  for (i = 0; i < s->nelements; i++)
+    {
+      constraint_free (s->elements[i]); 
+    }
+
+  sfree (s->elementsroot);
+  sfree (s);
+}
diff --git a/src/constraintListold.c b/src/constraintListold.c
new file mode 100644 (file)
index 0000000..adbbe37
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+** constraintList.c
+*/
+
+# include <ctype.h> /* for isdigit */
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "cgrammar.h"
+# include "cgrammar_tokens.h"
+
+# include "exprChecks.h"
+# include "aliasChecks.h"
+# include "exprNodeSList.h"
+# include "exprData.i"
+
+/*@i33*/
+/*@-fcnuse*/
+
+/*@notnull@*/ constraintList constraintList_new () {
+constraintList ret;
+
+ret = dmalloc ( sizeof (*ret) );
+llassert ( ret != NULL);
+ret->numconstraints = 0;
+/*@i22@*/ret->constraints = dmalloc (INITIALCONSTRAINTLISTSIZE * sizeof (constraint) ); 
+ret->size = INITIALCONSTRAINTLISTSIZE; 
+return ret; 
+}
+
+void exprNode_printfileloc (exprNode e)
+{
+  DPRINTF ((" %q ", fileloc_unparse (exprNode_getfileloc (e) ) ) );
+}
+
+void constraintList_debugPrint ( char * s )
+{
+  DPRINTF((s) );
+}
+
+void constraintList_print (constraintList cl)
+{
+
+  int i;
+  if (constraintList_isUndefined (cl) )
+    {
+      constraintList_debugPrint("Constraint List undefined\n");
+      return;
+    }
+  for (i = 0; i < cl->numconstraints; i++)
+    {
+      constraint_print (cl->constraints[i]);
+    }
+
+}
+    
+void constraintList_resolve (constraintList cl)
+{
+  int i;
+  if (constraintList_isUndefined (cl) )
+    {
+       constraintList_debugPrint("Constraint List empty \n");
+      return;
+    }
+   for (i = 0; i < cl->numconstraints; i++)
+    {
+       constraintList_debugPrint("Trying to resolve:\n");
+      constraint_print (cl->constraints[i]);
+      if ( constraint_resolve (cl->constraints[i] ) )
+        constraintList_debugPrint ("resolve sucessfully\n");
+      else
+        constraintList_debugPrint ("not resolved sucessfully\n");
+       
+    }
+}
+constraintList  constraintList_get (exprNode e1 )
+{
+  return e1->constraints;
+}
+
+constraintList constraintList_exprNodemerge (exprNode e1, exprNode e2)
+{
+  constraintList ret;
+  if ( (e1 != NULL) && (e2 != NULL) )
+    {
+      ret = constraintList_merge (e1->constraints, e2->constraints);
+    }
+  else if ( (e1 == NULL) && (e2 == NULL) )
+    ret = constraintList_merge ( (constraintList)NULL,  (constraintList)NULL );
+  else if (e1 == NULL)
+    ret = constraintList_merge ( (constraintList)NULL, e2->constraints);
+  else
+    ret = constraintList_merge (e1->constraints, (constraintList)NULL );
+  return ret;
+}
+
+
+constraintList constraintList_merge (constraintList cl1, constraintList cl2)
+{
+  constraintList ret;
+  int i;
+  ret = constraintList_undefined; 
+  if  (constraintList_isDefined (cl1) )
+    {
+      for (i = 0; i < cl1->numconstraints; i++)
+       {
+         ret = constraintList_add (ret, cl1->constraints[i]);
+       }
+    }
+  if  (constraintList_isDefined (cl2) )
+    {
+      for (i = 0; i < cl2->numconstraints; i++)
+       {
+         ret = constraintList_add (ret, cl2->constraints[i]);
+       }
+    }
+  return ret;
+
+
+}
+
+constraintList constraintList_add (constraintList constraints, constraint newconstr)
+{
+  constraintList ret;
+  
+  if (  constraintList_isUndefined(constraints) )
+    {
+      ret = constraintList_new ();
+    }
+  else
+    {
+      ret = constraints;
+    }
+  
+  llassert (constraintList_isDefined (ret) );
+  
+  
+  ret->constraints[ret->numconstraints] = newconstr;
+  
+  ret->numconstraints++;
+  if (ret->numconstraints == ret->size)
+    {
+      ret->constraints = realloc (ret->constraints, sizeof (constraint) * (ret->size*2) );
+      ret->size *= 2;
+    }
+  return ret;
+  
+}
+/*@=fcnuse*/
diff --git a/src/constraintResolve.c b/src/constraintResolve.c
new file mode 100644 (file)
index 0000000..2774ad9
--- /dev/null
@@ -0,0 +1,387 @@
+/*
+/*
+** constraintResolve.c
+*/
+
+# include <ctype.h> /* for isdigit */
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "cgrammar.h"
+# include "cgrammar_tokens.h"
+
+# include "exprChecks.h"
+# include "aliasChecks.h"
+# include "exprNodeSList.h"
+# include "exprData.i"
+
+
+int constraintExpr_getValue (constraintExpr expr)
+{
+  if (expr->expr != NULL)
+    {
+      TPRINTF( ( "Not Implemented" ));
+      llassert(FALSE);
+    }
+  return (constraintTerm_getValue (expr->term) );
+}
+
+// returns 1 0 -1 like strcopy
+int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
+{
+  int value1, value2;
+
+  value1 = constraintExpr_getValue(expr1);
+  value2 = constraintExpr_getValue(expr2);
+
+  if (value1 > value2)
+    return 1;
+
+  if (value1 == value2)
+    return 0;
+
+  else
+    return -1;
+}
+
+bool constraintExpr_canCompare (constraintExpr expr1, constraintExpr expr2)
+{
+  if (expr1->expr != NULL)
+    {
+      return FALSE;
+    }
+
+  if (expr2->expr  != NULL)
+    {
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+bool rangeCheck (arithType ar1, constraintExpr expr1, arithType ar2, constraintExpr expr2)
+
+{
+  switch (ar1)
+ {
+ case GTE:
+ case GT:
+      /*irst constraint is > only > => or == cosntraint can satify it */
+      if ( (ar2 == GT) || (ar2 == GTE) || (ar2 == EQ) )
+       {
+         if (! constraintExpr_canCompare (expr1, expr2) )
+           return FALSE;
+         
+         if (constraintExpr_compare (expr2, expr1) >= 0)
+           return TRUE;
+         
+       }
+  return FALSE;
+ default:
+   TPRINTF(("case not handled"));
+ }
+  return FALSE;
+}
+
+/*returns true if cosntraint post satifies cosntriant pre */
+bool satifies (constraint pre, constraint post)
+{
+  if (!constraintTerm_same(pre->lexpr->term, post->lexpr->term) )
+    {
+      return FALSE;
+    }
+  if (post->expr->expr == NULL)
+    return FALSE;
+  return rangeCheck (pre->ar, pre->expr, post->ar, post->expr);
+  
+  return TRUE;
+}
+
+constraintExpr constraintExpr_simplify (constraintExpr expr)
+{
+  
+  expr->term = constraintTerm_simplify (expr->term);
+  if (expr->expr == NULL)
+    return expr;
+  
+    expr->expr = constraintExpr_simplify (expr->expr);
+  if ( (expr->term->constrType == INTLITERAL) && (expr->expr->term->constrType == INTLITERAL)  )
+    {
+      TPRINTF( ("EVENTUAL IMPLEMENTATION OF LITERAL MERGE " ));
+
+      TPRINTF ( (message ("Expression is %s ", constraintExpr_print (expr) ) ) );
+      
+      if (expr->op == PLUS )
+       {
+         TPRINTF( (message ("Adding %d and %d ", expr->term->value.intlit,
+                            expr->expr->term->value.intlit) ) );
+         expr->term->value.intlit += expr->expr->term->value.intlit;
+       }
+      else if (expr->op == MINUS )
+       {
+         expr->term->value.intlit -= expr->expr->term->value.intlit;
+       }
+      expr->op = expr->expr->op;
+
+      expr->expr = expr->expr->expr;
+    }
+  return expr;
+  
+}
+
+constraintExpr constraintExpr_add (constraintExpr e, constraintTerm term,  constraintExprOp op)
+{
+  constraintExpr p;
+
+  p = e;
+  while (p->expr != NULL)
+    {
+      p = p->expr;
+    }
+
+  p->op = op;
+  p->expr = constraintExpr_alloc();
+  p->expr->term = term;
+
+  return e;
+}
+
+constraintExpr termMove (constraintExpr dst, constraintExpr src)
+{
+  constraintTerm term;
+  llassert (src->expr != NULL);
+  term = src->expr->term;
+  if (src->op == PLUS)
+    dst = constraintExpr_add (dst, term, MINUS);
+  else
+    if (src->op == MINUS)
+      dst = constraintExpr_add (dst, term, PLUS);
+  
+  return dst;
+}
+
+constraint solveforterm (constraint c)
+{
+  constraintExpr p;
+    p = c->lexpr;
+    while (p->expr != NULL)
+      {
+       TPRINTF( (message("Moving %s", constraintExpr_print (c->expr) ) ) );
+       c->expr = termMove(c->expr, p);
+       p->op = p->expr->op;
+       #warning memleak
+
+       p->expr = p->expr->expr;
+      }
+    return c;
+}
+
+constraint constraint_simplify (constraint c)
+{
+  c =  solveforterm (c);
+  c->lexpr = constraintExpr_simplify (c->lexpr);
+  c->expr  = constraintExpr_simplify (c->expr);
+  return c;
+}
+
+bool resolve (constraint c, constraintList p)
+{
+  constraintList_elements (p, el)
+    {
+      if ( satifies (c, el) )
+       {
+         TPRINTF ( (message ("\n%s Satifies %s\n ", constraint_print(el), constraint_print(c) ) ) );
+         return TRUE;
+       }
+    }
+  end_constraintList_elements;
+  TPRINTF ( (message ("no constraints satify %s", constraint_print(c) ) ));
+  return FALSE;
+}
+
+constraint substitute (constraint c, constraintList p)
+{
+  constraintList_elements (p, el)
+    {
+      if (constraintTerm_same(c->lexpr->term, el->lexpr->term) )
+       {
+         if ( el->ar == EQ)
+           {
+             c->lexpr = constraintExpr_copy (el->expr);
+             c = constraint_simplify(c);
+             return c;
+           }
+       }
+    }
+  end_constraintList_elements;
+
+  c = constraint_simplify(c);
+  return c;
+}
+
+  
+constraintList reflectChanges (constraintList pre2, constraintList post1)
+{
+  
+  constraintList ret;
+  constraint temp;
+  ret = constraintList_new();
+  constraintList_elements (pre2, el)
+    {
+      if (!resolve (el, post1) )
+       {
+         temp = substitute (el, post1);
+         ret = constraintList_add (ret, temp);
+       }
+    } end_constraintList_elements;
+
+    return ret;
+}
+
+
+/*check if rvalue side has term*/
+bool constraintExpr_hasTerm (constraint c, constraintTerm term)
+{
+  constraintExpr p;
+  p = c->expr;
+  while (p != NULL)
+    {
+      if (constraintTerm_same (p->term, term) )
+       return TRUE;
+
+      p = p->expr->expr;
+    }
+  TPRINTF((
+          message ("constraintExpr_hasTerm returned fallse for %s %S",
+                   constraint_print(c), constraintTerm_print(term)
+                   )
+          ));
+  return FALSE;
+}
+
+constraintExpr solveEq (constraint c, constraintTerm t)
+{
+  constraintExpr p;
+  c = constraint_copy (c);
+  TPRINTF(("\ndoing solveEq\n"));
+  if (! constraintTerm_same (c->expr->term, t) )
+    {
+      TPRINTF ( (message ("\n\nconstraintTerms: %s %s not same ", constraintTerm_print(c->expr->term),
+                         constraintTerm_print(t) )
+                ) );
+      return NULL;
+    }
+
+  p = c->expr;
+  while (p->expr != NULL)
+    {
+      TPRINTF( (message("\n\nMoving %s", constraintExpr_print (c->expr) ) ) );
+      c->lexpr = termMove(c->lexpr, p);
+      p->expr = p->expr->expr;
+    }
+  
+  return c->lexpr;
+  
+}
+
+constraint updateConstraint (constraint c, constraintList p)
+{
+  TPRINTF(("start updateConstraints"));
+  constraintList_elements (p, el)
+    {
+      
+      if (constraintTerm_same(c->lexpr->term, el->lexpr->term) )
+       {
+         TPRINTF((""));
+         if ( el->ar == EQ)
+           {
+                 TPRINTF((""));
+
+             if  (constraintExpr_hasTerm (el, c->lexpr->term) )
+               {
+                 constraintExpr solve;
+                 TPRINTF((""));
+                 solve = solveEq (el, c->lexpr->term);
+                 if (solve)
+                   {                 
+                     c->lexpr = constraintExpr_copy (solve);
+                     c = constraint_simplify(c);
+                     return c;
+                   }
+               }
+           }
+       }
+    }
+  end_constraintList_elements;
+  c = constraint_simplify(c);
+  
+  TPRINTF(("end updateConstraints"));
+  return c;
+}
+
+
+constraintList reflectChangesEnsures (constraintList pre2, constraintList post1)
+{  
+  constraintList ret;
+  constraint temp;
+  ret = constraintList_new();
+  constraintList_elements (pre2, el)
+    {
+      if (!resolve (el, post1) )
+       {
+         temp = updateConstraint (el, post1);
+         if (temp != NULL)
+           ret = constraintList_add (ret, temp);
+       }
+    } end_constraintList_elements;
+
+    return ret;
+}
+
+void mergeResolve (exprNode parent, exprNode child1, exprNode child2)
+{
+  constraintList temp;
+  TPRINTF( (message ("magically merging constraint into parent:%s for children:  %s and %s", exprNode_unparse (parent), exprNode_unparse (child1), exprNode_unparse(child2) )
+           ) );
+  llassert (!exprNode_isError (child1)  || !exprNode_isError(child2) );
+  if (exprNode_isError (child1) )
+      {
+       parent->requiresConstraints = constraintList_copy (child2->requiresConstraints);
+       parent->ensuresConstraints = constraintList_copy (child2->ensuresConstraints);
+       DPRINTF((message ("Copied child constraints: pre: %s and post: %s ",
+                         constraintList_print( child2->requiresConstraints),
+                         constraintList_print (child2->ensuresConstraints)
+                         )
+                ));
+       return;
+      }
+
+  llassert(!exprNode_isError(child2) );
+  
+  TPRINTF( (message ("Child constraints are %s and %s ",
+                    constraintList_print (child1->requiresConstraints),
+                    constraintList_print (child2->requiresConstraints)
+                    ) ) );
+  parent->requiresConstraints = constraintList_new();
+  parent->ensuresConstraints = constraintList_new();
+
+  parent->requiresConstraints = constraintList_copy (child1->requiresConstraints);
+  
+  temp = reflectChanges (child2->requiresConstraints, child1->ensuresConstraints);
+  parent->requiresConstraints = constraintList_addList (parent->requiresConstraints, temp);
+
+  
+  temp = reflectChangesEnsures (child1->ensuresConstraints, child2->ensuresConstraints);
+  // temp = constraintList_copy (child1->ensuresConstraints);
+
+  
+  parent->ensuresConstraints = constraintList_copy (child2->ensuresConstraints);
+  parent->ensuresConstraints = constraintList_addList (parent->ensuresConstraints, temp);
+  
+  TPRINTF( (message ("Parent constraints are %s and %s ",
+                    constraintList_print (parent->requiresConstraints),
+                    constraintList_print (parent->ensuresConstraints)
+                    ) ) );
+}
+
diff --git a/src/constraintTerm.c b/src/constraintTerm.c
new file mode 100644 (file)
index 0000000..8f2418e
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+** constraintTerm.c
+*/
+
+# include <ctype.h> /* for isdigit */
+# include "lclintMacros.nf"
+# include "basic.h"
+# include "cgrammar.h"
+# include "cgrammar_tokens.h"
+
+# include "exprChecks.h"
+# include "aliasChecks.h"
+# include "exprNodeSList.h"
+# include "exprData.i"
+
+int constraintTerm_getValue (constraintTerm term)
+{
+  if (term->kind == EXPRNODE)
+    {
+      return (multiVal_forceInt (term->value.expr->val) );
+    }
+  if (term->kind == INTLITERAL )
+    {
+      return (term->value.intlit);
+    }
+  llassert(FALSE);
+  return 0;
+}
+
+/*@out@*/ static  constraintTerm new_constraintTermExpr (void)
+{
+  constraintTerm ret;
+  ret = dmalloc (sizeof (* ret ) );
+  return ret;
+}
+
+constraintTerm constraintTerm_simplify (constraintTerm term)
+{
+  if (term->constrType == VALUE)
+    {
+      if (term->kind == EXPRNODE)
+       {
+         if ( exprNode_knownIntValue (term->value.expr ) )
+           {
+             int temp;
+             temp  = exprNode_getLongValue (term->value.expr);
+             term->value.intlit = temp;
+             term->kind = INTLITERAL;
+           }
+         
+       }
+
+    }
+  return term;
+}
+
+constraintTerm constraintTerm_copy (constraintTerm term)
+{
+  constraintTerm ret;
+  ret = new_constraintTermExpr();
+  ret->constrType = term->constrType;
+  ret->loc = fileloc_copy (term->loc);
+  ret->value= term->value;
+  ret->kind = term->kind;
+  return ret;
+}
+
+constraintTerm exprNode_makeConstraintTerm (/*@only@*/ exprNode e)
+{
+  constraintTerm ret = new_constraintTermExpr();
+  ret->loc =  exprNode_getfileloc(e);
+  ret->value.expr = e;
+  ret->kind = EXPRNODE;
+  return ret;
+}
+
+
+constraintTerm constraintTerm_makeMaxSetexpr (exprNode e)
+{
+  constraintTerm ret;
+  ret = exprNode_makeConstraintTerm (e);
+  ret->constrType = MAXSET;
+  return ret;
+}
+
+constraintTerm constraintTerm_makeMinSetexpr (exprNode e)
+{
+  constraintTerm ret;
+  ret = exprNode_makeConstraintTerm (e);
+  ret->constrType = MINSET;
+  return ret;
+}
+
+constraintTerm constraintTerm_makeMaxReadexpr (exprNode e)
+{
+  constraintTerm ret;
+  ret = exprNode_makeConstraintTerm (e);
+  ret->constrType = MAXREAD;
+  return ret;
+}
+
+constraintTerm constraintTerm_makeMinReadexpr (exprNode e)
+{
+  constraintTerm ret;
+  ret = exprNode_makeConstraintTerm (e);
+  ret->constrType = MINREAD;
+  return ret;
+}
+
+constraintTerm constraintTerm_makeValueexpr (exprNode e)
+{
+  constraintTerm ret;
+  ret = exprNode_makeConstraintTerm (e);
+  ret->constrType = VALUE;
+  ret = constraintTerm_simplify (ret);
+  return ret;
+}
+
+
+constraintTerm intLit_makeConstraintTerm (int i)
+{
+  constraintTerm ret = new_constraintTermExpr();
+  ret->value.intlit = i;
+  ret->kind = INTLITERAL;
+  ret->loc =  fileloc_undefined;
+  return ret;
+}
+
+
+constraintTerm constraintTerm_makeIntLitValue (int i)
+{
+  constraintTerm ret;
+  ret = intLit_makeConstraintTerm (i);
+  ret->constrType = VALUE;
+  return ret;
+
+}
+
+/* constraintTerm constraintTerm_makeMinSetexpr (int i) */
+/* { */
+/*   constraintTerm ret; */
+/*   ret = intLit_makeConstraintTerm (i); */
+/*   ret->constrType = MINSET; */
+/* } */
+
+/* constraintTerm constraintTerm_makeMaxReadexpr (int i) */
+/* { */
+/*   constraintTerm ret; */
+/*   ret = intLit_makeConstraintTerm (i); */
+/*   ret->constrType = MAXREAD; */
+/* } */
+/* constraintTerm constraintTerm_makeMinReadexpr (int i) */
+/* { */
+/*   constraintTerm ret; */
+/*   ret = exprNode_makeConstraintTerm (i); */
+/*   ret->constrType = MINREAD; */
+/* } */
+
+
+
+
+cstring  constraintType_print (constraintType constrType)
+{
+  cstring st = cstring_undefined;
+  
+  switch (constrType)
+    {
+    case VALUE:
+      st = cstring_makeLiteral("VALUE");
+      break;
+    case CALLSAFE:
+      st = cstring_makeLiteral("CALLSAFE");
+      break;
+    case  MAXSET:
+      st = cstring_makeLiteral ("MAXSET");
+      break;
+    case    MINSET:
+      st = cstring_makeLiteral ("MINSET");
+      break;
+    case MAXREAD:
+      st = cstring_makeLiteral ("MAXREAD");
+      break;
+    case MINREAD:
+      st = cstring_makeLiteral ("MINREAD");
+      break;
+    case NULLTERMINATED:
+      st = cstring_makeLiteral ("NULLTERMINATED");
+      break;
+    case UNDEFINED:
+      st = cstring_makeLiteral (("Unhandled value for constraintType"));
+      llassert(FALSE);
+      break;
+    default:
+      st = cstring_makeLiteral (("Unhandled value for constraintType"));
+      llassert(FALSE);
+    }
+  return st;
+}
+cstring constraintTerm_print (constraintTerm term)
+{
+  cstring s;
+  s = cstring_undefined;
+  
+  llassert (term != NULL);
+
+  switch (term->kind)
+    {
+    case EXPRNODE:
+      /*@i334*/  //wtf
+      s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
+                  fileloc_unparse (term->loc) );
+      break;
+    case INTLITERAL:
+    {
+      s = message (" %d ", term->value.intlit);
+      break;
+    }
+    case SREF:
+      s = cstring_makeLiteral("Not Implemented\n");
+      llassert(FALSE);
+      break;
+    }
+  s = message (" %s %s ", constraintType_print (term->constrType), s);
+  return s;
+  
+}
+
+
+
+bool constraintTerm_same (constraintTerm term1, constraintTerm term2)
+{
+  llassert (term1 !=NULL && term2 !=NULL);
+
+  if (term1->constrType != term2->constrType)
+    {
+      return FALSE;
+    }
+  if ( (term1->kind != term2->kind) || (term1->kind != EXPRNODE) )
+    {
+      return FALSE;
+    }
+      
+ DPRINTF ( (message
+           ("Comparing srefs for %s and  %s ", constraintTerm_print(term1), constraintTerm_print(term2)
+            )
+           )
+          );
+ if (sRef_same (term1->value.expr->sref, term2->value.expr->sref) )
+   {
+     TPRINTF ((message (" %s and %s are same", constraintTerm_print(term1), constraintTerm_print(term2)  )  ));
+     return TRUE;
+   }
+ else
+   {
+     TPRINTF ((message (" %s and %s are not same", constraintTerm_print(term1), constraintTerm_print(term2)  )  ));
+     return FALSE;
+   }     
+    
+}
+
index 4efba9bd2ccef14a748fd95a4cd1153f2abe8938..806c69cd3fb20389b949023aa11402aa9f4a7006 100644 (file)
@@ -408,7 +408,9 @@ static /*@notnull@*/ /*@special@*/ exprNode
   e->mustBreak = FALSE;
   e->isJumpPoint = FALSE;
   e->environment =  environmentTable_undefined;
-  e->constraints =  constraintList_undefined;
+  e->requiresConstraints = constraintList_new();
+  e->ensuresConstraints  = constraintList_new();
+  
   return (e);
 }
 
@@ -9970,7 +9972,6 @@ fileloc exprNode_getNextSequencePoint (exprNode e)
 
   if (exprNode_isDefined (e) && e->kind == XPR_STMT) {
     lltok t = exprData_getUopTok (e->edata);
-    printf ("!!!!!!!!!!!!!!!!!!Tok is \n\n%s\n", lltok_unparse(t) );
     return lltok_getLoc (t);
   } else {
     llcontbug (message ("Cannot get next sequence point: %s", exprNode_unparse (e)));
This page took 0.154106 seconds and 5 git commands to generate.