This is the mail archive of the
mailing list for the glibc project.
Re: [PATCH] alloc_buffer: Return unqualified pointer type in alloc_buffer_next
- From: Carlos O'Donell <codonell at redhat dot com>
- To: Florian Weimer <fweimer at redhat dot com>, libc-alpha at sourceware dot org
- Date: Mon, 8 Apr 2019 10:34:49 -0400
- Subject: Re: [PATCH] alloc_buffer: Return unqualified pointer type in alloc_buffer_next
- References: <20190308204633.49DCE80DD6B5@oldenburg2.str.redhat.com>
On 3/8/19 3:46 PM, Florian Weimer wrote:
alloc_buffer_next is useful for peeking to the remaining part of the
buffer and update it, with subsequent allocation (once the length
is known) using alloc_buffer_alloc_bytes. This is not as robust
as the other interfaces, but it allows using alloc_buffer with
string-writing interfaces such as snprintf and ns_name_ntop.
Until now alloc_buffer_next was only used for testing alloc_buffer itself.
Please add a detailed example in the comments for how this API should be
used. The use case is interesting enough that it needs comments.
OK if you add detailed comments in the header for the use case intended.
Reviewed-by: Carlos O'Donell <firstname.lastname@example.org>
2019-03-08 Florian Weimer <email@example.com>
* include/alloc_buffer.h (alloc_buffer_alloc_bytes): Update
(alloc_buffer_next): Change return type to non-const.
diff --git a/include/alloc_buffer.h b/include/alloc_buffer.h
index f27cbb65ca..7f68f46eac 100644
@@ -183,7 +183,7 @@ alloc_buffer_add_byte (struct alloc_buffer *buf, unsigned char b)
NULL is returned if there is not enough room, and the buffer is
marked as failed, or if the buffer has already failed.
(Zero-length allocations from an empty buffer which has not yet
- failed succeed.) */
+ failed succeed.) The buffer contents is not modified. */
static inline __attribute__ ((nonnull (1))) void *
alloc_buffer_alloc_bytes (struct alloc_buffer *buf, size_t length)
@@ -302,9 +302,13 @@ __alloc_buffer_next (struct alloc_buffer *buf, size_t align)
alloc_buffer_alloc returns the same pointer). Note that the buffer
is still aligned according to the requirements of TYPE. The effect
of this function is similar to allocating a zero-length array from
- the buffer. */
+ the buffer. It is possible to use the return pointer to write to
+ the buffer and consume the written bytes using
+ alloc_buffer_alloc_bytes (which does not change the buffer
+ contents), but the calling code needs to perform manual length
+ checks using alloc_buffer_size. */
This needs a detailed example in the header comments like the other API usage
examples. This use is odd enough that it needs a good comment.
#define alloc_buffer_next(buf, type) \
- ((const type *) __alloc_buffer_next \
+ ((type *) __alloc_buffer_next \
(buf, __alloc_buffer_assert_align (__alignof__ (type))))
/* Internal function. Allocate an array. */