run-command: prettify -D_FORTIFY_SOURCE workaround

Current gcc + glibc with -D_FORTIFY_SOURCE try very aggressively to
protect against a programming style which uses write(...) without
checking the return value for errors.  Even the usual hint of casting
to (void) does not suppress the warning.

Sometimes when there is an output error, especially right before exit,
there really is nothing to be done.  The obvious solution, adopted in
v1.7.0.3~20^2 (run-command.c: fix build warnings on Ubuntu,
2010-01-30), is to save the return value to a dummy variable:

	ssize_t dummy;
	dummy = write(...);

But that (1) is ugly and (2) triggers -Wunused-but-set-variable
warnings with gcc-4.6 -Wall, so we are not much better off than when
we started.

Instead, use an "if" statement with an empty body to make the intent
clear.

	if (write(...))
		; /* yes, yes, there was an error. */

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Improved-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jonathan Nieder 2011-03-16 02:32:39 -05:00 коммит произвёл Junio C Hamano
Родитель a3ca9b0fbe
Коммит ebec842773
1 изменённых файлов: 11 добавлений и 6 удалений

Просмотреть файл

@ -67,21 +67,26 @@ static int child_notifier = -1;
static void notify_parent(void)
{
ssize_t unused;
unused = write(child_notifier, "", 1);
/*
* execvp failed. If possible, we'd like to let start_command
* know, so failures like ENOENT can be handled right away; but
* otherwise, finish_command will still report the error.
*/
if (write(child_notifier, "", 1))
; /* yes, dear gcc -D_FORTIFY_SOURCE, there was an error. */
}
static NORETURN void die_child(const char *err, va_list params)
{
char msg[4096];
ssize_t unused;
int len = vsnprintf(msg, sizeof(msg), err, params);
if (len > sizeof(msg))
len = sizeof(msg);
unused = write(child_err, "fatal: ", 7);
unused = write(child_err, msg, len);
unused = write(child_err, "\n", 1);
if (write(child_err, "fatal: ", 7) ||
write(child_err, msg, len) ||
write(child_err, "\n", 1))
; /* yes, gcc -D_FORTIFY_SOURCE, we know there was an error. */
exit(128);
}
#endif