]> andersk Git - splint.git/blobdiff - src/cprim.c
Fixed scanf %x problem.
[splint.git] / src / cprim.c
index ba785ad9c435c362eaecac0bcaf1ef83bf88d59b..b77db8c0758d21537a1093bc4b26d9f19fd1c7d7 100644 (file)
@@ -1,6 +1,6 @@
 /*
-** LCLint - annotation-assisted static program checker
-** Copyright (C) 1994-2000 University of Virginia,
+** Splint - annotation-assisted static program checker
+** Copyright (C) 1994-2003 University of Virginia,
 **         Massachusetts Institute of Technology
 **
 ** This program is free software; you can redistribute it and/or modify it
 ** 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
+** For information on splint: info@splint.org
+** To report a bug: splint-bug@splint.org
+** For more information: http://www.splint.org
 */
 /*
 ** cprim.c
 */
 
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
 # include "basic.h"
 
 static bool cprim_isReal (cprim c)
@@ -55,10 +55,34 @@ cprim_fromInt (int i)
 **    (if RELAXQUALS, c1 must be "bigger" than c2)
 */
 
+static bool cprim_closeEnoughAux (cprim p_c1, cprim p_c2, bool p_deep);
+
+bool
+cprim_closeEnoughDeep (cprim c1, cprim c2) 
+{
+  /*
+  ** If * c2 is passed as * c1
+  ** Comparison is slightly different since it is safe to pass int as long,
+  ** but not to pass int * as long *!
+  **
+  ** For deep comparisons, +relaxquals does not permit the long/int break.
+  */
+
+  return cprim_closeEnoughAux (c1, c2, TRUE);
+}
+
 bool
 cprim_closeEnough (cprim c1, cprim c2)
