]> git.saurik.com Git - bison.git/commitdiff
bison: avoid warnings from static code analysis
authorAkim Demaille <akim@lrde.epita.fr>
Fri, 9 Jan 2015 13:21:09 +0000 (14:21 +0100)
committerAkim Demaille <akim@lrde.epita.fr>
Fri, 9 Jan 2015 14:27:59 +0000 (15:27 +0100)
A static analysis tool reports that some callers of symbol_list_n_get
might get NULL and not handle it properly.  This is not the case, yet
we can suppress this pattern.

Reported by Mike Sullivan.
<https://lists.gnu.org/archive/html/bug-bison/2013-12/msg00027.html>

* src/symlist.c (symbol_list_n_get): Actually it is never called
to return 0.  Enforce this postcondition via aver.
(symbol_list_n_type_name_get): Simplify accordingly.  In particular,
discards a (translated) useless error message.
* src/symlist.h: Adjust documentation.
* src/scan-code.l: Style change.

THANKS
po/POTFILES.in
src/scan-code.l
src/symlist.c
src/symlist.h

diff --git a/THANKS b/THANKS
index d5feb16e33623d01c8f084bcf69fc466220be285..4fc99849e0364ea7adf1bcf0ff117655fe9aa582 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -91,6 +91,7 @@ Michel d'Hooge            michel.dhooge@gmail.com
 Michiel De Wilde          mdewilde.agilent@gmail.com
 Mickael Labau             labau_m@epita.fr
 Mike Castle               dalgoda@ix.netcom.com
+Mike Sullivan             Mike.sullivan@Oracle.COM
 Neil Booth                NeilB@earthling.net
 Nelson H. F. Beebe        beebe@math.utah.edu
 Nick Bowler               nbowler@elliptictech.com
index ee34879a8fea96ecd9c7d03419df6bf0156cea96..8086f556f2803b57f857d5fe557cc3801c9b5108 100644 (file)
@@ -15,7 +15,6 @@ src/reduce.c
 src/scan-code.l
 src/scan-gram.l
 src/scan-skel.l
-src/symlist.c
 src/symtab.c
 
 djgpp/subpipe.c
index f90916c1f0f2fbc3df9530d7f77017a801ec0001..308d1d0dfcf6e2fa0b351723c374841ae068b5bd 100644 (file)
@@ -711,7 +711,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
                       "]b4_rhs_value(%d, %d, ", effective_rule_length, n);
       obstack_quote (&obstack_for_string, type_name);
       obstack_sgrow (&obstack_for_string, ")[");
-      if (n > 0)
+      if (0 < n)
         symbol_list_n_get (effective_rule, n)->action_props.is_value_used =
           true;
       break;
index b58cf5c70b990148cb2b0c9f9ee9c9865b0dcc5b..d851463626a47dc5aa2a24ed9acb108857798a43 100644 (file)
@@ -21,7 +21,6 @@
 #include <config.h>
 #include "system.h"
 
-#include "complain.h"
 #include "symlist.h"
 
 /*--------------------------------------.
@@ -174,22 +173,17 @@ symbol_list *
 symbol_list_n_get (symbol_list *l, int n)
 {
   int i;
-
-  if (n < 0)
-    return NULL;
-
+  aver (0 <= n);
   for (i = 0; i < n; ++i)
     {
       l = l->next;
-      if (l == NULL
-          || (l->content_type == SYMLIST_SYMBOL && l->content.sym == NULL))
-        return NULL;
+      aver (l);
     }
-
+  aver (l->content_type == SYMLIST_SYMBOL);
+  aver (l->content.sym);
   return l;
 }
 
-
 /*--------------------------------------------------------------.
 | Get the data type (alternative in the union) of the value for |
 | symbol N in symbol list L.                                    |
@@ -198,21 +192,14 @@ symbol_list_n_get (symbol_list *l, int n)
 uniqstr
 symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
 {
-  l = symbol_list_n_get (l, n);
-  if (!l)
-    {
-      complain (&loc, complaint, _("invalid $ value: $%d"), n);
-      return NULL;
-    }
-  aver (l->content_type == SYMLIST_SYMBOL);
-  return l->content.sym->type_name;
+  return symbol_list_n_get (l, n)->content.sym->type_name;
 }
 
 bool
 symbol_list_null (symbol_list *node)
 {
-  return !node ||
-    (node->content_type == SYMLIST_SYMBOL && !(node->content.sym));
+  return (!node
+          || (node->content_type == SYMLIST_SYMBOL && !node->content.sym));
 }
 
 void
index 639b593bef8607597f1b1e0630c2ff324669dfa9..aeb4622908246f3204ff789dc516da65bc7285b6 100644 (file)
@@ -116,7 +116,10 @@ void symbol_list_free (symbol_list *list);
 /** Return the length of \c l. */
 int symbol_list_length (symbol_list const *l);
 
-/** Get item \c n in symbol list \c l.  */
+/** Get item \c n in symbol list \c l.
+ ** \pre  0 <= n
+ ** \post res != NULL
+ **/
 symbol_list *symbol_list_n_get (symbol_list *l, int n);
 
 /* Get the data type (alternative in the union) of the value for