diff options
author | Akim Demaille <akim@lrde.epita.fr> | 2015-01-09 14:21:09 +0100 |
---|---|---|
committer | Akim Demaille <akim@lrde.epita.fr> | 2015-01-09 15:27:59 +0100 |
commit | 671850a1c3e1aaac93a89fabc6d810be6a4a77fe (patch) | |
tree | cd8043aceb07a11f2871e91770263db7243c4433 /src/symlist.c | |
parent | ee028dceff390a23da391900b5b7fe651cfe320c (diff) | |
download | bison-671850a1c3e1aaac93a89fabc6d810be6a4a77fe.tar.gz |
bison: avoid warnings from static code analysis
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.
Diffstat (limited to 'src/symlist.c')
-rw-r--r-- | src/symlist.c | 27 |
1 files changed, 7 insertions, 20 deletions
diff --git a/src/symlist.c b/src/symlist.c index b58cf5c7..d8514636 100644 --- a/src/symlist.c +++ b/src/symlist.c @@ -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 |