Page MenuHomeFreeBSD

alloca.3: Add entry about defining VLAs in same block as alloca() to BUGS
Needs ReviewPublic

Authored by obiwac on Thu, Feb 19, 2:49 PM.

Details

Summary

Refer to alloca() as a (builtin) function or macro, as it could be
defined as either depending on the compiler.

Paragraph about bug comes from Darwin's libc, and example added to
illustrate it.

MFC after: 3 days
Obtained from: https://github.com/apple-oss-distributions/libc (partially)
Sponsored by: Klara, Inc.

Test Plan

Rendered manpage:

ALLOCA(3)                     FreeBSD Library Functions Manual                    ALLOCA(3)

NAME
     alloca – memory allocator

SYNOPSIS
     #include <stdlib.h>

     void *
     alloca(size_t size);

DESCRIPTION
     The alloca() function or macro allocates size bytes of space in the stack frame of the
     caller.  This temporary space is automatically freed on return.

RETURN VALUES
     alloca() returns a pointer to the beginning of the allocated space.

SEE ALSO
     brk(2), calloc(3), getpagesize(3), malloc(3), realloc(3)

HISTORY
     alloca() appeared in Version 7 AT&T UNIX/32V.

BUGS
     alloca() is machine and compiler dependent; its use is discouraged.

     alloca() is slightly unsafe because it cannot ensure that the pointer returned points
     to a valid and usable block of memory.  The allocation made may exceed the bounds of
     the stack, or even go further into other objects in memory, and alloca() cannot
     determine such an error.  Avoid alloca() with large unbounded allocations.

     The use of C99 variable-length arrays and alloca() in the same function will cause the
     lifetime of alloca()'s storage to be limited to the block containing the alloca().
     For example, in the following snippet, p's lifetime does not extend outside of the
     block, whereas it would've if vla hadn't been defined or had been defined as a fixed-
     length array:

           char *p;
           {
                   const int n = 100;
                   int vla[n];
                   p = alloca(32);
                   strcpy(p, "Hello, world!");
                   printf("Inside: %s\n", p);
           }
           printf("Outside: %s\n", p);

FreeBSD 16.0-CURRENT                 February 19, 2026                            ALLOCA(3)

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Skipped
Unit
Tests Skipped
Build Status
Buildable 70774
Build 67657: arc lint + arc unit