Hi Willy,

Le 13/12/2013 10:45, Willy Tarreau a écrit :
Hi Igor,

On Fri, Dec 13, 2013 at 05:13:51PM +0800, Igor wrote:
Hi, Willy, the patch fixed the reported warning,

Thanks for testing! I'm merging it then.

but seems introduce new warning, the log: http://pastebin.com/dBfHGV2S

No it's not the same. Gcc is getting *really* annoying. It reports stupid
warnings all the time and forces you to write your code a certain way to
shut them down. It's really unbelievable. Have you seen the comment in the
code? It already says that this ugly construct was made *only* to shut gcc
down. But it seems that your new version is even smarter and now requires
the semi-colon to be put on a distinct line. It does not make any sense
any more, this compiler decides on the *form* of your code, not the semantics.
One day we'll see "Warning, you used parenthesis in sizeof which is an operator
and not a function" or "your 'if' statement was indented with spaces instead of
tabs, which might confuse readers with tab size different from 8".

I think that gcc is more and more developped by monkeys for monkeys.

Each version is slower and buggier than the previous one, and more annoying
on legacy code.

I don't want to put the -Wno-xxxxx flags in the default build options because
some older compilers available on certain platforms don't support them all.
At the moment haproxy builds back to gcc 2.95. We can decide to support 3.x
and above in the future but that does not mean we'll gain more options to
silence it.

That said, if someone is willing to enumerate the list of -Wno-xxx options
that are supported from 2.95 to 4.8 and which allow us to live in peace
with this boring compiler, I'm totally open to add them.

This is not necessarily a gcc issue. From what I see, the older code

  write(1, trash.str, trash.len);

doesn't produce any warning here (tested on Debian Wheezy/gcc 4.7.2/libc 2.13 and clang 3.0, Ubuntu 13.10/gcc 4.8.1/libc 2.17 and current Ubuntu development branch/gcc 4.8.2/libc d.17).

From the glibc include files, write() is declared as is :
extern ssize_t write (int __fd, __const void *__buf, size_t __n) __wur;

__wur is what can produce the warning...or not.
It sets the function attribute __attribute_warn_unused_result__ *only* if _FORTIFY_SOURCE is greater than 0 and (Optimization level is greater than 0 too).

_FORTIFY_SOURCE=2 looks to become the default for distribution packagers. Maybe we could decide to enforce _FORTIFY_SOURCE to 0 in the Makefile.

--
Cyril Bonté

Reply via email to