]> andersk Git - splint.git/blobdiff - src/constraintExpr.c
do..while control flow fix in exprNode.c
[splint.git] / src / constraintExpr.c
index ec17896349cc32c9ea4ae1b0c6ec47ad5b0fae04..7dff64c1a3c0eab1c293c5b365d532c2b04d6657 100644 (file)
@@ -2,7 +2,7 @@
 ** constraintExpr.c
 */
 
-//#define DEBUGPRINT 1
+/* #define DEBUGPRINT 1 */
 
 # include "lclintMacros.nf"
 # include "basic.h"
@@ -12,9 +12,6 @@
 # include "exprChecks.h"
 # include "exprNodeSList.h"
 
-//# include "constraintExpr.h"
-
-
 /*@-czechfcns@*/
 
 
@@ -31,11 +28,10 @@ doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr p_e, /*@temp@*/ /*@obser
 static /*@only@*/ constraintExpr 
 doFixResultTerm (/*@only@*/ constraintExpr p_e, /*@exposed@*/ exprNode p_fcnCall)
      /*@modifies p_e@*/;
-
-
-     /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) ; /// @allocates result->data @ @sets result->kind @;
-
-//constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c);
+     
+     
+/*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) 
+     /* @allocates result->data @ @sets result->kind @ */ ;
 
 void constraintExpr_free (/*@only@*/ constraintExpr expr)
 {
@@ -145,22 +141,20 @@ static bool isZeroBinaryOp (constraintExpr expr)
 
   tempOp = constraintExprData_binaryExprGetOp (expr2->data);
 
-  if (op == PLUS)
+  if (op == BINARYOP_PLUS)
     op = tempOp;
-  else if (op == MINUS)
+  else if (op == BINARYOP_MINUS)
     {
-      if (tempOp == PLUS)
-       op = MINUS;
-      else if (tempOp == MINUS)
-       op = PLUS;
+      if (tempOp == BINARYOP_PLUS)
+       op = BINARYOP_MINUS;
+      else if (tempOp == BINARYOP_MINUS)
+       op = BINARYOP_PLUS;
       else
        BADEXIT;
     }
   else
     BADEXIT;
 
-  /*@i834@*/ constraintExpr_free(expr2);
-  
   expr->data = constraintExprData_binaryExprSetExpr2(expr->data, temp);
   expr->data = constraintExprData_binaryExprSetOp(expr->data, op);
 
@@ -187,9 +181,10 @@ static bool isZeroBinaryOp (constraintExpr expr)
   *propagate = FALSE;
   *literal = 0;
 
+  
   llassert (expr != NULL);
   
-  // we simplify unaryExpr else where
+  /* we simplify unaryExpr elsewhere */
   if (expr->kind != binaryexpr)
     return expr;
 
@@ -208,11 +203,15 @@ static bool isZeroBinaryOp (constraintExpr expr)
   expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
   expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
 
+  expr1 = removeZero(expr1);
+  expr2 = removeZero(expr2);
+
+  
   *propagate = propagate1 || propagate2;
 
-  if (op == PLUS)
+  if (op == BINARYOP_PLUS)
     *literal    = literal1 +  literal2;
-  else   if (op == MINUS)
+  else   if (op == BINARYOP_MINUS)
     *literal    = literal1 -  literal2;
   else
     BADEXIT;
@@ -229,9 +228,9 @@ static bool isZeroBinaryOp (constraintExpr expr)
       constraintExpr_free (expr1);
       constraintExpr_free (expr2);
 
-      if (op == PLUS )
+      if (op == BINARYOP_PLUS )
        return (constraintExpr_makeIntLiteral ( (t1+t2) ));
-      else if (op ==  MINUS)
+      else if (op ==  BINARYOP_MINUS)
        return (constraintExpr_makeIntLiteral ( (t1-t2) ));
       else
        BADEXIT;
@@ -244,19 +243,20 @@ static bool isZeroBinaryOp (constraintExpr expr)
 
       *literal += constraintExpr_getValue (expr1);
 
-      if (op == PLUS)
+      if (op == BINARYOP_PLUS)
        {
          constraintExpr_free(expr1);
          constraintExpr_free(expr);
          return expr2;
        }
-      else if (op == MINUS)
+      else if (op == BINARYOP_MINUS)
        {
+         
          constraintExpr temp;
 
          /* this is an ugly kludge to deal with not
             having a unary minus operation...*/
-         
+
          temp = constraintExpr_makeIntLiteral (0);
          temp = constraintExpr_makeSubtractExpr (temp, expr2);
          
@@ -275,9 +275,9 @@ static bool isZeroBinaryOp (constraintExpr expr)
     {
       *propagate = TRUE;
           
-      if ( op == PLUS )
+      if ( op == BINARYOP_PLUS )
        *literal += constraintExpr_getValue (expr2);
-      else if (op ==  MINUS)
+      else if (op ==  BINARYOP_MINUS)
        *literal -= constraintExpr_getValue (expr2);
       else
        BADEXIT;
@@ -419,10 +419,33 @@ constraintExpr constraintExpr_makeExprNode (exprNode e)
         ce2 = constraintExpr_makeExprNode (t2);
         ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);         
        }
-     else
+     /*
+       drl 8-11-001
+       
+       We handle expressions containing sizeof with the rule
+       (sizeof type ) * Expr = Expr
+
+       This is the total wronge way to do this but...
+       it may be better than nothing
+     */
+     else if (lltok_isMult(tok) )
        {
-        ret = oldconstraintExpr_makeTermExprNode (e);
+        if  ((t1->kind == XPR_SIZEOF) || (t1->kind == XPR_SIZEOFT) )
+          {
+            ret = constraintExpr_makeExprNode(t2);
+          }
+        else if  ((t2->kind == XPR_SIZEOF) || (t2->kind == XPR_SIZEOFT) )
+          {
+            ret = constraintExpr_makeExprNode(t1);
+          }
+        else
+          {
+          ret =  oldconstraintExpr_makeTermExprNode (e);
+          }
        }
+     else
+        ret = oldconstraintExpr_makeTermExprNode (e);
+   
      break;
    case XPR_PARENS: 
      t = exprData_getUopNode (data);
@@ -468,9 +491,9 @@ constraintExpr constraintExpr_makeExprNode (exprNode e)
   return ret;
 }
 
