chiark / gitweb /
sd-bus: silence format warnings in kdbus code (#6072)
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 3 Jun 2017 09:41:17 +0000 (05:41 -0400)
committerSven Eden <yamakuzure@gmx.net>
Tue, 25 Jul 2017 07:46:52 +0000 (09:46 +0200)
The code is mostly correct, but gcc is trying to outsmart us, and emits a
warning for a "llu vs lu" mismatch, even though they are the same size (on alpha):

src/libelogind/sd-bus/bus-control.c: In function ‘kernel_get_list’:
src/libelogind/sd-bus/bus-control.c:267:42: error: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 3 has type ‘__u64 {aka long unsigned int}’ [-Werror=format=]
                         if (asprintf(&n, ":1.%llu", name->id) < 0) {
                                          ^
src/libelogind/sd-bus/bus-control.c: In function ‘bus_get_name_creds_kdbus’:
src/libelogind/sd-bus/bus-control.c:714:47: error: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 3 has type ‘__u64 {aka long unsigned int}’ [-Werror=format=]
                 if (asprintf(&c->unique_name, ":1.%llu", conn_info->id) < 0) {
                                               ^
This is hard to work around properly, because kdbus.h uses __u64 which is
defined-differently-despite-being-the-same-size then uint64_t. Thus the simple
solution of using %PRIu64 fails on amd64:

src/libelogind/sd-bus/bus-control.c:714:47: error: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘__u64 {aka long long unsigned int}’ [-Werror=format=]
                 if (asprintf(&c->unique_name, ":1.%"PRIu64, conn_info->id) < 0) {
                                               ^~~~~~

Let's just avoid the whole issue for now by silencing the warning.
After the next release, we should just get rid of the kdbus code.

Fixes #5561.

src/libelogind/sd-bus/bus-control.c
src/libelogind/sd-bus/bus-kernel.c

index b31549b03e9e8b6107a53bf0e53b29ad7b2b43c8..609904940c2d7950c5b187433c7d96a4dd4c14e4 100644 (file)
@@ -264,10 +264,13 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) {
                 if ((flags & KDBUS_LIST_UNIQUE) && name->id != previous_id && !(name->flags & KDBUS_HELLO_ACTIVATOR)) {
                         char *n;
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat"
                         if (asprintf(&n, ":1.%llu", name->id) < 0) {
                                 r = -ENOMEM;
                                 goto fail;
                         }
+#pragma GCC diagnostic pop
 
                         r = strv_consume(x, n);
                         if (r < 0)
@@ -711,10 +714,13 @@ int bus_get_name_creds_kdbus(
         }
 
         if (mask & SD_BUS_CREDS_UNIQUE_NAME) {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat"
                 if (asprintf(&c->unique_name, ":1.%llu", conn_info->id) < 0) {
                         r = -ENOMEM;
                         goto fail;
                 }
+#pragma GCC diagnostic pop
 
                 c->mask |= SD_BUS_CREDS_UNIQUE_NAME;
         }
index c7a47813930cba64e595c570748a1b839fe4254e..84a8b77669828714802d03418c2fbce5420cedc7 100644 (file)
@@ -51,6 +51,8 @@
 #include "user-util.h"
 #include "util.h"
 
+#pragma GCC diagnostic ignored "-Wformat"
+
 #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
 
 int bus_kernel_parse_unique_name(const char *s, uint64_t *id) {