+{
+  return cprim_closeEnoughAux (c1, c2, FALSE);
+}
+
+static bool
+cprim_closeEnoughAux (cprim c1, cprim c2, bool deep)
 {
   if (c1 == c2) return TRUE;
+  
+  DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2)));
 
   if (c1 == CTX_ANYINTEGRAL)
     {
@@ -84,11 +108,24 @@ cprim_closeEnough (cprim c1, cprim c2)
 
   if (c1 == CTX_UNSIGNEDINTEGRAL)
     {
-      if (context_getFlag (FLG_MATCHANYINTEGRAL)
-         || context_getFlag (FLG_IGNOREQUALS))
+      /* We allow signed ints to match any integral if matchanyintegral is set */
+      if (context_getFlag (FLG_MATCHANYINTEGRAL)) {
+       return (cprim_isAnyInt (c2)
+               || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+      }
+      
+      if (context_getFlag (FLG_IGNOREQUALS))
        {
-         return (cprim_isAnyInt (c2)
-                 || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+         if (context_getFlag (FLG_IGNORESIGNS)) 
+           {
+             return (cprim_isAnyUnsignedInt (c2)
+                     || (cprim_isUnsignedChar (c2) && context_msgCharInt ()));
+           }
+         else
+           {
+             return (cprim_isAnyInt (c2)
+                     || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+           }
        }
       else if (context_getFlag (FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL))
        {
@@ -102,8 +139,13 @@ cprim_closeEnough (cprim c1, cprim c2)
 
   if (c1 == CTX_SIGNEDINTEGRAL)
     {
-      if (context_getFlag (FLG_MATCHANYINTEGRAL)
-         || context_getFlag (FLG_IGNOREQUALS))
+      /* We allow signed ints to match any integral if matchanyintegral is set */
+      if (context_getFlag (FLG_MATCHANYINTEGRAL)) {
+       return (cprim_isAnyInt (c2)
+               || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+      }
+
+      if (context_getFlag (FLG_IGNOREQUALS))
        {
          return (cprim_isAnyInt (c2)
                  || (cprim_isAnyChar (c2) && context_msgCharInt ()));
@@ -173,6 +215,9 @@ cprim_closeEnough (cprim c1, cprim c2)
        }
     }
 
+
+  DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2)));
+
   if (context_getFlag (FLG_RELAXTYPES))
     {
       if (cprim_isNumeric (c1) && cprim_isNumeric (c2)) return TRUE;
@@ -184,12 +229,18 @@ cprim_closeEnough (cprim c1, cprim c2)
        {
        case CTX_CHAR:
        case CTX_UCHAR:
-         return (cprim_isAnyChar (c2) 
-                 || (cprim_isAnyInt (c2) && (context_msgCharInt ())));
+         if (cprim_isAnyChar (c2) 
+             || (cprim_isAnyInt (c2) && (context_msgCharInt ()))) {
+           return TRUE;
+         } 
+         break;
        case CTX_DOUBLE:
        case CTX_FLOAT:
        case CTX_LDOUBLE:
-         return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT || c2 == CTX_LDOUBLE);
+         if (c2 == CTX_DOUBLE || c2 == CTX_FLOAT || c2 == CTX_LDOUBLE) {
+           return TRUE;
+         }
+         break;
        case CTX_INT:
        case CTX_LINT:
        case CTX_LLINT:
@@ -198,140 +249,180 @@ cprim_closeEnough (cprim c1, cprim c2)
        case CTX_UINT:
        case CTX_ULINT:
        case CTX_USINT:
-         return (cprim_isAnyInt (c2) 
-                 || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+         if (cprim_isAnyInt (c2) 
+             || (cprim_isAnyChar (c2) && context_msgCharInt ())) {
+           return TRUE;
+         }
+         /*@fallthrough@*/ 
        default:
-         return FALSE;
+         ;
        }
     }
-  else 
+
+  if (context_getFlag (FLG_IGNORESIGNS))
     {
-      if (context_getFlag (FLG_IGNORESIGNS))
+      if (c1 == CTX_UCHAR)  
        {
-         if (c1 == CTX_UCHAR)  
-           {
-             c1 = CTX_CHAR;
-           }
-         else if (c1 == CTX_UINT)  
-           {
-             c1 = CTX_INT;
-           }
-         else if (c1 == CTX_ULINT) 
-           {
-             c1 = CTX_LINT;
-           }
-         else if (c1 == CTX_USINT)  
-           {
-             c1 = CTX_SINT;
-           }
-         else
-           {
-             ;
-           }
-
-         if (c2 == CTX_UCHAR)  
-           {
-             c2 = CTX_CHAR;
-           }
-         else if (c2 == CTX_UINT)   
-           {
-             c2 = CTX_INT;
-           }
-         else if (c2 == CTX_ULINT) 
-           {
-             c2 = CTX_LINT;
-           }
-         else if (c2 == CTX_USINT)  
-           {
-             c2 = CTX_SINT;
-           }
-         else
-           {
-             ;
-           }
+         c1 = CTX_CHAR;
        }
-
-      if (c1 == c2) return TRUE;
-
-      if (context_getFlag (FLG_FLOATDOUBLE))
+      else if (c1 == CTX_UINT)  
        {
-         if (c1 == CTX_FLOAT && c2 == CTX_DOUBLE) 
-           {
-             return TRUE;
-           }
-         if (c2 == CTX_FLOAT && c1 == CTX_DOUBLE)
-           {
-             return TRUE;
-           }
+         c1 = CTX_INT;
+       }
+      else if (c1 == CTX_ULINT) 
+       {
+         c1 = CTX_LINT;
+       }
+      /* 2001-06-10: This fix provided by Jim Zelenka: */
+      else if (c1 == CTX_ULLINT) 
+       {
+         c1 = CTX_LLINT;
        }
+      /* End fix */
+      else if (c1 == CTX_USINT)  
+       {
+         c1 = CTX_SINT;
+       }
+      else
+       {
+         ;
+       }
+      
+      if (c2 == CTX_UCHAR)  
+       {
+         c2 = CTX_CHAR;
+       }
+      else if (c2 == CTX_UINT)   
+       {
+         c2 = CTX_INT;
+       }
+      else if (c2 == CTX_ULINT) 
+       {
+         c2 = CTX_LINT;
+       }
+      /* 2001-06-10: This fix provided by Jim Zelenka: */
+      else if (c2 == CTX_ULLINT)
+       {
+         c2 = CTX_LLINT;
+       }
+      /* End fix */
+      else if (c2 == CTX_USINT)  
+       {
+         c2 = CTX_SINT;
+       }
+      else
+       {
+         ;
+       }
+    }
 
-      if (context_getFlag (FLG_RELAXQUALS))
+  if (c1 == c2) return TRUE;
+  
+  if (context_getFlag (FLG_FLOATDOUBLE))
+    {
+      if (c1 == CTX_FLOAT && c2 == CTX_DOUBLE) 
        {
-         switch (c1)
-           {
-           case CTX_DOUBLE:
-             return (c2 == CTX_FLOAT);
-           case CTX_LDOUBLE:
-             return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT);
-           case CTX_SINT:
-             return (c2 == CTX_CHAR && context_msgCharInt ());
-           case CTX_INT:
-             return (c2 == CTX_SINT
-                     || (cprim_isAnyChar (c2) && context_msgCharInt ()));
-           case CTX_LLINT:
-             return (c2 == CTX_SINT
-                     || c2 == CTX_INT 
+         return TRUE;
+       }
+      if (c2 == CTX_FLOAT && c1 == CTX_DOUBLE)
+       {
+         return TRUE;
+       }
+    }
+  
+  DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2)));
+  
+  if (!deep && context_getFlag (FLG_RELAXQUALS))
+    {
+      switch (c1)
+       {
+       case CTX_DOUBLE:
+         return (c2 == CTX_FLOAT);
+       case CTX_LDOUBLE:
+         return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT);
+       case CTX_SINT:
+         return ((c2 == CTX_CHAR && context_msgCharInt ()) 
+                 || (c2 == CTX_INT && context_msgShortInt ())
+                 || (c2 == CTX_LINT && context_msgShortInt () && context_msgLongInt ()));
+
+       case CTX_INT:
+         return ((c2 == CTX_SINT
+                  || (cprim_isAnyChar (c2) && context_msgCharInt ())
+                  || (c2 == CTX_LINT && context_msgLongInt ())));
+
+       case CTX_LLINT:
+         return (c2 == CTX_SINT
+                 || c2 == CTX_INT 
                      || c2 == CTX_LINT
-                     || (cprim_isAnyChar (c2) && context_msgCharInt ()));
-           case CTX_ULLINT:
-             return (c2 == CTX_USINT
-                     || c2 == CTX_UINT 
-                     || c2 == CTX_ULINT);
-           case CTX_LINT:
-             return (c2 == CTX_SINT
-                     || c2 == CTX_INT 
-                     || (cprim_isAnyChar (c2) && context_msgCharInt ()));
-           case CTX_UINT:
-             return (c2 == CTX_USINT 
-                     || (c2 == CTX_UCHAR && context_msgCharInt ()));
-           case CTX_USINT:
-             return (c2 == CTX_UCHAR && context_msgCharInt ());
-           case CTX_ULINT:
-             return (c2 == CTX_UINT || c2 == CTX_USINT);
-           case CTX_UCHAR:
-             return (c2 == CTX_UINT && context_msgCharInt ());
-           case CTX_CHAR:
-             return ((c2 == CTX_INT || c2 == CTX_SINT)
-                     && context_msgCharInt ());
-           default:
-             return FALSE;
-           }
+                 || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+       case CTX_ULLINT:
+         return (c2 == CTX_USINT
+                 || c2 == CTX_UINT 
+                 || c2 == CTX_ULINT
+                 /* 2001-06-10: This fix provided by Jim Zelenka: */
+                 || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+       case CTX_LINT:
+         return (c2 == CTX_SINT
+                 || c2 == CTX_INT 
+                 || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+       case CTX_UINT:
+         return (c2 == CTX_USINT 
+                 || (c2 == CTX_UCHAR && context_msgCharInt ()));
+       case CTX_USINT:
+         return (c2 == CTX_UCHAR && context_msgCharInt ());
+       case CTX_ULINT:
+         /* 2001-06-10: This fix provided by Jim Zelenka: */
+         return (c2 == CTX_UINT || c2 == CTX_USINT
+                 || (c2 == CTX_UCHAR && context_msgCharInt()));
+       case CTX_UCHAR:
+         return (c2 == CTX_UINT && context_msgCharInt ());
+       case CTX_CHAR:
+         return ((c2 == CTX_INT || c2 == CTX_SINT)
+                 && context_msgCharInt ());
+       default:
+         return FALSE;
        }
-      else
+    }
+  else
+    {
+      switch (c1)
        {
-         switch (c1)
-           {
-           case CTX_DOUBLE:
-           case CTX_LDOUBLE:
-             return FALSE;
-           case CTX_SINT:
-           case CTX_INT:
-           case CTX_LINT:
-           case CTX_LLINT:
-             return (c2 == CTX_CHAR && context_msgCharInt ());
-           case CTX_UINT:
-           case CTX_USINT:
-           case CTX_ULINT:
-           case CTX_ULLINT:
-             return (c2 == CTX_UCHAR && context_msgCharInt ());
-           case CTX_UCHAR:
-             return (c2 == CTX_UINT && context_msgCharInt ());
-           case CTX_CHAR:
-             return ((c2 == CTX_INT || c2 == CTX_SINT)
-                     && context_msgCharInt ());
-           default:
-             return FALSE;
-           }
+       case CTX_DOUBLE:
+       case CTX_LDOUBLE:
+         return FALSE;
+       case CTX_SINT:
+         if (c2 == CTX_INT && context_msgShortInt ()) {
+           return TRUE;
+         }
+         /*@fallthrough@*/
+       case CTX_INT:
+         if (c2 == CTX_INT && context_msgLongInt ()) {
+           return TRUE;
+         }
+         
+         if (c2 == CTX_SINT && context_msgShortInt ()) {
+           return TRUE;
+         }
+         /*@fallthrough@*/
+       case CTX_LINT:
+         if (c2 == CTX_INT && context_msgLongInt ()) {
+           return TRUE;
+         }
+         /*@fallthrough@*/
+       case CTX_LLINT:
+         return (c2 == CTX_CHAR && context_msgCharInt ());
+       case CTX_UINT:
+       case CTX_USINT:
+       case CTX_ULINT:
+       case CTX_ULLINT:
+         return (c2 == CTX_UCHAR && context_msgCharInt ());
+       case CTX_UCHAR:
+         return (c2 == CTX_UINT && context_msgCharInt ());
+       case CTX_CHAR:
+         return ((c2 == CTX_INT || c2 == CTX_SINT)
+                 && context_msgCharInt ());
+       default:
+         return FALSE;
        }
     }
 }
@@ -388,6 +479,48 @@ bool cprim_isInt (cprim c)
          || (cprim_isAnyChar (c) && context_msgCharInt ()));
 }
     
-
-
-
+int cprim_getExpectedBits (cprim c)
+{
+  /* Any basis to these numbers?  Just guesses for now..., check ISO spec */
+  switch (c)
+    {
+    case CTX_UNKNOWN:
+      return 0;
+    case CTX_VOID:
+      return 0;
+    case CTX_CHAR:
+      return 8;
+    case CTX_UCHAR:
+      return 8;
+   case CTX_DOUBLE:
+      return 64;
+    case CTX_LDOUBLE:
+      return 128;
+    case CTX_FLOAT:
+      return 32;
+    case CTX_INT:
+      return 32;
+    case CTX_LINT:
+      return 64;
+    case CTX_LLINT:
+      return 128;
+    case CTX_ULLINT:
+      return 128;
+    case CTX_SINT:
+      return 8;
+    case CTX_UINT:
+      return 32;
+    case CTX_ULINT:
+      return 64;
+    case CTX_USINT:
+      return 8;
+    case CTX_UNSIGNEDINTEGRAL:
+      return 64;
+    case CTX_SIGNEDINTEGRAL:
+      return 64;
+    case CTX_ANYINTEGRAL:
+      return 64;
+    default:
+      return 0;
+    }
+}
This page took 0.508152 seconds and 4 git commands to generate.