-/*@only@*/  constraintExpr constraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e)
+/*@only@*/ constraintExpr constraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e)
 {
-  return  oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e);
+  return  oldconstraintExpr_makeTermExprNode(e);
 }
 
 static constraintExpr constraintExpr_makeTerm (/*@only@*/  constraintTerm t)
@@ -480,6 +503,7 @@ static constraintExpr constraintExpr_makeTerm (/*@only@*/  constraintTerm t)
   ret = constraintExpr_alloc();
   ret->kind = term;
   ret->data = dmalloc (sizeof *(ret->data) );
+  ret->data->term = NULL;
   ret->data = constraintExprData_termSetTerm (ret->data, t);
 
   return ret;
@@ -503,6 +527,7 @@ constraintExpr constraintExpr_makeTermsRef (/*@temp@*/ sRef s)
   ret = constraintExpr_alloc();
   ret->kind = unaryExpr;
   ret->data = dmalloc ( sizeof *(ret->data) );
+  ret->data->unaryOp.expr = constraintExpr_undefined;
   return ret;
 }
 
@@ -513,11 +538,11 @@ constraintExpr constraintExpr_makeTermsRef (/*@temp@*/ sRef s)
 
   /*@-uniondef@*/ 
   /*@-compdef@*/
-    ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
-    ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED);
-
+  ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
+  ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED);
+  
   return ret;
-
+  
   /*@=compdef@*/
   /*@=uniondef@*/
 }
