提交 ec7040c0 编写于 作者: P Pavel Hrdina 提交者: Martin Kletzander

build: add GCC 6.0 -Wlogical-op workaround

fdstream.c: In function 'virFDStreamWrite':
fdstream.c:390:29: error: logical 'or' of equal expressions [-Werror=logical-op]
        if (errno == EAGAIN || errno == EWOULDBLOCK) {
                            ^~

Fedora rawhide now uses gcc 6.0 and there is a bug with -Wlogical-op
producing false warnings.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602

Use GCC pragma push/pop and ignore -Wlogical-op for GCC that supports
push/pop pragma and also has this bug.
Signed-off-by: NPavel Hrdina <phrdina@redhat.com>
(cherry picked from commit d713a6b1)
上级 6a293aa2
...@@ -117,6 +117,20 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ ...@@ -117,6 +117,20 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
[lv_cv_gcc_wlogical_op_broken=yes]) [lv_cv_gcc_wlogical_op_broken=yes])
CFLAGS="$save_CFLAGS"]) CFLAGS="$save_CFLAGS"])
AC_CACHE_CHECK([whether gcc gives bogus warnings for -Wlogical-op],
[lv_cv_gcc_wlogical_op_equal_expr_broken], [
save_CFLAGS="$CFLAGS"
CFLAGS="-O2 -Wlogical-op -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define TEST1 1
#define TEST2 TEST1
]], [[
int test = 0;
return test == TEST1 || test == TEST2;]])],
[lv_cv_gcc_wlogical_op_equal_expr_broken=no],
[lv_cv_gcc_wlogical_op_equal_expr_broken=yes])
CFLAGS="$save_CFLAGS"])
# We might fundamentally need some of these disabled forever, but # We might fundamentally need some of these disabled forever, but
# ideally we'd turn many of them on # ideally we'd turn many of them on
dontwarn="$dontwarn -Wfloat-equal" dontwarn="$dontwarn -Wfloat-equal"
...@@ -239,4 +253,10 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ ...@@ -239,4 +253,10 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP], 1, AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP], 1,
[Define to 1 if gcc -Wlogical-op reports false positives on strchr]) [Define to 1 if gcc -Wlogical-op reports false positives on strchr])
fi fi
if test "$gl_cv_warn_c__Wlogical_op" = yes &&
test "$lv_cv_gcc_wlogical_op_equal_expr_broken" = yes; then
AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_EQUAL_EXPR], 1,
[Define to 1 if gcc -Wlogical-op reports false positive 'or' equal expr])
fi
]) ])
...@@ -387,7 +387,9 @@ static int virFDStreamWrite(virStreamPtr st, const char *bytes, size_t nbytes) ...@@ -387,7 +387,9 @@ static int virFDStreamWrite(virStreamPtr st, const char *bytes, size_t nbytes)
retry: retry:
ret = write(fdst->fd, bytes, nbytes); ret = write(fdst->fd, bytes, nbytes);
if (ret < 0) { if (ret < 0) {
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
if (errno == EAGAIN || errno == EWOULDBLOCK) { if (errno == EAGAIN || errno == EWOULDBLOCK) {
VIR_WARNINGS_RESET
ret = -2; ret = -2;
} else if (errno == EINTR) { } else if (errno == EINTR) {
goto retry; goto retry;
...@@ -437,7 +439,9 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes) ...@@ -437,7 +439,9 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes)
retry: retry:
ret = read(fdst->fd, bytes, nbytes); ret = read(fdst->fd, bytes, nbytes);
if (ret < 0) { if (ret < 0) {
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
if (errno == EAGAIN || errno == EWOULDBLOCK) { if (errno == EAGAIN || errno == EWOULDBLOCK) {
VIR_WARNINGS_RESET
ret = -2; ret = -2;
} else if (errno == EINTR) { } else if (errno == EINTR) {
goto retry; goto retry;
......
...@@ -245,11 +245,23 @@ ...@@ -245,11 +245,23 @@
_Pragma ("GCC diagnostic push") _Pragma ("GCC diagnostic push")
# endif # endif
/* Workaround bogus GCC 6.0 for logical 'or' equal expression warnings.
* (GCC bz 69602) */
# if BROKEN_GCC_WLOGICALOP_EQUAL_EXPR
# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR \
_Pragma ("GCC diagnostic push") \
_Pragma ("GCC diagnostic ignored \"-Wlogical-op\"")
# else
# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR \
_Pragma ("GCC diagnostic push")
# endif
# define VIR_WARNINGS_RESET \ # define VIR_WARNINGS_RESET \
_Pragma ("GCC diagnostic pop") _Pragma ("GCC diagnostic pop")
# else # else
# define VIR_WARNINGS_NO_CAST_ALIGN # define VIR_WARNINGS_NO_CAST_ALIGN
# define VIR_WARNINGS_NO_PRINTF # define VIR_WARNINGS_NO_PRINTF
# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
# define VIR_WARNINGS_RESET # define VIR_WARNINGS_RESET
# endif # endif
......
...@@ -545,9 +545,11 @@ virNetSSHAuthenticateAgent(virNetSSHSessionPtr sess, ...@@ -545,9 +545,11 @@ virNetSSHAuthenticateAgent(virNetSSHSessionPtr sess,
agent_identity))) agent_identity)))
return 0; /* key accepted */ return 0; /* key accepted */
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
if (ret != LIBSSH2_ERROR_AUTHENTICATION_FAILED && if (ret != LIBSSH2_ERROR_AUTHENTICATION_FAILED &&
ret != LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED && ret != LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED &&
ret != LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED) { ret != LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED) {
VIR_WARNINGS_RESET
libssh2_session_last_error(sess->session, &errmsg, NULL, 0); libssh2_session_last_error(sess->session, &errmsg, NULL, 0);
virReportError(VIR_ERR_AUTH_FAILED, virReportError(VIR_ERR_AUTH_FAILED,
_("failed to authenticate using SSH agent: %s"), _("failed to authenticate using SSH agent: %s"),
...@@ -605,9 +607,11 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess, ...@@ -605,9 +607,11 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess,
priv->password)) == 0) priv->password)) == 0)
return 0; /* success */ return 0; /* success */
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
if (priv->password || if (priv->password ||
ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED || ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED ||
ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED) { ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED) {
VIR_WARNINGS_RESET
libssh2_session_last_error(sess->session, &errmsg, NULL, 0); libssh2_session_last_error(sess->session, &errmsg, NULL, 0);
virReportError(VIR_ERR_AUTH_FAILED, virReportError(VIR_ERR_AUTH_FAILED,
_("authentication with private key '%s' " _("authentication with private key '%s' "
...@@ -673,11 +677,13 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess, ...@@ -673,11 +677,13 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess,
"has failed: %s"), "has failed: %s"),
priv->filename, errmsg); priv->filename, errmsg);
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
if (ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED || if (ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED ||
ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED) ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED)
return 1; return 1;
else else
return -1; return -1;
VIR_WARNINGS_RESET
} }
return 0; return 0;
......
...@@ -911,8 +911,10 @@ virSecuritySELinuxSetFileconHelper(const char *path, char *tcon, ...@@ -911,8 +911,10 @@ virSecuritySELinuxSetFileconHelper(const char *path, char *tcon,
* hopefully sets one of the necessary SELinux virt_use_{nfs,usb,pci} * hopefully sets one of the necessary SELinux virt_use_{nfs,usb,pci}
* boolean tunables to allow it ... * boolean tunables to allow it ...
*/ */
VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
if (setfilecon_errno != EOPNOTSUPP && setfilecon_errno != ENOTSUP && if (setfilecon_errno != EOPNOTSUPP && setfilecon_errno != ENOTSUP &&
setfilecon_errno != EROFS) { setfilecon_errno != EROFS) {
VIR_WARNINGS_RESET
virReportSystemError(setfilecon_errno, virReportSystemError(setfilecon_errno,
_("unable to set security context '%s' on '%s'"), _("unable to set security context '%s' on '%s'"),
tcon, path); tcon, path);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册