All of lore.kernel.org
 help / color / mirror / Atom feed
* size_t/ssize_t warnings (was: Re: Build regressions/improvements in v3.5-rc5)
@ 2012-07-04 20:17 Geert Uytterhoeven
  2012-07-05  1:25 ` Mike Frysinger
  2012-07-06  1:12 ` Hans-Peter Nilsson
  0 siblings, 2 replies; 5+ messages in thread
From: Geert Uytterhoeven @ 2012-07-04 20:17 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-kernel, Linux-Arch, linux-cris-kernel

On Wed, Jul 4, 2012 at 3:34 PM, Jan Kara <jack@suse.cz> wrote:
>>   + fs/quota/quota_tree.c: warning: format '%zd' expects argument of type 'signed size_t', but argument 4 has type 'ssize_t' [-Wformat]:  => 372:4
>>   + fs/quota/quota_v2.c: warning: format '%zd' expects argument of type 'signed size_t', but argument 5 has type 'ssize_t' [-Wformat]:  => 66:92
>   These really look like false positives (there are quite a few of this
> kind). Can we possibly silence them?

These 2 warnings happen on cris only, because size_t is unsigned int and
ssize_t is (signed) long. They go away if I make ssize_t int.

I had a look at the various definitions of size_t and ssize_t:

                        __kernel_size_t                         __kernel_ssize_t
                        ---------------                         ----------------

generic 32-bit:         unsigned int                            int
generic 64-bit:         __kernel_ulong_t (unsigned long)
__kernel_long_t (long)

Exceptions:

avr32:                  unsigned long                           long
blackfin:               unsigned long                           long
cris:                   __SIZE_TYPE__ (unsigned int)            long
mn10300/__GNUC__ == 4:  unsigned int                            signed int
mn10300/__GNUC__ != 4:  unsigned long                           signed long
s390 (32-bit):          unsigned long                           int
x32:                    __kernel_ulong_t (unsigned long long)
__kernel_long_t (long long)

On cris, I get the warning if ssize_t != int.
Whether size_t is unsigned int or unsigned long doesn't matter.
So it's not just a mismatch between int and long.

I also tried blackfin, which has matching unsigned long/long, and it doesn't
give the warning. Presumably the toolchain has size_t hardcoded to long for
printf-style format checking?

I haven't tried s390 yet, which also has a non-matching combination (unsigned
long vs. int).

