Date: Sat, 26 Aug 2017 09:23:06 +1000 (EST) From: Bruce Evans <brde@optusnet.com.au> To: Matt Joras <matt.joras@gmail.com> Cc: cem@freebsd.org, Alan Somers <asomers@freebsd.org>, src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r322893 - head/bin/dd Message-ID: <20170826085102.S976@besplex.bde.org> In-Reply-To: <4b016f89-61c5-fc8a-a36a-aca8166c369e@gmail.com> References: <201708251531.v7PFVtoZ038242@repo.freebsd.org> <CAG6CVpU5rsrwU4EEkF3i5gvzSZRX3Q=K%2B8M-LMwk2cGP8hMSxw@mail.gmail.com> <4b016f89-61c5-fc8a-a36a-aca8166c369e@gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170826085102.S976>