chiark / gitweb /
util: introduce negative_errno()
authorDavid Herrmann <dh.herrmann@gmail.com>
Mon, 3 Nov 2014 17:23:28 +0000 (18:23 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Tue, 4 Nov 2014 07:27:31 +0000 (08:27 +0100)
commit44dd2c6e861316d26a78848eb0f6b35bd3b82d4b
tree5c7fddebd5c4d70bb501148482c343213735b9cb
parente6c019026b8cfd27a997e6e6ed1349f8f289b7e2
util: introduce negative_errno()

Imagine a constructor like this:

        int object_new(void **out) {
                void *my_object;
                int r;

                ...
                r = ioctl(...);
                if (r < 0)
                        return -errno;
                ...

                *out = my_object;
                return 0;
        }

We have a lot of those in systemd. If you now call those, gcc might inline
the call and optimize it. However, gcc cannot know that "errno" is
negative if "r" is. Therefore, a caller like this will produce warnings:

        r = object_new(&obj);
        if (r < 0)
                return r;

        obj->xyz = "foobar";

In case the ioctl in the constructor fails, gcc might assume "errno" is 0
and thus the error-handling is not triggered. Therefore, "obj" is
uninitialized, but accessed. Gcc will warn about that.

The new negative_errno() helper can be used to mitigate those warnings.
The helper is guaranteed to return a negative integer. Furthermore, it
spills out runtime warnings if "errno" is non-negative.

Instead of returning "-errno", you can use:
        return negative_errno();

gcc will no longer assume that this can return >=0, thus, it will not warn
about it.

Use this new helper in libsystemd-terminal to fix some grdev-drm warnings.
src/libsystemd-terminal/grdev-drm.c
src/shared/util.h