[pacman-dev] [PATCH 2/2] Avoid false warning from gcc-6

Allan McRae allan at archlinux.org
Wed May 4 13:44:00 UTC 2016


On 04/05/16 23:08, Dave Reisner wrote:
> On Wed, May 04, 2016 at 05:42:29PM +1000, Allan McRae wrote:
>> The value EAGAIN is allowed by POSIX to be the same as EWOULDBLOCK, but this is
>> not guaranteed. Thus on some systems (e.g. glibc Linux), we get a warning that
>> the logical OR is being performed on two expressions of the same type. We can
>> not get rid of this test in case any system defines these as unique values.
>>
>> Use a pragma block to prevent any gcc warning on these tests.
>>
>> Signed-off-by: Allan McRae <allan at archlinux.org>
>> ---
>>  lib/libalpm/util.c | 8 ++++++++
>>  1 file changed, 8 insertions(+)
>>
>> diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
>> index 4a4847d..e105786 100644
>> --- a/lib/libalpm/util.c
>> +++ b/lib/libalpm/util.c
>> @@ -476,7 +476,11 @@ static int _alpm_chroot_write_to_child(alpm_handle_t *handle, int fd,
>>  		/* write was successful, remove the written data from the buffer */
>>  		*buf_size -= nwrite;
>>  		memmove(buf, buf + nwrite, *buf_size);
>> +
>> +/* EAGAIN may be the same value as EWOULDBLOCK (POSIX.1)  - prevent GCC warning */
>> +#pragma GCC diagnostic ignored "-Wlogical-op"
>>  	} else if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
>> +#pragma GCC diagnostic pop
> 
> Instead of repeating this pragma (and the comparison for that matter),
> why not just wrap it in a separate function? Something like:
> 
>   int should_retry(int errnum) {
>     return errnum == EAGAIN
>   #if EAGAIN != EWOULDBLOCK
>       || errnum == EWOULDBLOCK
>   #endif
>       || errnum == EINTR;
>   }
> 
> POSIX requires that constants in errno.h are defined as macros "and
> which shall be suitable for use in #if pre-processing directives".
> 

Much better way of handling this.  Thanks!

A


More information about the pacman-dev mailing list