@@ -621,6 +646,7 @@ constraintExpr  constraintExpr_makeMaxReadExpr (exprNode expr)
   return ret; 
 }
 
+# if 0
 /*@only@*/
 /*@unused@*/ static constraintExpr  constraintExpr_makeMinSetExpr (/*@exposed@*/ exprNode expr)
 {
@@ -638,7 +664,7 @@ constraintExpr  constraintExpr_makeMaxReadExpr (exprNode expr)
   ret->data      = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
   return ret;
 }
-
+# endif
 
 /*@only@*/
 constraintExpr constraintExpr_makeValueExpr (/*@exposed@*/ exprNode expr)
@@ -676,7 +702,10 @@ constraintExpr constraintExpr_makeValueInt (int i)
   ret = constraintExpr_alloc();
   ret->kind = binaryexpr;
   ret->data = dmalloc ( sizeof *(ret->data) );
-  //  ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
+
+  ret->data->binaryOp.expr1 = constraintExpr_undefined;
+  ret->data->binaryOp.expr2 = constraintExpr_undefined;
+  
   return ret;
 }
 
@@ -699,9 +728,9 @@ constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1
   constraintExpr ret;
   ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
   if (op.tok == TPLUS)
-    ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
+    ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS);
   else if (op.tok == TMINUS)
-    ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
+    ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_MINUS);
     else
       {
        llassert(FALSE);
@@ -709,6 +738,7 @@ constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1
   return ret;
 }
 
+# if 0
 /*@only@*/
 /*@unused@*/ static constraintExpr constraintExpr_makeBinaryOpExprNode (/*@exposed@*/ exprNode expr1, /*@exposed@*/ exprNode expr2)
 {
@@ -719,6 +749,7 @@ constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1
   ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
   return ret;
 }
+# endif
 
 static /*@only@*/
 constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ constraintExpr expr, int literal)
@@ -728,7 +759,7 @@ constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ c
 
   constExpr = constraintExpr_makeIntLiteral (literal);
   ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
-  ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
+  ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS);
   return ret;
 }
 
@@ -740,7 +771,7 @@ constraintExpr constraintExpr_makeDecConstraintExpr (/*@only@*/constraintExpr ex
 
   inc = constraintExpr_makeIntLiteral (1);
   ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
-  ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
+  ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_MINUS);
   return ret;
 }
 
@@ -752,7 +783,7 @@ constraintExpr constraintExpr_makeDecConstraintExpr (/*@only@*/constraintExpr ex
   DPRINTF ( (message ("Making  subtract expression") ) );
 
   ret = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
-  ret->data = constraintExprData_binaryExprSetOp (ret->data, MINUS);
+  ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_MINUS);
   return ret;
 }
 
@@ -766,7 +797,7 @@ constraintExpr addent)
   DPRINTF ( (message ("Doing addTerm simplification") ) );
 
   ret = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
-  ret->data = constraintExprData_binaryExprSetOp (ret->data, PLUS);
+  ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_PLUS);
   return ret;
 }
 
@@ -779,7 +810,7 @@ constraintExpr constraintExpr_makeIncConstraintExpr (/*@only@*/ constraintExpr e
 
   inc = constraintExpr_makeIntLiteral (1);
   ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
-  ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
+  ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS);
   return ret;
 }
 
