2021-08-30
WG14 straw polls on N2699 (Sized Memory Deallocation) indicated directional support and support for its choice of names. Author homework was:
calloc overflow handling.This is the promised paper.
These are the changes WG14 requested.
Paragraph 2 in each section has been changed from "If ptr is the result obtained from a call ..." to "If ptr is a null pointer or the result obtained from a call ...". This fixes the issue pointed out by Joseph Myers on the reflector, that the previous wording unintentionally made sized deallocation of null pointers undefined behavior if those pointers did not come from an allocation function (a divergence from existing implementations and other languages).
In the same paragraphs, "Otherwise, the result is undefined" has been changed to "Otherwise, the behavior is undefined". This is clearer, since these functions return void; there's not "result" per se.
To be added to the memory management functions section (7.22.3, relative to n2596), with X and Y filled in by the editor as appropriate. This is the version with the minimal edits suggested in previous discussion.
free_sized function1.
2. If ptr is a null pointer or the result obtained from a call to malloc(size), realloc(old_ptr, size), or calloc(nmemb, memb_size), where nmemb * memb_size is equal to size, this function behaves equivalently to free(ptr). Otherwise, the behavior is undefined.
3. NOTE: A conforming implementation may simply ignore size and call free.
4. NOTE: The result of an aligned_alloc call may not be passed to free_sized.
5. Implementations may provide extensions to query the usable size of an allocation, or to determine the usable size of the allocation that would result if a request for some other size were to succeed. Such implementations should allow passing the resulting usable size as the size parameter, and provide functionality equivalent to free in such cases.
6. The free_sized function returns no value.
free_aligned_sized function1.
2. If ptr is a null pointer or the result obtained from a call to aligned_alloc(alignment, size), this function behaves equivalently to free(ptr). Otherwise, the behavior is undefined.
3. NOTE: A conforming implementation may simply ignore size and alignment and call free.
4. NOTE: The result of a malloc, calloc, or realloc call may not be passed to free_aligned_sized.
5. Implementations may provide extensions to query the usable size of an allocation, or to determine the usable size of the allocation that would result if a request for some other size were to succeed. Such implementations should allow passing the resulting usable size as the size parameter, and provide functionality equivalent to free in such cases.
6. The free_aligned_sized function returns no value.
In review, Robert Seacord suggested some additional wording clarifications:
printf in terms of fprintf).free.This wording makes those changes (in addition to those above).
free_sized function1.
2. If ptr is a null pointer or the result obtained from a call to malloc, realloc, or calloc, where size is equal to the requested allocation size, this function is equivalent to free(ptr). Otherwise, the behavior is undefined.
3. NOTE: A conforming implementation may ignore size and call free.
4. NOTE: The result of an aligned_alloc call may not be passed to free_sized.
5. Implementations may provide extensions to query the usable size of an allocation, or to determine the usable size of the allocation that would result if a request for some other size were to succeed. Such implementations should allow passing the resulting usable size as the size parameter, and provide functionality equivalent to free in such cases.
6. The free_sized function returns no value.
free_aligned_sized function1.
2. If ptr is a null pointer or the result obtained from a call to aligned_alloc(alignment, size), where alignment is equal to the requested allocation alignment and size is equal to the requested allocation size, this function is equivalent to free(ptr). Otherwise, the behavior is undefined.
3. NOTE: A conforming implementation may ignore size and alignment and call free.
4. NOTE: The result of a malloc, calloc, or realloc call may not be passed to free_aligned_sized.
5. Implementations may provide extensions to query the usable size of an allocation, or to determine the usable size of the allocation that would result if a request for some other size were to succeed. Such implementations should allow passing the resulting usable size as the size parameter, and provide functionality equivalent to free in such cases.
6. The free_aligned_sized function returns no value.