]> andersk Git - splint.git/blobdiff - src/exprNode.c
Fixed bug reproted by Jim Francis. Bug was triggered by running splint on typedef...
[splint.git] / src / exprNode.c
index 29d0e566bc604aef9517177f6574bc880dd13463..fbccd3410ff157da05351b7815416238bd7ab7fd 100644 (file)
@@ -17,8 +17,8 @@
 ** 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 information on splint: info@splint.org
+** To report a bug: splint-bug@splint.org
 ** For more information: http://www.splint.org
 */
 /*
@@ -26,7 +26,7 @@
 */
 
 # include <ctype.h> /* for isdigit */
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
 # include "basic.h"
 # include "cgrammar.h"
 # include "cgrammar_tokens.h"
@@ -979,7 +979,7 @@ exprNode exprNode_createId (/*@observer@*/ uentry c)
       
       /*
       ** yoikes!  leaving this out was a heinous bug...that would have been
-      ** caught if i had lclint working first.  gag!
+      ** caught if i had splint working first.  gag!
       */
       
       e->etext = cstring_undefined;
@@ -1009,7 +1009,7 @@ exprNode exprNode_createId (/*@observer@*/ uentry c)
       e->msets = sRefSet_new ();
       e->uses = sRefSet_new ();
       
-      /*> missing fields, detected by lclint <*/
+      /*> missing fields, detected by splint <*/
       e->exitCode = XK_NEVERESCAPE;
       e->isJumpPoint = FALSE;
       e->canBreak = FALSE;
@@ -1057,30 +1057,53 @@ static void exprNode_checkStringLiteralLength (ctype t1, exprNode e2)
 
   if (ctype_isFixedArray (t1))
     {
+
       int nelements = long_toInt (ctype_getArraySize (t1));
       
       llassert (multiVal_isString (mval));
       slit = multiVal_forceString (mval);
-      len = cstring_length (slit);
+      
+      len = cstring_lengthExpandEscapes (slit);
+      
       
       if (len == nelements)
        {
+         mstring temp;
+
+         temp = cstring_expandEscapes(slit);
+
+         if (temp[len-1] == '\0')
+           {
+             voptgenerror 
+               (FLG_STRINGLITNOROOMFINALNULL,
+                message ("String literal with %d character%& "
+                         "is assigned to %s (no room for final null terminator): %s",
+                         len + 1,
+                         ctype_unparse (t1),
+                         exprNode_unparse (e2)),
+                e2->loc);
+           }
+         else
+           {
+         
+         
          voptgenerror 
            (FLG_STRINGLITNOROOM,
             message ("String literal with %d character%& "
                      "is assigned to %s (no room for null terminator): %s",
-                     cstring_length (slit),
+                     len + 1,
                      ctype_unparse (t1),
                      exprNode_unparse (e2)),
-            e2->loc);                        
+            e2->loc);
+           }
        }
       else if (len > nelements) 
        {
          voptgenerror 
            (FLG_STRINGLITTOOLONG,
-            message ("Stirng literal with %d character%& (counting null terminator) "
+            message ("String literal with %d character%& (counting null terminator) "
                      "is assigned to %s (insufficient storage available): %s",
-                     cstring_length (slit),
+                     len + 1,
                      ctype_unparse (t1),
                      exprNode_unparse (e2)),
             e2->loc);                        
@@ -1090,7 +1113,7 @@ static void exprNode_checkStringLiteralLength (ctype t1, exprNode e2)
          voptgenerror 
            (FLG_STRINGLITSMALLER,
             message ("String literal with %d character%& is assigned to %s (possible waste of storage): %s",
-                     cstring_length (slit),
+                     len + 1,
                      ctype_unparse (t1),
                      exprNode_unparse (e2)),
             e2->loc);    
@@ -1194,7 +1217,7 @@ exprNode_arrayFetch (/*@only@*/ exprNode e1, /*@only@*/ exprNode e2)
  
       /*
       ** this sets up funny aliasing, that leads to spurious
-      ** lclint errors.  Hence, the i2 comments.
+      ** splint errors.  Hence, the i2 comments.
       */
 
       /* evans 2001-09-09 added ctype_isKnown so there is no swap when e1 type is unknown */
@@ -3142,7 +3165,7 @@ checkGlobMods (/*@notnull@*/ /*@dependent@*/ exprNode f,
   if (freshMods)
     {
       /*
-      ** Spurious errors reported, because lclint can't tell
+      ** Spurious errors reported, because splint can't tell
       ** mods must be fresh if freshMods is true.
       */
 
@@ -6773,6 +6796,11 @@ bool exprNode_isEmptyStatement (exprNode e)
          && (lltok_isSemi (exprData_getTok (e->edata))));
 }
 
+void exprNode_checkIfPred (exprNode pred)
+{
+  exprNode_checkPred (cstring_makeLiteralTemp ("if"), pred);
+}
+
 exprNode exprNode_if (/*@only@*/ exprNode pred, /*@only@*/ exprNode tclause)
 {
   exprNode ret;
@@ -6822,8 +6850,8 @@ exprNode exprNode_if (/*@only@*/ exprNode pred, /*@only@*/ exprNode tclause)
             message ("Predicate always exits: %s", exprNode_unparse (pred)),
             exprNode_loc (pred));
        }
-
-      exprNode_checkPred (cstring_makeLiteralTemp ("if"), pred);
+      
+      /*! exprNode_checkPred (cstring_makeLiteralTemp ("if"), pred); */ /*@i523@*/
       exprNode_checkUse (pred, pred->sref, pred->loc);
       
       if (!exprNode_isError (tclause))
@@ -6952,7 +6980,7 @@ exprNode exprNode_ifelse (/*@only@*/ exprNode pred,
             exprNode_loc (pred));
        }
       