@@ -809,9 +840,9 @@ static cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
   
   switch (op)
     {
-    case PLUS:
+    case BINARYOP_PLUS:
       return message("+");
-    case MINUS:
+    case BINARYOP_MINUS:
       return message("-");
 
     default:
@@ -1104,7 +1135,7 @@ static /*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/co
   else
     {
       op = constraintExprData_binaryExprGetOp (c->data);      
-      if (op == MINUS)
+      if (op == BINARYOP_MINUS)
        if (constraintExpr_similar(e1, e2) )
          {
            constraintExpr_free(c);
@@ -1140,23 +1171,23 @@ static /*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/co
   expr1 = constraintExpr_copy(expr1);
   expr2 = constraintExpr_copy(expr2);
 
-//drl possible problem : warning make sure this works
-    
-    lexpr->kind = expr1->kind;
-    free (lexpr->data);
-
-    lexpr->data = copyExprData (expr1->data, expr1->kind);
-    constraintExpr_free(expr1);
-    
-    if (op == PLUS)
-      expr = constraintExpr_makeSubtractExpr (expr, expr2);
-    else if (op == MINUS)
-      expr = constraintExpr_makeAddExpr (expr, expr2);
-    else
-      BADEXIT;
-
-    
-    return expr;
+  /* drl possible problem : warning make sure this works */
+  
+  lexpr->kind = expr1->kind;
+  sfree (lexpr->data);
+  
+  lexpr->data = copyExprData (expr1->data, expr1->kind);
+  constraintExpr_free(expr1);
+  
+  if (op == BINARYOP_PLUS)
+    expr = constraintExpr_makeSubtractExpr (expr, expr2);
+  else if (op == BINARYOP_MINUS)
+    expr = constraintExpr_makeAddExpr (expr, expr2);
+  else
+    BADEXIT;
+  
+  
+  return expr;
 
   /*
     #warning this needs to be checked
@@ -1180,10 +1211,10 @@ static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ co
     {
       return c;
     }
-  // pattern mxr ( var + const) = mxr(var) - const
   
   exp = constraintExprData_unaryExprGetExpr (c->data);
-
+  exp = constraintExpr_copy(exp);
+  
   if (exp->kind == term)
     {
       constraintTerm cterm;
@@ -1201,7 +1232,10 @@ static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ co
              temp = constraintExpr_makeIntLiteral ((int)strlen (cstring_toCharsSafe(val) ) );
              cstring_free(val);              
              constraintExpr_free(c);
+             constraintExpr_free(exp);
+
              return temp;
+             
            }
          if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
            {
@@ -1210,15 +1244,18 @@ static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ co
              temp = constraintExpr_makeIntLiteral ((int)strlen (cstring_toCharsSafe(val) ) );
              cstring_free(val);              
              constraintExpr_free(c);
+             constraintExpr_free(exp);
+
              return temp;
            }
          BADEXIT;
        }
 
-      // slight Kludge to hanlde var [] = { , , };
-      // type syntax  I don't think this is sounds but it should be good
-      // enough.  The C stanrad is very confusing about initialization
-      // -- DRL 7/25/01
+      /* slight Kludge to hanlde var [] = { , , };
+      ** type syntax  I don't think this is sounds but it should be good
+      ** enough.  The C stanrad is very confusing about initialization
+      ** -- DRL 7/25/01
+      */
       
       if (constraintTerm_isInitBlock(cterm) )
        {
@@ -1232,19 +1269,24 @@ static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ co
          constraintExpr_free(c);
          DPRINTF(( message("Changed too %q", constraintExpr_print(temp)
                            ) ));
+         constraintExpr_free(exp);
          return temp;
        }
       
+      constraintExpr_free(exp);
       return c;
     }
   
   if (exp->kind != binaryexpr)
-    return c;
-
-  if (constraintExprData_binaryExprGetOp (exp->data) == PLUS  )
+    {
+      constraintExpr_free(exp);
+      return c;
+    }
+  
+  if (constraintExprData_binaryExprGetOp (exp->data) == BINARYOP_PLUS  )
     {
  
-      //      if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
+      /* if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) ) */
        {
        
          constraintExpr  temp, temp2;
@@ -1267,7 +1309,9 @@ static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ co
        }
     }
   
-  DPRINTF ( (message ("Done simplification:%s", constraintExpr_unparse (c) ) ) );
+  DPRINTF ( (message ("constraintExpr_simplifyUnaryExpr: Done simplification:%s", constraintExpr_unparse (c) ) ) );
+
+  constraintExpr_free(exp);
   return c;
 }
 
