Re: [PATCH] build: work around gcc 6.0 warnings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 04/08/2016 12:27 PM, Andrea Bolognani wrote:
> On Mon, 2016-02-29 at 15:41 +0100, Martin Kletzander wrote:
>> On Wed, Feb 24, 2016 at 02:29:58PM -0700, Eric Blake wrote:
>>>  
>>> gcc 6.0 added an annoying warning:
>>>  
>>> fdstream.c: In function 'virFDStreamWrite':
>>> fdstream.c:390:29: error: logical 'or' of equal expressions [-Werror=logical-op]
>>>         if (errno == EAGAIN || errno == EWOULDBLOCK) {
>>>                             ^~
>>> fdstream.c: In function 'virFDStreamRead':
>>> fdstream.c:440:29: error: logical 'or' of equal expressions [-Werror=logical-op]
>>>         if (errno == EAGAIN || errno == EWOULDBLOCK) {
>>>                             ^~
>>>  
>>> This makes it impossible to build out-of-the-box on rawhide,
>>> and we aren't guaranteed that the gcc bug will be fixed in a
>>> timely manner:
>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602
>>>  
>>> So work around it by further complicating the logic to thwart the
>>> compiler.
>>>  
>>> Signed-off-by: Eric Blake <eblake@xxxxxxxxxx>
>>> ---
>>>  
>>> This is a build-breaker fix for rawhide; but I'll wait for a day
>>> for any reasons why I should not push it during freeze.
>>>  
>> It looks like you're still talking this over and thinking about
>> approaches.  But could we push the fix for the time being so that the
>> release is nicely buildable and then work on making it nicer later?  I'd
>> vote ACK for that.
> 
> Update: the libvirt-fedora-rawhide build host on CentOS CI
> has been updated and it's now running gcc 6.0. The immediate
> result is that build jobs have started to fail (see [1] for
> an example).
> 
> Looking at the gcc bug, it doesn't look like there's been
> much movement in that area, so I think we should take some
> action on our side...
> 
> Eric, you mentioned proposing a v2 that would use #pragma
> instead of uglifying the current checks. Do you still
> intend to work on such alternative approach?
> 

I've attached a patch with the pragma push/pop approach Eric mentioned.
Unfortunately it doesn't work as is on RHEL6 vintage gcc so it's probably not
a realistic option.

> Failing that, I'm personally okay with pushing this.
> 

I agree

- Cole
>From 5df55b50e143677d0b47b0e67ffd28184e4c0556 Mon Sep 17 00:00:00 2001
Message-Id: <5df55b50e143677d0b47b0e67ffd28184e4c0556.1460254498.git.crobinso@xxxxxxxxxx>
From: Cole Robinson <crobinso@xxxxxxxxxx>
Date: Sat, 9 Apr 2016 21:46:52 -0400
Subject: [PATCH] build: Avoid -Wlogical-op bug on gcc6

Use pragma push/pop to disable -Wlogical-op for the problematic
conditionals.

gcc bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602
https://www.redhat.com/archives/libvir-list/2016-February/msg00054.html
---
Unfortunately this doesn't work on RHEL6... gcc errors about #pragma
in a function call


 src/fdstream.c                  | 6 ++++++
 src/rpc/virnetsshsession.c      | 9 +++++++++
 src/security/security_selinux.c | 6 +++++-
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/fdstream.c b/src/fdstream.c
index a85cf9d..0422ac5 100644
--- a/src/fdstream.c
+++ b/src/fdstream.c
@@ -387,7 +387,10 @@ static int virFDStreamWrite(virStreamPtr st, const char *bytes, size_t nbytes)
  retry:
     ret = write(fdst->fd, bytes, nbytes);
     if (ret < 0) {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wlogical-op"
         if (errno == EAGAIN || errno == EWOULDBLOCK) {
+#pragma GCC diagnostic pop
             ret = -2;
         } else if (errno == EINTR) {
             goto retry;
@@ -437,7 +440,10 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes)
  retry:
     ret = read(fdst->fd, bytes, nbytes);
     if (ret < 0) {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wlogical-op"
         if (errno == EAGAIN || errno == EWOULDBLOCK) {
+#pragma GCC diagnostic pop
             ret = -2;
         } else if (errno == EINTR) {
             goto retry;
diff --git a/src/rpc/virnetsshsession.c b/src/rpc/virnetsshsession.c
index 406a831..a77571f 100644
--- a/src/rpc/virnetsshsession.c
+++ b/src/rpc/virnetsshsession.c
@@ -545,9 +545,12 @@ virNetSSHAuthenticateAgent(virNetSSHSessionPtr sess,
                                            agent_identity)))
             return 0; /* key accepted */
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wlogical-op"
         if (ret != LIBSSH2_ERROR_AUTHENTICATION_FAILED &&
             ret != LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED &&
             ret != LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED) {
+#pragma GCC diagnostic pop
             libssh2_session_last_error(sess->session, &errmsg, NULL, 0);
             virReportError(VIR_ERR_AUTH_FAILED,
                            _("failed to authenticate using SSH agent: %s"),
@@ -605,9 +608,12 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess,
                                                    priv->password)) == 0)
         return 0; /* success */
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wlogical-op"
     if (priv->password ||
         ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED ||
         ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED) {
+#pragma GCC diagnostic pop
         libssh2_session_last_error(sess->session, &errmsg, NULL, 0);
         virReportError(VIR_ERR_AUTH_FAILED,
                        _("authentication with private key '%s' "
@@ -673,11 +679,14 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess,
                          "has failed: %s"),
                        priv->filename, errmsg);
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wlogical-op"
         if (ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED ||
             ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED)
             return 1;
         else
             return -1;
+#pragma GCC diagnostic pop
     }
 
     return 0;
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index 26d95d1..b702fb3 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -911,8 +911,12 @@ virSecuritySELinuxSetFileconHelper(const char *path, char *tcon,
          * hopefully sets one of the necessary SELinux virt_use_{nfs,usb,pci}
          * boolean tunables to allow it ...
          */
-        if (setfilecon_errno != EOPNOTSUPP && setfilecon_errno != ENOTSUP &&
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wlogical-op"
+        if (setfilecon_errno != EOPNOTSUPP &&
+            setfilecon_errno != ENOTSUP &&
             setfilecon_errno != EROFS) {
+#pragma GCC diagnostic pop
             virReportSystemError(setfilecon_errno,
                                  _("unable to set security context '%s' on '%s'"),
                                  tcon, path);
-- 
2.7.3

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]