malloc.3: Scale back promises of alignment

It's not true that the return value is suitably aligned for "any
variable"; for example, it's unsuitable for a variable like
  float *x __attribute__ ((__vector_size__ (32)));
which requires 32-byte alignment.  Types like this are defined in
<avxintrin.h>, and with 16-byte alignment in <emmintrin.h> and
<xmmintrin.h>, so the application programmer need not even know
that a vector_size attribute has been applied.

On an x86 architecture, a program that loads from or stores to a
pointer with this type derived from malloc can crash because GCC
generates an aligned load/store, like MOVDQA.

The C99 standard (TC3, as of N1256) does say the return value is
suitably aligned for "any type of object".  The C11 standard (as
of N1570) revises this to any type with "fundamental alignment",
which means an alignment "supported by the implementation in all
contexts", which I suppose tautologically includes aligning
malloc/realloc return values.

The actual behavior of current glibc malloc is to align to the
greater of 2 * sizeof(size_t) and __alignof__ (long double),
which may be one bit greater than this commit promises.

Signed-off-by: Greg Price <price@mit.edu>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Greg Price 2013-10-24 15:42:48 -04:00 committed by Michael Kerrisk
parent fa9efa8632
commit 25630b2764
1 changed files with 3 additions and 3 deletions

View File

@ -131,8 +131,8 @@ The
.BR malloc ()
and
.BR calloc ()
functions return a pointer to the allocated memory
that is suitably aligned for any kind of variable.
functions return a pointer to the allocated memory,
which is suitably aligned for any built-in type.
On error, these functions return NULL.
NULL may also be returned by a successful call to
.BR malloc ()
@ -154,7 +154,7 @@ function returns no value.
The
.BR realloc ()
function returns a pointer to the newly allocated memory, which is suitably
aligned for any kind of variable and may be different from
aligned for any built-in type and may be different from
.IR ptr ,
or NULL if the request fails.
If