https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602
Bug ID: 69602
Summary: over-ambitious logical-op warning on EAGAIN vs
EWOULDBLOCK
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: eblake at redhat dot com
Target Milestone: ---
POSIX says that EAGAIN and EWOULDBLOCK may be identical, but also that they may
be distinct. Therefore, well-written portable code MUST check for both values
in some circumstances.
However, as shown by the sample code below, gcc 6.0's new warning is
over-ambitious, and is likely to _cause_ rather than cure user bugs, when
uninformed users unaware that Linux has the two errno values equal dumb down
the code to silence the warning, but in the process break their code on other
platforms where it is important to check for both values.
$ cat foo.c
#include <errno.h>
int main(void) {
if (errno == EAGAIN || errno == EWOULDBLOCK)
return 1;
return 0;
}
$ gcc -o foo foo.c -Werror=logical-op
foo.c: In function 'main':
foo.c:3:23: error: logical 'or' of equal expressions [-Werror=logical-op]
if (errno == EAGAIN || errno == EWOULDBLOCK)
^~
cc1: some warnings being treated as errors
$ gcc --version | head -n1
gcc (GCC) 6.0.0 20160129 (Red Hat 6.0.0-0.7)