@@ -1334,22 +1378,42 @@ cstring constraintExpr_unparse (/*@temp@*/ /*@observer@*/ constraintExpr ex) /*@
   switch (kind)
     {
     case term:
-      st = message ("(%q) ", constraintTerm_print (constraintExprData_termGetTerm (ex->data)));
+
+            if (context_getFlag (FLG_PARENCONSTRAINT) )
+             {
+               st = message ("(%q) ", constraintTerm_print (constraintExprData_termGetTerm (ex->data)));
+             }
+           else
+             {
+               st = message ("%q", constraintTerm_print (constraintExprData_termGetTerm (ex->data)));
+             }
       break;
     case unaryExpr:
-      st = message ("%q (%q)",
-                   constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data)
-                                                    ),
+      st = message ("%q(%q)",
+                   constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data) ),
                    constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
                    );
       break;
     case binaryexpr:
-      st = message ("(%q) %q (%q)",
+      if (context_getFlag (FLG_PARENCONSTRAINT) )
+       {
+         st = message ("(%q) %q (%q)",
                    constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
                    constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
                                                     ),
                    constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
                    );
+       }
+      else
+       {
+         st = message ("%q %q %q",
+                       constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
+                       constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
+                                                         ),
+                       constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
+                       );
+       }
+      
       break;
     default:
       llassert(FALSE);
@@ -1604,9 +1668,10 @@ doFixResultTerm (/*@only@*/ constraintExpr e, /*@exposed@*/ exprNode fcnCall)
   constraintTerm t;
   sRef s;
   /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
-  /*@i22*/ constraintExprData data = e->data;
-  
-  /*@i22*/constraintExprKind kind = e->kind;
+  /*@i22*/
+
+  constraintExprData data = e->data;
+  constraintExprKind kind = e->kind;
   
   constraintExpr ret;
 
@@ -1723,6 +1788,27 @@ bool constraintExpr_isBinaryExpr (/*@observer@*/ constraintExpr c)
     return FALSE;
 }
 
+/*drl added 8/08/001 */
+bool constraintExpr_isTerm (/*@observer@*/ constraintExpr c) /*@*/
+{
+  if (c->kind == term)
+    return TRUE;
+
+  else
+    return FALSE;
+}
+
+/*@observer@*/ /*@temp@*/ constraintTerm constraintExpr_getTerm ( /*@temp@*/ /*@observer@*/ constraintExpr c) /*@*/
+{
+  constraintTerm term;
+  
+  llassert(constraintExpr_isTerm(c) );
+
+  term = constraintExprData_termGetTerm(c->data);
+
+  return term;
+}
+
 static void  binaryExpr_dump (/*@observer@*/ constraintExprData data,  FILE *f)
 {
   constraintExpr expr1;
@@ -1890,3 +1976,42 @@ void  constraintExpr_dump (/*@observer@*/ constraintExpr expr,  FILE *f)
   return ret;
 
 }
+
+int constraintExpr_getDepth (constraintExpr ex)
+{
+  int ret;
+  
+  constraintExprKind kind;
+
+  llassert (ex != NULL);
+
+  kind = ex->kind;
+  
+  switch (kind)
+    {
+    case term:
+      ret = 1;
+      break;
+    case unaryExpr:
+      ret =  constraintExpr_getDepth (constraintExprData_unaryExprGetExpr (ex->data) );
+      ret++;
+      
+      break;
+    case binaryexpr:
+      ret = 0;
+      ret = constraintExpr_getDepth (constraintExprData_binaryExprGetExpr1 (ex->data) );
+
+      ret++;
+
+      ret += constraintExpr_getDepth (constraintExprData_binaryExprGetExpr2 (ex->data) );
+
+      break;
+    default:
+      BADEXIT;
+    }
+
+  return ret;
+}
+
+
+     
This page took 0.057676 seconds and 4 git commands to generate.