From: Bruno Haible Date: Mon, 20 May 2024 11:12:50 +0000 (+0200) Subject: stdint: Verify the width of 'long long' before using it as int64_t. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=4712e28b69656684f2e834d61c498995c35c1a6f;p=gnulib.git stdint: Verify the width of 'long long' before using it as int64_t. Suggested by Paul Eggert in . * lib/stdint.in.h (gl_int64_t): Verify that the number of bits of 'long long' is 64 before using it. (gl_uint64_t): Verify that the number of bits of 'unsigned long long' is 64 before using it. --- diff --git a/ChangeLog b/ChangeLog index 89c5aa6993..433df67c65 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2024-05-20 Bruno Haible + + stdint: Verify the width of 'long long' before using it as int64_t. + Suggested by Paul Eggert in + . + * lib/stdint.in.h (gl_int64_t): Verify that the number of bits of + 'long long' is 64 before using it. + (gl_uint64_t): Verify that the number of bits of 'unsigned long long' + is 64 before using it. + 2024-05-19 Collin Funk getusershell: Work around musl bugs. diff --git a/lib/stdint.in.h b/lib/stdint.in.h index fea7483b9c..cd3fbdd965 100644 --- a/lib/stdint.in.h +++ b/lib/stdint.in.h @@ -80,7 +80,7 @@ #define _@GUARD_PREFIX@_STDINT_H /* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX, - LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH. */ + LONG_MIN, LONG_MAX, ULONG_MAX, CHAR_BIT, _GL_INTEGER_WIDTH. */ #include /* Override WINT_MIN and WINT_MAX if gnulib's or overrides @@ -189,6 +189,10 @@ typedef __int64 gl_int64_t; # define int64_t gl_int64_t # define GL_INT64_T # else +/* Verify that 'long long' has exactly 64 bits. */ +typedef _gl_verify_int64_bits[ + _STDINT_MAX (1, sizeof (long long) * CHAR_BIT, 0ll) >> 31 >> 31 == 1 + ? 1 : -1]; # undef int64_t typedef long long int gl_int64_t; # define int64_t gl_int64_t @@ -210,6 +214,11 @@ typedef unsigned __int64 gl_uint64_t; # define uint64_t gl_uint64_t # define GL_UINT64_T # else +/* Verify that 'unsigned long long' has exactly 64 bits. */ +typedef _gl_verify_uint64_bits[ + _STDINT_MAX (0, sizeof (unsigned long long) * CHAR_BIT, 0ull) + >> 31 >> 31 >> 1 == 1 + ? 1 : -1]; # undef uint64_t typedef unsigned long long int gl_uint64_t; # define uint64_t gl_uint64_t