svn commit: r322893 - head/bin/dd

Bruce Evans brde at optusnet.com.au
Fri Aug 25 23:23:14 UTC 2017


On Fri, 25 Aug 2017, Matt Joras wrote:

> On 08/25/2017 10:17, Conrad Meyer wrote:
>> This change seems to break buildworld on MIPS:
>>
>> /home/cem/head.svn/bin/dd/args.c: In function 'f_bs':
>> /home/cem/head.svn/bin/dd/args.c:188: warning: format '%zd' expects
>> type 'signed size_t', but argument 3 has type 'long int'
>> /home/cem/head.svn/bin/dd/args.c: In function 'f_cbs':
>> /home/cem/head.svn/bin/dd/args.c:199: warning: format '%zd' expects
>> type 'signed size_t', but argument 3 has type 'long int'
>> /home/cem/head.svn/bin/dd/args.c: In function 'f_ibs':
>> /home/cem/head.svn/bin/dd/args.c:245: warning: format '%zd' expects
>> type 'signed size_t', but argument 3 has type 'long int'
>> /home/cem/head.svn/bin/dd/args.c: In function 'f_obs':
>> /home/cem/head.svn/bin/dd/args.c:266: warning: format '%zd' expects
>> type 'signed size_t', but argument 3 has type 'long int'
>>
>> (Yes, it's odd that the SSIZE_MAX constant has 'long' type.)
>>
> SSIZE_MAX should have type long, since ssize_t is a long on mips (and
> other arches besides i386 and arm).

Actually the reverse.  ssize_t has the correct type int32_t (which
happens to be int) on all 32-bit arches.  SSIZE_MAX shouldn't have
type long on 32-bit arches, but is broken by having that type on arm

> Re: the build failure, that's in the GCC C format string checking, so
> perhaps it's more accurate to say this breaks the (in-tree) GCC build.
> %zd is the right format specifier for ssize_t. I guess GCC's format
> string checking is getting confused because SSIZE_MAX is a constant that
> expands to type long. Perhaps casting to ssize_t would GCC happier, but
> that looks rather wrong.

This is because gcc's format checking actually works.  It detects that
SSIZE_MAX has the incorrect type long on mips because it is defined as
LONG_MAX there.  arm/arm64, powerpc and x86 have ifdefs to define it
correctly as INT_MAX in the 32-bit case.

I finally found where POSIX requires SSIZE_MAX to have the "correct" type
(POSIX doesn't define what that is. but C99 does).  SSIZE_MAX is just in
convered by the same rule as most C99 limits for integer types.

So SSIZE_MAX is not permitted to be what it is on mips.

Bruce


More information about the svn-src-head mailing list