On 04/06/2017 09:12 PM, Richard Biener wrote:
Right. The kernel also has many APIs which return multiple
variable-length data blocks, such as getdents64, and many more
interfaces in combination with read/recv system calls. Variable length
means that you cannot declare the appropriate type after the first data
item, so you technically have to use malloc.
POSIX interfaces which exhibit a similar pattern are getpwnam_r and
friends, but for them, you can probably use malloc without ill effect
(although there are still performance concerns).
Can you give a concrete example which shows the issue and how typeless_storage
helps?
An example is in libffi/src/closures.c:
char buf[MAXPATHLEN * 3];
if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL)
return -1;
The intent is that buf is untyped storage, from which the getmntent_r
function can allocate objects as needed (instead of using malloc).
Based on your earlier comments, GCC already supports that without any
further source code annotations.
Thanks,
Florian