Source-Changes-D archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: CVS commit: src/crypto/external/bsd/netpgp/dist/src/lib
On Sat, Jun 26, 2010 at 05:25:31AM +0200, Joerg Sonnenberger wrote:
> On Sat, Jun 26, 2010 at 05:11:39AM +0200, Alistair Crooks wrote:
> > On Sat, Jun 26, 2010 at 01:32:05AM +0200, Joerg Sonnenberger wrote:
> > > On Fri, Jun 25, 2010 at 11:54:32PM +0200, Alistair Crooks wrote:
> > > > Even in C99, the "%lu" method will work unless size_t is bigger
> > > > than
> > > > unsigned long *and* the value being printed exceeds ULONG_MAX,
> > > > which
> > > > is unlikely to happen in practice.
> >
> > Please get the attributions right - I was quoting that text.
> >
> > > Actually, it doesn't. This method breaks as soon as size_t != u_long and
> > > might only work in a few edge cases like the size_t being the last
> > > argument and the byte order is Little Endian. This is worse because IIRC
> > > Microsoft decided to use IL32LLP64 or something similarly fancy.
> >
> > Can you give us a reference to this, please?
>
> E.g.
> http://stackoverflow.com/questions/384502/what-is-the-bit-size-of-long-on-64-bit-windows
> and the MSDN reference inside.
>
> > > A more portable approach with autoconf can be found in pkg_install, look
> > > for MISSING_SIZE_T_SUPPORT and the corresponding AC_CHECK_SIZEOF calls
> > > in configure.ac.
> >
> > Hmmm, I see this in configure.ac -
> >
> > AC_CHECK_SIZEOF(int)
> > AC_CHECK_SIZEOF(long)
> > AC_CHECK_SIZEOF(long long)
> > AC_CHECK_SIZEOF(size_t, [#include <stdlib.h>])
>
> ...compute the sizes to not depend on SIZE_MAX (which would simplify the
> logic a lot).
>
> > and
> >
> > case $host in
> > *-*-hpux*)
> > AC_DEFINE(MISSING_SIZE_T_SUPPORT)
> > AH_TEMPLATE([MISSING_SIZE_T_SUPPORT], [
> > Define to 1 if the `z' modifider for printf is missing.
> > ])
> > ;;
> > esac
>
> The only platform for pkgsrc purposes ATM which lacks the %z support.
It would be better to make this a check which is size_t dependent,
rather than platform-dependent.
> > and
> >
> > #ifndef MISSING_SIZE_T_SUPPORT
> > # define PRIzu "zu"
> > #elif SIZEOF_SIZE_T == SIZEOF_INT
> > # define PRIzu "u"
> > #elif SIZEOF_SIZE_T == SIZEOF_LONG
> > # define PRIzu "lu"
> > #elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
> > # define PRIzu "llu"
> > #else
> > # errror "Unknown size_t size"
> > #endif
> >
> > Not quite what I'd been expecting, though, from the glowing description
> > above.
>
> It would be simpler if SIZE_MAX support can be assumed. In that case it
> would boil down to
> #if SIZE_MAX == INT_MAX
> #define PRIzu "u"
> #elif SIZE_MAX == LONG_MAX
> #define PRIzu "lu"
> #else SIZE_MAX == LLONG_MAX
> #define PRIzu "llu"
> #endif
That is even worse, though.
I still don't understand why autoconf is passing C pre-processor
directives down.
#if sizeof(size_t) == sizeof(int)
...
#elif sizeof(size_t) == sizeof(long)
...
#endif
directly in the code is much more readable.
Regards,
Alistair
Home |
Main Index |
Thread Index |
Old Index