> On Feb 9, 2018, at 11:36 AM, Viktor Dukhovni <openssl-us...@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. _______________________________________________ openssl-project mailing list openssl-project@openssl.org https://mta.openssl.org/mailman/listinfo/openssl-project