diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2019-05-24 17:31:34 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-05-24 17:32:40 -0700 |
commit | 8f82e38947e9aaf910ecb8fe837aca19cd7dcc39 (patch) | |
tree | b4e0193ff81a9560486972b3d2ba95815271e337 /lib | |
parent | 0ffb8fd223dbc9ab6ec8aa33fb1cdf1056856344 (diff) | |
download | gnulib-8f82e38947e9aaf910ecb8fe837aca19cd7dcc39.tar.gz |
flexmember: update comments again
* lib/flexmember.h, m4/flexmember.m4: Improve comments further.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/flexmember.h | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/lib/flexmember.h b/lib/flexmember.h index 8e79bce03f..431bec11ec 100644 --- a/lib/flexmember.h +++ b/lib/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) \ |