https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61846
Bug ID: 61846 Summary: gcc assumes errno might be negative and issues unnecessary warning Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: zbyszek at in dot waw.pl Created attachment 33148 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33148&action=edit sample program I see this a lot in systemd source code, where the convention is to return a negative integer on error. gcc warns as if errno could also be zero or negative after a system call, and warns about unitialized variables. Simplified example attached. $ gcc -Wall -O3 -std=gnu99 -o readwarn readwarn.c readwarn.c: In function ‘main’: readwarn.c:28:9: warning: ‘ans’ may be used uninitialized in this function [-Wmaybe-uninitialized] printf("ans: %d", ans); ^ POSIX states that errno values are positive [1], and read may sets errno, so it is safe to assume that if read() returned -1, errno must have a positive value. If I replace 'return -errno' with 'return errno > 0 ? -errno : -EIO', the warning disappers. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html#tag_13_10