Cris-people: __SIZE_TYPE__ turned out to be hardcoded in my compiler (gcc
4.6.3 from Tony's collection) to unsigned int. Is that correct?

And why do some 32-bit architectures use unsigned long/long?

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: size_t/ssize_t warnings (was: Re: Build regressions/improvements in v3.5-rc5)
  2012-07-04 20:17 size_t/ssize_t warnings (was: Re: Build regressions/improvements in v3.5-rc5) Geert Uytterhoeven
@ 2012-07-05  1:25 ` Mike Frysinger
  2012-07-06  1:12 ` Hans-Peter Nilsson
  1 sibling, 0 replies; 5+ messages in thread
From: Mike Frysinger @ 2012-07-05  1:25 UTC (permalink / raw)
  To: Geert Uytterhoeven; +Cc: Jan Kara, linux-kernel, Linux-Arch, linux-cris-kernel

[-- Attachment #1: Type: Text/Plain, Size: 2305 bytes --]

On Wednesday 04 July 2012 16:17:28 Geert Uytterhoeven wrote:
> On Wed, Jul 4, 2012 at 3:34 PM, Jan Kara <jack@suse.cz> wrote:
> >>   + fs/quota/quota_tree.c: warning: format '%zd' expects argument of
> >>   type 'signed size_t', but argument 4 has type 'ssize_t' [-Wformat]: 
> >>   => 372:4 + fs/quota/quota_v2.c: warning: format '%zd' expects
> >>   argument of type 'signed size_t', but argument 5 has type 'ssize_t'
> >>   [-Wformat]:  => 66:92
> >   
> >   These really look like false positives (there are quite a few of this
> > 
> > kind). Can we possibly silence them?
> 
> These 2 warnings happen on cris only, because size_t is unsigned int and
> ssize_t is (signed) long. They go away if I make ssize_t int.
> 
> I had a look at the various definitions of size_t and ssize_t:
> 
>                         __kernel_size_t                        
> __kernel_ssize_t ---------------                         ----------------
> 
> generic 32-bit:         unsigned int                            int
> generic 64-bit:         __kernel_ulong_t (unsigned long)
> __kernel_long_t (long)
> 
> Exceptions:
> 
> avr32:                  unsigned long                           long
> blackfin:               unsigned long                           long
> cris:                   __SIZE_TYPE__ (unsigned int)            long
> mn10300/__GNUC__ == 4:  unsigned int                            signed int
> mn10300/__GNUC__ != 4:  unsigned long                           signed long
> s390 (32-bit):          unsigned long                           int
> x32:                    __kernel_ulong_t (unsigned long long)
> __kernel_long_t (long long)
> 
> On cris, I get the warning if ssize_t != int.
> Whether size_t is unsigned int or unsigned long doesn't matter.
> So it's not just a mismatch between int and long.
> 
> I also tried blackfin, which has matching unsigned long/long, and it
> doesn't give the warning. Presumably the toolchain has size_t hardcoded to
> long for printf-style format checking?

well, every gcc arch has to declare a type for size_t.  on Blackfin, we picked:
gcc/config/bfin/bfin.h:/* what is the 'type' of size_t */
gcc/config/bfin/bfin.h-#define SIZE_TYPE "long unsigned int"

grep shows that many other arches do the same
-mike

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: size_t/ssize_t warnings (was: Re: Build regressions/improvements in v3.5-rc5)
  2012-07-04 20:17 size_t/ssize_t warnings (was: Re: Build regressions/improvements in v3.5-rc5) Geert Uytterhoeven
  2012-07-05  1:25 ` Mike Frysinger
@ 2012-07-06  1:12 ` Hans-Peter Nilsson
  2012-07-06  7:18   ` Geert Uytterhoeven
  1 sibling, 1 reply; 5+ messages in thread
From: Hans-Peter Nilsson @ 2012-07-06  1:12 UTC (permalink / raw)
  To: geert; +Cc: jack, linux-arch, linux-kernel, linux-cris-kernel

> From: Geert Uytterhoeven <geert@linux-m68k.org>
> Date: Wed, 4 Jul 2012 22:17:28 +0200

> On Wed, Jul 4, 2012 at 3:34 PM, Jan Kara <jack@suse.cz> wrote:
> >>   + fs/quota/quota_tree.c: warning: format '%zd' expects argument of type 'signed size_t', but argument 4 has type 'ssize_t' [-Wformat]:  => 372:4
> >>   + fs/quota/quota_v2.c: warning: format '%zd' expects argument of type 'signed size_t', but argument 5 has type 'ssize_t' [-Wformat]:  => 66:92
> >   These really look like false positives (there are quite a few of this
> > kind). Can we possibly silence them?
> 
> These 2 warnings happen on cris only, because size_t is unsigned int and
> ssize_t is (signed) long.

Um, no, ssize_t isn't long.  Do you mean __kernel_ssize_t?
(Or are you looking at cris-axis-elf?  ...no, that can't be it,
as you see __SIZE_TYPE__ being unsigned int.)

> They go away if I make ssize_t int.

But ssize_t already is int...

N.B. size_t is different between cris-axis-elf and
cris-axis-linux-gnu.  The former uses the default definition in
gcc/defaults.h (long unsigned int) and the latter sets it
specifically to "unsigned int", in gcc/config/cris/linux.h (or
before 2010-12-09, from config/svr4.h).  The ssize_t definition
comes from glibc, where it is "int".

>                         __kernel_size_t                         __kernel_ssize_t
>                         ---------------                         ----------------

> cris:                   __SIZE_TYPE__ (unsigned int)            long

A bit odd; __kernel_ssize_t should probably change to int, to
match ssize_t.

> Cris-people: __SIZE_TYPE__ turned out to be hardcoded in my compiler (gcc
> 4.6.3 from Tony's collection) to unsigned int. Is that correct?

Correct, for cris-axis-linux-gnu.

> And why do some 32-bit architectures use unsigned long/long?

I'd guess from the gcc default.

brgds, H-P

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: size_t/ssize_t warnings (was: Re: Build regressions/improvements in v3.5-rc5)
  2012-07-06  1:12 ` Hans-Peter Nilsson
@ 2012-07-06  7:18   ` Geert Uytterhoeven
  2012-07-06 13:45     ` Hans-Peter Nilsson
  0 siblings, 1 reply; 5+ messages in thread
From: Geert Uytterhoeven @ 2012-07-06  7:18 UTC (permalink / raw)
  To: Hans-Peter Nilsson; +Cc: jack, linux-arch, linux-kernel, linux-cris-kernel

Hi Hans-Peter,

On Fri, Jul 6, 2012 at 3:12 AM, Hans-Peter Nilsson
<hans-peter.nilsson@axis.com> wrote:
>> From: Geert Uytterhoeven <geert@linux-m68k.org>
>> Date: Wed, 4 Jul 2012 22:17:28 +0200
>
>> On Wed, Jul 4, 2012 at 3:34 PM, Jan Kara <jack@suse.cz> wrote:
>> >>   + fs/quota/quota_tree.c: warning: format '%zd' expects argument of type 'signed size_t', but argument 4 has type 'ssize_t' [-Wformat]:  => 372:4
>> >>   + fs/quota/quota_v2.c: warning: format '%zd' expects argument of type 'signed size_t', but argument 5 has type 'ssize_t' [-Wformat]:  => 66:92
>> >   These really look like false positives (there are quite a few of this
>> > kind). Can we possibly silence them?
>>
>> These 2 warnings happen on cris only, because size_t is unsigned int and
>> ssize_t is (signed) long.
>
> Um, no, ssize_t isn't long.  Do you mean __kernel_ssize_t?

In the kernel, (s)size_t == __kernel_(s)size_t

> (Or are you looking at cris-axis-elf?  ...no, that can't be it,
> as you see __SIZE_TYPE__ being unsigned int.)
>
>> They go away if I make ssize_t int.
>
> But ssize_t already is int...
>
> N.B. size_t is different between cris-axis-elf and
> cris-axis-linux-gnu.  The former uses the default definition in
> gcc/defaults.h (long unsigned int) and the latter sets it
> specifically to "unsigned int", in gcc/config/cris/linux.h (or
> before 2010-12-09, from config/svr4.h).  The ssize_t definition
> comes from glibc, where it is "int".

OK, so (s)size_t should be (unsigned) int for Linux.

>>                         __kernel_size_t                         __kernel_ssize_t
>>                         ---------------                         ----------------
>
>> cris:                   __SIZE_TYPE__ (unsigned int)            long
>
> A bit odd; __kernel_ssize_t should probably change to int, to
> match ssize_t.

In the kernel, ssize_t == __kernel_ssize_t.

Probably the "long" dates from the time people used cris-axis-elf
instead of cris-axis-linux-gnu, and "__SIZE_TYPE" from the time
people started using cris-axis-linux-gnu?
Ah, yes, commit ac505a9fd19c99fdb622fe4896446f995151babc
("[PATCH] CRIS architecture update for 2.5.74") in full-history-linux
changed size_t from "unsigned long" to __SIZE_TYPE, but didn't
update ssize_t. Probably "signed __SIZE_TYPE" doesn't work?

So I guess they should be changed to (explicit) "unsigned int", resp.
"int". Or does it make sense to retain __SIZE_TYPE?

>> Cris-people: __SIZE_TYPE__ turned out to be hardcoded in my compiler (gcc
>> 4.6.3 from Tony's collection) to unsigned int. Is that correct?
>
> Correct, for cris-axis-linux-gnu.
>
>> And why do some 32-bit architectures use unsigned long/long?
>
> I'd guess from the gcc default.

OK, that makes sense.

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: size_t/ssize_t warnings (was: Re: Build regressions/improvements in v3.5-rc5)
  2012-07-06  7:18   ` Geert Uytterhoeven
@ 2012-07-06 13:45     ` Hans-Peter Nilsson
  0 siblings, 0 replies; 5+ messages in thread
From: Hans-Peter Nilsson @ 2012-07-06 13:45 UTC (permalink / raw)
  To: geert; +Cc: jack, linux-arch, linux-kernel, linux-cris-kernel

> From: Geert Uytterhoeven <geert@linux-m68k.org>
> Date: Fri, 6 Jul 2012 09:18:52 +0200

> On Fri, Jul 6, 2012 at 3:12 AM, Hans-Peter Nilsson
> <hans-peter.nilsson@axis.com> wrote:
> > Um, no, ssize_t isn't long.  Do you mean __kernel_ssize_t?
> 
> In the kernel, (s)size_t == __kernel_(s)size_t

Right, sorry for being slow.

> OK, so (s)size_t should be (unsigned) int for Linux.

Both the the kernel and userspace, yes.

> Probably the "long" dates from the time people used cris-axis-elf
> instead of cris-axis-linux-gnu, and "__SIZE_TYPE" from the time
> people started using cris-axis-linux-gnu?

I don't remember.  I have a vague recollection of a change in
the distant past.

> Ah, yes, commit ac505a9fd19c99fdb622fe4896446f995151babc
> ("[PATCH] CRIS architecture update for 2.5.74") in full-history-linux
> changed size_t from "unsigned long" to __SIZE_TYPE, but didn't
> update ssize_t. Probably "signed __SIZE_TYPE" doesn't work?

Well no.  Remember here it's "unsigned int": "signed unsigned
int" doesn't compile very well.

> So I guess they should be changed to (explicit) "unsigned int", resp.
> "int". Or does it make sense to retain __SIZE_TYPE?

I think it'd make sense to use __SIZE_TYPE__ (don't forget the
trailing "__") for *all* targets that don't have a particular
difference between kernel and userspace ABI's (notable
exceptions being those with use 32-bit user and 64-bit kernel
ABIs).  Unfortunately, there's no __SSIZE_TYPE__.

brgds, H-P

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-07-06 13:46 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-04 20:17 size_t/ssize_t warnings (was: Re: Build regressions/improvements in v3.5-rc5) Geert Uytterhoeven
2012-07-05  1:25 ` Mike Frysinger
2012-07-06  1:12 ` Hans-Peter Nilsson
2012-07-06  7:18   ` Geert Uytterhoeven
2012-07-06 13:45     ` Hans-Peter Nilsson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.