Re: gcc 4.8.2 -Wno-format feat/broken

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

 



On 2 March 2014 07:53, phi gcc wrote:
> CU82$ cc -c c.c -Wno-format # Expect no warnings
>
> CU82$ cc -c c.c -Wformat=0 # Expect no warnings
>
> gcc 4.8.2
> =======
>
> C4N1$ cc -c c.c
> c.c: In function 'f':
> c.c:13:1: warning: format '%llx' expects argument of type 'long long unsigned in
> t', but argument 2 has type 'uint64' [-Wformat=]
>  { return printf("a=%#llx\n",a);
>  ^

There should be no warning here, because you have no specified
-Wformat or -Wall, so that implies you are using a modified GCC, or
"cc" is a wrapper around GCC which passes some -W options.


> C4N1$ cc -c c.c -Wno-format     # Expect no warning
> c.c: In function 'f':
> c.c:13:1: warning: format '%llx' expects argument of type 'long long unsigned in
> t', but argument 2 has type 'uint64' [-Wformat=]
>  { return printf("a=%#llx\n",a);
>  ^

This should not warn, and doesn't when I test it.

Again, it seems to me that you are using a modified GCC or a wrapper
around it that passes additional -W options.


> ==========================================
>
> This raise a question, what is the clean way with no warning and no
> runstring -W restriction to code this.
>
> I come to this (though I bumped in the L".." problem yesterday) but i
> fear it is not the way to do it.
>
> CU82$ more c.c
> #include <stdio.h>
>
> #ifdef __LP64__
> typedef unsigned long uint64;
> #define Y "l"
> #else
> typedef unsigned long long uint64;
> #define Y "l"
> #endif
>
>
> int f(uint64 a)
> { return printf("a=%#"Y"x\n",a);
> }
>
> I would have prefered "a=%#"L"x\n" as L would have men "l" or "ll"
> depending on ilp32/lp64 but unfortunalty L"..." is already taken.
>
> Any suggestion appreciated.

Put a space between the L and the following string.

return printf("a=%#" L "x\n",a);

Of course doing this is fragile and IMHO a bad idea, I would use a
better name for the macro than "L" or "Y"

> from printf("bla %llx bla\n",a); I want to stay away from
> printf(__LP64_?"bla %lx bla\n":"bla %llx bla\n",a);
> Impossible to fix an all project occurences accuratly.

This problem is already solved for you.

Why not just use uint64_t and PRIu64?

int f(uint64_t a)
{
  return printf("a=%#" PRIu64 "x\n",a);
}




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux