Skip to contentSkip to conversation

malloc.3: Scale back promises of alignment

PATCH In review Greg Price 2 participants 2 messages Oct 24, 2013 – Oct 25, 2013 1 message not in the archive Man-pages: manual pages for Linux -- Sections 2, 3, 4, 5, and 7

lore
Share & tools
lore

Greg Price

author
#0 lore raw

PATCH 1/1 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.

---
 man3/malloc.3 | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
man3/malloc.3 +3 -3
index 372b503..84d9852 100644
@@ -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
Signature · 5 lines
1.8.3.2
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

A message that is not in the archive (sent off-list or not yet received): 20131024194248.GC16996-Kwy/[email protected]

#2 lore raw

Greg,

Quoted 19 lines · Greg Price

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.

Quoted 3 lines

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.

Thanks for the patch and the excellent commit message. I've applied.

Cheers,

Michael

Quoted 30 lines
---
 man3/malloc.3 | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
man3/malloc.3 +3 -3
index 372b503..84d9852 100644
@@ -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
Signature · 7 lines
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
My next Linux/UNIX system programming course:
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html