diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-12-30 16:14:58 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-01-04 08:42:25 -0300 |
commit | 9c774ad76497f4ec82d78508305965f01fda7327 (patch) | |
tree | b5bb0d3c301ec1bea287c04eb415ea0d2f47424a /posix/flexmember.h | |
parent | 11b2858bd153f6d68935bef74e48eaf6f2dda25e (diff) | |
download | glibc-9c774ad76497f4ec82d78508305965f01fda7327.tar.gz glibc-9c774ad76497f4ec82d78508305965f01fda7327.tar.xz glibc-9c774ad76497f4ec82d78508305965f01fda7327.zip |
Sync flexmember.h with gnulib
It sync with gnulib commit 43ee1a6bf.
Diffstat (limited to 'posix/flexmember.h')
-rw-r--r-- | posix/flexmember.h | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/posix/flexmember.h b/posix/flexmember.h index 1759a5e81e..1b19a2bfd9 100644 --- a/posix/flexmember.h +++ b/posix/flexmember.h @@ -33,11 +33,26 @@ # define FLEXALIGNOF(type) _Alignof (type) #endif -/* Upper bound on the size of a struct of type TYPE with a flexible - array member named MEMBER that is followed by N bytes of other data. - This is not simply sizeof (TYPE) + N, since it may require - alignment on unusually picky C11 platforms, and - FLEXIBLE_ARRAY_MEMBER may be 1 on pre-C11 platforms. +/* Yield a properly aligned upper bound on the size of a struct of + type TYPE with a flexible array member named MEMBER that is + followed by N bytes of other data. The result is suitable as an + argument to malloc. For example: + + struct s { int n; char d[FLEXIBLE_ARRAY_MEMBER]; }; + struct s *p = malloc (FLEXSIZEOF (struct s, d, n * sizeof (char))); + + FLEXSIZEOF (TYPE, MEMBER, N) is not simply (sizeof (TYPE) + N), + since FLEXIBLE_ARRAY_MEMBER may be 1 on pre-C11 platforms. Nor is + it simply (offsetof (TYPE, MEMBER) + N), as that might yield a size + that causes malloc to yield a pointer that is not properly aligned + for TYPE; for example, if sizeof (int) == alignof (int) == 4, + malloc (offsetof (struct s, d) + 3 * sizeof (char)) is equivalent + to malloc (7) and might yield a pointer that is not a multiple of 4 + (which means the pointer is not properly aligned for struct s), + whereas malloc (FLEXSIZEOF (struct s, d, 3 * sizeof (char))) is + equivalent to malloc (8) and must yield a pointer that is a + multiple of 4. + Yield a value less than N if and only if arithmetic overflow occurs. */ #define FLEXSIZEOF(type, member, n) \ |