[openssl-project] OS/X builds failing
Viktor Dukhovni
openssl-users at dukhovni.org
Fri Feb 9 16:52:48 UTC 2018
> On Feb 9, 2018, at 11:36 AM, Viktor Dukhovni <openssl-users at dukhovni.org> wrote:
>
> $ cat size.c
> #include <stdio.h>
> #include <stdint.h>
>
> int main(int argc, char **argv)
> {
> printf("char = %zu\n", sizeof(unsigned char));
> printf("short = %zu\n", sizeof(unsigned short));
> printf("int = %zu\n", sizeof(unsigned int));
> printf("long = %zu\n", sizeof(unsigned long int));
> printf("long long = %zu\n", sizeof(unsigned long long int));
>
> printf("int8_t = %zu\n", sizeof(uint8_t));
> printf("int16_t = %zu\n", sizeof(uint16_t));
> printf("int32_t = %zu\n", sizeof(uint32_t));
> printf("int64_t = %zu\n", sizeof(uint64_t));
> printf("intmax_t = %zu\n", sizeof(uintmax_t));
> return 0;
> }
>
> shows that long, long long, int64_t and intmax_t are presently all the same.
And throwing an extra line with a cast, yields the expected warning:
$ cc -o size size.c
size.c:18:36: warning: format specifies type 'uintmax_t' (aka 'unsigned long') but the argument has type 'unsigned long long'
[-Wformat]
printf("intmax_t = %ju\n", (unsigned long long)sizeof(uintmax_t));
~~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%llu
1 warning generated.
Interestingly casting to "unsigned long" instead of "unsigned long long" does not result
in a warning. The warning is about the underlying C type, and expands typedefs. So it
is a bit annoying that typedefs that might change are not a problem, but "long long"
vs. "long" is even though they are actually the same underlying data type.
Still, we're wrong to use int64_t values with "%j" formats. All format
arguments to "%j" need to be "intmax_t".
--
Viktor.
More information about the openssl-project
mailing list