aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-05-18 02:18:49 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-05-21 17:53:57 +0200
commit537e3e2daebd37d69447e65535fc94e82b38fc18 (patch)
treecbc2e143ad063784905371f9071f7196757c8c68
parent850c8625ae784a08094f30dde9c85b74e369bacd (diff)
downloadsparse-537e3e2daebd37d69447e65535fc94e82b38fc18.tar.gz
univ-init: conditionally accept { 0 } without warnings
In standard C '{ 0 }' is valid to initialize any compound object. OTOH, Sparse allows '{ }' for the same purpose but: 1) '{ }' is not standard 2) Sparse warns when using '0' to initialize pointers. Some projects (git) legitimately like to be able to use the standard '{ 0 }' without the null-pointer warnings So, add a new warning flag (-Wno-universal-initializer) to handle '{ 0 }' as '{ }', suppressing the warnings. Reference: https://lore.kernel.org/git/1df91aa4-dda5-64da-6ae3-5d65e50a55c5@ramsayjones.plus.com/ Reference: https://lore.kernel.org/git/e6796c60-a870-e761-3b07-b680f934c537@ramsayjones.plus.com/ Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--lib.c2
-rw-r--r--lib.h1
-rw-r--r--parse.c7
-rw-r--r--sparse.18
-rw-r--r--validation/Wuniv-init-ko.c14
-rw-r--r--validation/Wuniv-init-ok.c11
6 files changed, 43 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index f9ec285e..9ee8d3cf 100644
--- a/lib.c
+++ b/lib.c
@@ -295,6 +295,7 @@ int Wtransparent_union = 0;
int Wtypesign = 0;
int Wundef = 0;
int Wuninitialized = 1;
+int Wuniversal_initializer = 1;
int Wunknown_attribute = 0;
int Wvla = 1;
@@ -782,6 +783,7 @@ static const struct flag warnings[] = {
{ "typesign", &Wtypesign },
{ "undef", &Wundef },
{ "uninitialized", &Wuninitialized },
+ { "universal-initializer", &Wuniversal_initializer },
{ "unknown-attribute", &Wunknown_attribute },
{ "vla", &Wvla },
};
diff --git a/lib.h b/lib.h
index b18295a8..5e6db111 100644
--- a/lib.h
+++ b/lib.h
@@ -184,6 +184,7 @@ extern int Wtransparent_union;
extern int Wtypesign;
extern int Wundef;
extern int Wuninitialized;
+extern int Wuniversal_initializer;
extern int Wunknown_attribute;
extern int Wvla;
diff --git a/parse.c b/parse.c
index a29c67c8..48494afc 100644
--- a/parse.c
+++ b/parse.c
@@ -2750,6 +2750,13 @@ static struct token *initializer_list(struct expression_list **list, struct toke
{
struct expression *expr;
+ // '{ 0 }' is equivalent to '{ }' unless wanting all possible
+ // warnings about using '0' to initialize a null-pointer.
+ if (!Wuniversal_initializer) {
+ if (match_token_zero(token) && match_op(token->next, '}'))
+ token = token->next;
+ }
+
for (;;) {
token = single_initializer(&expr, token);
if (!expr)
diff --git a/sparse.1 b/sparse.1
index 574caef3..50e92839 100644
--- a/sparse.1
+++ b/sparse.1
@@ -428,6 +428,14 @@ However, this behavior can lead to subtle errors.
Sparse does not issue these warnings by default.
.
+.TP
+.B \-Wuniversal\-initializer
+Do not suppress warnings about 0 used to initialize a null-pointer
+when using '{ 0 }' as initializer.
+
+Sparse issues these warnings by default. To turn them off, use
+\fB\-Wno\-universal\-initializer\fR.
+.
.SH MISC OPTIONS
.TP
.B \-\-arch=\fIARCH\fR
diff --git a/validation/Wuniv-init-ko.c b/validation/Wuniv-init-ko.c
new file mode 100644
index 00000000..315c211a
--- /dev/null
+++ b/validation/Wuniv-init-ko.c
@@ -0,0 +1,14 @@
+struct s {
+ void *ptr;
+};
+
+
+static struct s s = { 0 };
+
+/*
+ * check-name: univ-init-ko
+ *
+ * check-error-start
+Wuniv-init-ko.c:6:23: warning: Using plain integer as NULL pointer
+ * check-error-end
+ */
diff --git a/validation/Wuniv-init-ok.c b/validation/Wuniv-init-ok.c
new file mode 100644
index 00000000..c3964751
--- /dev/null
+++ b/validation/Wuniv-init-ok.c
@@ -0,0 +1,11 @@
+struct s {
+ void *ptr;
+};
+
+
+static struct s s = { 0 };
+
+/*
+ * check-name: univ-init-ok
+ * check-command: sparse -Wno-universal-initializer $file
+ */