]> andersk Git - splint.git/blobdiff - src/flagMarkerList.c
changed PLUS to BINARYOP_PLUS
[splint.git] / src / flagMarkerList.c
index cd3fe675891698acd8e1cb3012f35a155f0b430c..16899756e215681681cb2272794cbebdca530e27 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** LCLint - annotation-assisted static program checker
-** Copyright (C) 1994-2000 University of Virginia,
+** Copyright (C) 1994-2001 University of Virginia,
 **         Massachusetts Institute of Technology
 **
 ** This program is free software; you can redistribute it and/or modify it
@@ -34,6 +34,8 @@
 # include "lclintMacros.nf"
 # include "basic.h"
 
+static int flagMarkerList_lastBeforeLoc (flagMarkerList p_s, fileloc p_loc) /*@*/ ;
+
 flagMarkerList
   flagMarkerList_new ()
 {
@@ -70,40 +72,44 @@ flagMarkerList_grow (flagMarkerList s)
 void flagMarkerList_add (flagMarkerList s, flagMarker fm)
 {
   int i = s->nelements - 1;
+  int lastloc;
+
+  DPRINTF (("Flag marker: %s", flagMarker_unparse (fm)));
 
-  
   if (i > 0)
     {
       flagMarker last = s->elements[i];
 
-      
       if (flagMarker_isIgnoreCount (last))
        {
          if (!flagMarker_isIgnoreOff (fm))
            {
              if (flagMarker_isLocalSet (fm))
                {
-                 llforceerror 
-                   (FLG_WARNFLAGS,
-                    cstring_makeLiteral ("Cannot set flag inside ignore "
-                                         "count region."),
-                    flagMarker_getLoc (fm));
-                 llgenindentmsg 
-                   (cstring_makeLiteral ("Ignore count region starts"),
-                    flagMarker_getLoc (last));
-
+                 if (llforceerror 
+                     (FLG_WARNFLAGS,
+                      cstring_makeLiteral ("Cannot set flag inside ignore "
+                                           "count region."),
+                      flagMarker_getLoc (fm)))
+                   {
+                     llgenindentmsg 
+                       (cstring_makeLiteral ("Ignore count region starts"),
+                        flagMarker_getLoc (last));
+                   }
                }
              else 
                {
                  if (flagMarker_isIgnoreOn (fm)) 
                    {
-                     llforceerror 
-                       (FLG_WARNFLAGS,
-                        cstring_makeLiteral ("Cannot nest ignore regions."),
-                        flagMarker_getLoc (fm));
-                     llgenindentmsg 
-                       (cstring_makeLiteral ("Previous ignore region starts"),
-                        flagMarker_getLoc (last));
+                     if (llforceerror 
+                         (FLG_WARNFLAGS,
+                          cstring_makeLiteral ("Cannot nest ignore regions."),
+                          flagMarker_getLoc (fm)))
+                       {
+                         llgenindentmsg 
+                           (cstring_makeLiteral ("Previous ignore region starts"),
+                            flagMarker_getLoc (last));
+                       }
                    }
                }
 
@@ -116,37 +122,42 @@ void flagMarkerList_add (flagMarkerList s, flagMarker fm)
          if (flagMarker_isIgnoreOff (last))
            {
              flagMarker nlast = s->elements [i - 1];
-             
+
              if (flagMarker_isIgnoreCount (nlast))
                {
-                 if (fileloc_sameFile (flagMarker_getLoc (fm),
-                                       flagMarker_getLoc (last))
-                     && fileloc_notAfter (flagMarker_getLoc (fm), 
-                                          flagMarker_getLoc (last)))
+                 if (fileloc_sameFileAndLine (flagMarker_getLoc (fm),
+                                              flagMarker_getLoc (nlast)))
                    {
                      if (flagMarker_isLocalSet (fm))
                        {
-                         llforceerror 
-                           (FLG_WARNFLAGS,
-                            cstring_makeLiteral ("Cannot set flag inside ignore "
-                                                 "count region."),
-                            flagMarker_getLoc (fm));
-                         llgenindentmsg 
-                           (cstring_makeLiteral ("Ignore count region starts"),
-                            flagMarker_getLoc (nlast));
-                         
+                         if (llforceerror 
+                             (FLG_WARNFLAGS,
+                              cstring_makeLiteral ("Cannot set flag inside ignore "
+                                                   "count region."),
+                              flagMarker_getLoc (fm))) 
+                           {
+                             llgenindentmsg 
+                               (cstring_makeLiteral ("Ignore count region starts"),
+                                flagMarker_getLoc (nlast));
+                             DPRINTF (("Last: %s / %s",
+                                       fileloc_unparse (flagMarker_getLoc (last)),
+                                       fileloc_unparse (flagMarker_getLoc (fm))));
+                             
+                           }
                        }
                      else 
                        {
                          if (flagMarker_isIgnoreOn (fm)) 
                            {
-                             llforceerror 
-                               (FLG_WARNFLAGS,
-                                cstring_makeLiteral ("Cannot nest ignore regions."),
-                                flagMarker_getLoc (fm));
-                             llgenindentmsg 
-                               (cstring_makeLiteral ("Previous ignore region starts"),
-                                flagMarker_getLoc (nlast));
+                             if (llforceerror 
+                                 (FLG_WARNFLAGS,
+                                  cstring_makeLiteral ("Cannot nest ignore regions."),
+                                  flagMarker_getLoc (fm))) 
+                               {
+                                 llgenindentmsg 
+                                   (cstring_makeLiteral ("Previous ignore region starts"),
+                                    flagMarker_getLoc (nlast));
+                               }
                            }
                        }
                      
@@ -158,30 +169,12 @@ void flagMarkerList_add (flagMarkerList s, flagMarker fm)
        }
     }
 
-  
-  /*
-  ** all this code is necessary to check the invariant is preserved
-  */
-
-  while (i > 0
-        && !flagMarker_sameFile (s->elements[i],
-                                 flagMarker_getLoc (fm))) 
-    {
-      i--;
-    }
 
   /*
-  ** reprocessing header file, okay to be out of order
+  ** Need to insert this flag in the right place (after the last before loc flag)
   */
 
-  if (i >= 0 && !fileloc_isHeader (flagMarker_getLoc (fm)))
-    {
-                  
-      /*
-      llassert (!flagMarker_beforeMarker (s->elements[i], 
-                                         flagMarker_getLoc (fm)));
-                                         */
-    }
+  lastloc = flagMarkerList_lastBeforeLoc (s, flagMarker_getLoc (fm));
 
   if (s->nspace <= 0)
     {
@@ -189,9 +182,31 @@ void flagMarkerList_add (flagMarkerList s, flagMarker fm)
     }
   
   s->nspace--;
-  s->elements[s->nelements] = fm;
+
+  if (lastloc == -1)
+    {
+      /* Add it to the end of the list */
+      s->elements[s->nelements] = fm;
+    }
+  else
+    {
+      DPRINTF (("Inserting: %s in %s", 
+               flagMarker_unparse (fm),
+               flagMarkerList_unparse (s)));
+
+      /* Insert it at location lastloc + 1, push other flags down */
+      for (i = s->nelements; i > lastloc + 1; i--)
+       {
+         s->elements [i] = s->elements [i - 1];
+       }
+
+      s->elements [lastloc + 1] = fm;
+
+    }
+
   s->nelements++;
-  }
+  DPRINTF (("Add flag ==> %s", flagMarkerList_unparse (s)));
+}
 
 void flagMarkerList_checkSuppressCounts (flagMarkerList s)
 {
@@ -200,11 +215,13 @@ void flagMarkerList_checkSuppressCounts (flagMarkerList s)
   fileloc loc = fileloc_undefined;
   bool inCount = FALSE;
   int i;
-
   
   for (i = 0; i < s->nelements; i++)
     {
       flagMarker current = s->elements[i];
+      DPRINTF (("flagMarker: %s / %s",
+               flagMarker_unparse (current),
+               bool_unparse (inCount)));
 
       if (flagMarker_isIgnoreCount (current))
        {
@@ -213,7 +230,7 @@ void flagMarkerList_checkSuppressCounts (flagMarkerList s)
          nexpected = flagMarker_getCount (current);
          loc = flagMarker_getLoc (current);
          nsuppressed = 0;
-               }
+       }
       else if (flagMarker_isIgnoreOff (current))
        {
          if (inCount)
@@ -223,10 +240,11 @@ void flagMarkerList_checkSuppressCounts (flagMarkerList s)
 
              if (nexpected > 0 && nexpected != nsuppressed)
                {
-                 llforceerror 
+                 /* Must use forceerror to prevent self-suppression! */
+                 llforceerror
                    (FLG_SUPCOUNTS,
                     message 
-                    ("Line expects to suppress %d error%p, found %d error%p",
+                    ("Line expects to suppress %d error%&, found %d error%&",
                      nexpected, nsuppressed),
                     loc);
                }
@@ -341,13 +359,6 @@ flagMarkerList_lastBeforeLoc (flagMarkerList s, fileloc loc)
        {
          return i;
        }
-/*
-      if (flagMarker_sameFile (current, loc) 
-         && (!flagMarker_beforeMarker (current, loc)))
-       {
-         return i;
-       }
-*/
     }
 
   return -1;
@@ -373,10 +384,10 @@ flagMarkerList_suppressError (flagMarkerList s, flagcode code, fileloc loc)
     {
       i = flagMarkerList_lastBeforeLoc (s, loc);
     }
-
   
   if (i < 0)
     {
+      DPRINTF (("RETURNING!"));
       return MAYBE;
     }
   
@@ -387,10 +398,12 @@ flagMarkerList_suppressError (flagMarkerList s, flagcode code, fileloc loc)
   for (; i >= 0; i--) 
     {
       flagMarker current = s->elements[i];
-
       
+      DPRINTF (("Check current: %s", flagMarker_unparse (current)));
+
       if (!islib && !flagMarker_sameFile (current, loc))
        {
+         DPRINTF (("Not same file: %s", fileloc_unparse (loc)));
          break;
        }
 
@@ -434,7 +447,7 @@ flagMarkerList_suppressError (flagMarkerList s, flagcode code, fileloc loc)
                    }
                  else
                    {
-                                     flagOff = TRUE;
+                     flagOff = TRUE;
                      flagSet = MAYBE;
                    }
                  
@@ -470,7 +483,7 @@ flagMarkerList_suppressError (flagMarkerList s, flagcode code, fileloc loc)
                    }
                  else
                    {
-                                     nameChecksOff = TRUE;
+                     nameChecksOff = TRUE;
                      flagSet = MAYBE;
                    }
                  
This page took 0.071845 seconds and 4 git commands to generate.