[PATCH] DBusMessage: specify dbus_message_iter_get_fixed_array() arg precisely

Simon McVittie smcv at collabora.com
Wed Aug 7 15:44:48 UTC 2019


On Wed, 07 Aug 2019 at 15:11:39 +0200, Rafał Miłecki wrote:
> That function takes pointer to an array as the second argument. Specify
> its type precisely to help users avoid mistakes in calls.

Please use https://gitlab.freedesktop.org/dbus/dbus/issues
to report bugs and feature requests, and
https://gitlab.freedesktop.org/dbus/dbus/merge_requests to propose
changes.

However, I don't think we can apply the change you are proposing here.

>  void        dbus_message_iter_get_fixed_array  (DBusMessageIter *iter,
> -                                                void            *value,
> +                                                void            **value,
>                                                  int             *n_elements);

I don't think we can do this, because it's going to cause new compiler
warnings for legitimate code. The argument that people want to pass
to this function is (conceptually) a const dbus_int32_t **, or
const dbus_int64_t **, or whatever type corresponds to the type of the
array you're interested in, something like this:

    const dbus_int32_t *int32_array;
    int n, i;

    ...

    dbus_message_iter_get_fixed_array (&iter, &int32_array, &n);

    for (i = 0; i < n; i++)
      printf ("%d\n", int32_array[i];

But types like [const or not] dbus_int32_t ** are not considered to be
compatible with void ** by Standard C, which you can see by (for example)
making your proposed change to the header and recompiling the test/
directory:

> .../src/dbus/test/dbus-daemon.c: In function ‘test_creds’:
> .../src/dbus/test/dbus-daemon.c:496:59: error: passing argument 2 of ‘dbus_message_iter_get_fixed_array’ from incompatible pointer type [-Werror=incompatible-pointer-types]
>            dbus_message_iter_get_fixed_array (&array_iter, &groups, &len);
>                                                            ^~~~~~~
> In file included from .../src/dbus/dbus/dbus-connection.h:33,
>                  from .../src/dbus/dbus/dbus-bus.h:30,
>                  from .../src/dbus/dbus/dbus.h:31,
>                  from .../src/dbus/test/dbus-daemon.c:34:
> .../src/dbus/dbus/dbus-message.h:281:66: note: expected ‘void **’ but argument is of type ‘guint32 **’ {aka ‘unsigned int **’}
>                                                  void           **value,
>                                                  ~~~~~~~~~~~~~~~~~^~~~~

The only way this can work without warnings or casts is to go via a
generic pointer (void *), which is what the current code does.

    smcv


More information about the dbus mailing list