BUILD: definitely silence some stupid GCC warnings
It's becoming increasingly difficult to ignore unwanted function returns in
debug code with gcc. Now even when you try to work around it, it suggests a
way to write your code differently. For example :
src/frontend.c:187:65: warning: if statement has empty body [-Wempty-body]
if (write(1, trash.str, trash.len) < 0) /* shut gcc warning */;
^
src/frontend.c:187:65: note: put the semicolon on a separate line to silence this warning
1 warning generated.
This is totally unacceptable, this code already had to be written this way
to shut it up in earlier versions. And now it comments the form ? What's the
purpose of the C language if you can't write anymore the code that does what
you want ?
Emeric proposed to just keep a global variable to drain such useless results
so that gcc stops complaining all the time it believes people who write code
are monkeys. The solution is acceptable because the useless assignment is done
only in debug code so it will not impact performance. This patch implements
this, until gcc becomes even "smarter" to detect that we tried to cheat.
diff --git a/include/common/standard.h b/include/common/standard.h
index be07625..c4c5d64 100644
--- a/include/common/standard.h
+++ b/include/common/standard.h
@@ -760,6 +760,19 @@
*/
#define fddebug(msg...) do { char *_m = NULL; memprintf(&_m, ##msg); if (_m) write(-1, _m, strlen(_m)); free(_m); } while (0)
+/* used from everywhere just to drain results we don't want to read and which
+ * recent versions of gcc increasingly and annoyingly complain about.
+ */
+extern int shut_your_big_mouth_gcc_int;
+
+/* used from everywhere just to drain results we don't want to read and which
+ * recent versions of gcc increasingly and annoyingly complain about.
+ */
+static inline void shut_your_big_mouth_gcc(int r)
+{
+ shut_your_big_mouth_gcc_int = r;
+}
+
/* same as strstr() but case-insensitive */
const char *strnistr(const char *str1, int len_str1, const char *str2, int len_str2);
diff --git a/src/appsession.c b/src/appsession.c
index a71f186..c22be45 100644
--- a/src/appsession.c
+++ b/src/appsession.c
@@ -99,7 +99,7 @@
(!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))) {
chunk_printf(&trash, "appsession_refresh: cleaning up expired Session '%s' on Server %s\n",
element->sessid, element->serverid?element->serverid:"(null)");
- if (write(1, trash.str, trash.len) < 0) /* shut gcc warning */;
+ shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
}
/* delete the expired element from within the hash table */
LIST_DEL(&element->hash_list);
diff --git a/src/frontend.c b/src/frontend.c
index 8a01a4a..591c1f2 100644
--- a/src/frontend.c
+++ b/src/frontend.c
@@ -184,7 +184,7 @@
break;
}
- if (write(1, trash.str, trash.len) < 0) /* shut gcc warning */;
+ shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
}
if (s->fe->mode == PR_MODE_HTTP)
diff --git a/src/haproxy.c b/src/haproxy.c
index 0ec217e..5cfebd2 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -193,6 +193,11 @@
char hostname[MAX_HOSTNAME_LEN];
char localpeer[MAX_HOSTNAME_LEN];
+/* used from everywhere just to drain results we don't want to read and which
+ * recent versions of gcc increasingly and annoyingly complain about.
+ */
+int shut_your_big_mouth_gcc_int = 0;
+
/* list of the temporarily limited listeners because of lack of resource */
struct list global_listener_queue = LIST_HEAD_INIT(global_listener_queue);
struct task *global_listener_queue_task;
@@ -1541,7 +1546,7 @@
if (pidfd >= 0) {
char pidstr[100];
snprintf(pidstr, sizeof(pidstr), "%d\n", ret);
- if (write(pidfd, pidstr, strlen(pidstr)) < 0) /* shut gcc warning */;
+ shut_your_big_mouth_gcc(write(pidfd, pidstr, strlen(pidstr)));
}
relative_pid++; /* each child will get a different one */
}
diff --git a/src/proto_http.c b/src/proto_http.c
index b7982bc..db6a887 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -7992,7 +7992,7 @@
UBOUND(max, trash.size - trash.len - 3);
trash.len += strlcpy2(trash.str + trash.len, start, max + 1);
trash.str[trash.len++] = '\n';
- if (write(1, trash.str, trash.len) < 0) /* shut gcc warning */;
+ shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
}
/*
diff --git a/src/session.c b/src/session.c
index 86dcb84..21fea39 100644
--- a/src/session.c
+++ b/src/session.c
@@ -2359,7 +2359,7 @@
s->uniq_id, s->be->id,
objt_conn(s->si[0].end) ? (unsigned short)objt_conn(s->si[0].end)->t.sock.fd : -1,
objt_conn(s->si[1].end) ? (unsigned short)objt_conn(s->si[1].end)->t.sock.fd : -1);
- if (write(1, trash.str, trash.len) < 0) /* shut gcc warning */;
+ shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
}
if (s->si[0].state == SI_ST_CLO &&
@@ -2368,7 +2368,7 @@
s->uniq_id, s->be->id,
objt_conn(s->si[0].end) ? (unsigned short)objt_conn(s->si[0].end)->t.sock.fd : -1,
objt_conn(s->si[1].end) ? (unsigned short)objt_conn(s->si[1].end)->t.sock.fd : -1);
- if (write(1, trash.str, trash.len) < 0) /* shut gcc warning */;
+ shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
}
}
@@ -2473,7 +2473,7 @@
s->uniq_id, s->be->id,
objt_conn(s->si[0].end) ? (unsigned short)objt_conn(s->si[0].end)->t.sock.fd : -1,
objt_conn(s->si[1].end) ? (unsigned short)objt_conn(s->si[1].end)->t.sock.fd : -1);
- if (write(1, trash.str, trash.len) < 0) /* shut gcc warning */;
+ shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
}
s->logs.t_close = tv_ms_elapsed(&s->logs.tv_accept, &now);