-      exprNode_checkPred (cstring_makeLiteralTemp ("if"), pred);
+      /*@i3423 exprNode_checkPred (cstring_makeLiteralTemp ("if"), pred);*/
       exprNode_checkUse (ret, pred->sref, pred->loc);
       
       exprNode_mergeCondUSs (ret, tclause, eclause);
@@ -7016,7 +7044,7 @@ checkSwitchExpr (exprNode test, /*@dependent@*/ exprNode e, /*@out@*/ bool *allp
              if (hasDefault)
                {
                  voptgenerror 
-                   (FLG_CONTROL,
+                   (FLG_DUPLICATECASES,
                     message ("Duplicate default cases in switch"),
                     exprNode_loc (current));
                }          
@@ -7044,7 +7072,7 @@ checkSwitchExpr (exprNode test, /*@dependent@*/ exprNode e, /*@out@*/ bool *allp
                                  (/*@-usedef@*/usedEnums/*@=usedef@*/, cname))
                                {
                                  voptgenerror
-                                   (FLG_CONTROL,
+                                   (FLG_DUPLICATECASES,
                                     message ("Duplicate case in switch: %s", 
                                              cname),
                                     current->loc);
@@ -7378,7 +7406,7 @@ exprNode exprNode_while (/*@keep@*/ exprNode t, /*@keep@*/ exprNode b)
   if (exprNode_isDefined (t) && exprNode_mustEscape (t))
     {
       voptgenerror
-       (FLG_CONTROL,
+       (FLG_ALWAYSEXITS,
         message ("Predicate always exits: %s", exprNode_unparse (t)),
         exprNode_loc (t));
     }
@@ -8090,7 +8118,7 @@ static bool exprNode_checkOneInit (/*@notnull@*/ exprNode el, exprNode val)
   if (exprNode_isDefined (val) && val->kind == XPR_INITBLOCK)
     {
       exprNodeList vals = exprData_getArgs (val->edata);
-
+      
       DPRINTF (("Check one init: %s", exprNodeList_unparse (vals)));
       DPRINTF (("Type: %s", ctype_unparse (t1)));
 
@@ -8103,6 +8131,9 @@ static bool exprNode_checkOneInit (/*@notnull@*/ exprNode el, exprNode val)
            {
              int nelements = long_toInt (ctype_getArraySize (t1));
              
+             DPRINTF (("Checked array: %s / %d",
+                       ctype_unparse (t1), nelements));
+
              if (exprNode_isStringLiteral (val))
                {
                  exprNode_checkStringLiteralLength (t1, val);
@@ -8514,7 +8545,7 @@ exprNode exprNode_iter (/*@observer@*/ uentry name,
 
   if (uentry_isInvalid (end))
     {
-      llerror (FLG_ITER,
+      llerror (FLG_ITERBALANCE,
               message ("Iter %s not balanced with end_%s", iname, iname));
     }
   else
@@ -8523,14 +8554,14 @@ exprNode exprNode_iter (/*@observer@*/ uentry name,
 
       if (!cstring_equalPrefixLit (ename, "end_"))
        {
-         llerror (FLG_ITER, message ("Iter %s not balanced with end_%s: %s", 
+         llerror (FLG_ITERBALANCE, message ("Iter %s not balanced with end_%s: %s", 
                                      iname, iname, ename));
        }
       else
        {
          if (!cstring_equal (iname, cstring_suffix (ename, 4)))
            {
-             llerror (FLG_ITER, 
+             llerror (FLG_ITERBALANCE
                       message ("Iter %s not balanced with end_%s: %s", 
                                iname, iname, ename));
            }
@@ -8581,7 +8612,7 @@ exprNode_iterNewId (/*@only@*/ cstring s)
   e->isJumpPoint = FALSE;
   e->exitCode = XK_NEVERESCAPE;
 
-  /*> missing fields, detected by lclint <*/
+  /*> missing fields, detected by splint <*/
   e->canBreak = FALSE;
   e->mustBreak = FALSE;
   e->etext = cstring_undefined;
@@ -8657,7 +8688,7 @@ exprNode_iterExpr (/*@returned@*/ exprNode e)
          if (fileloc_isDefined (e->loc))
            {
              voptgenerror
-               (FLG_ITER,
+               (FLG_ITERYIELD,
                 message ("Yield parameter is not simple identifier: %s", 
                          exprNode_unparse (e)),
                 e->loc);
@@ -8665,7 +8696,7 @@ exprNode_iterExpr (/*@returned@*/ exprNode e)
          else
            {
              voptgenerror
-               (FLG_ITER,
+               (FLG_ITERYIELD,
                 message ("Yield parameter is not simple identifier: %s",
                          exprNode_unparse (e)),
                 g_currentloc);
@@ -8708,7 +8739,7 @@ exprNode_iterId (/*@observer@*/ uentry c)
       if (!context_inHeader ())
        {
          if (optgenerror
-             (FLG_ITER,
+             (FLG_ITERYIELD,
               message ("Yield parameter shadows local declaration: %q",
                        uentry_getName (c)),
               fileloc_isDefined (e->loc) ? e->loc : g_currentloc))
@@ -10262,7 +10293,7 @@ checkOneArg (uentry ucurrent, /*@notnull@*/ exprNode current,
            }
        }
       
-      checkPassTransfer (current, ucurrent, isSpec, fcn, argno, totargs);
+      transferChecks_passParam (current, ucurrent, isSpec, fcn, argno, totargs);
       exprNode_mergeUSs (fcn, current);
     }
 }
@@ -10856,11 +10887,11 @@ doAssign (/*@notnull@*/ exprNode e1, /*@notnull@*/ exprNode e2, bool isInit)
        {
            DPRINTF (("Check init: %s / %s",
                      exprNode_unparse (e1), exprNode_unparse (e2)));
-         checkInitTransfer (e1, e2); 
+         transferChecks_initialization (e1, e2); 
        }
       else
        {
-         checkAssignTransfer (e1, e2); 
+         transferChecks_assign (e1, e2); 
        }
     }
   else
This page took 0.082921 seconds and 4 git commands to generate.