Bug 291240 - Mistake in hcreate(3) manpage
Summary: Mistake in hcreate(3) manpage
Status: Closed FIXED
Alias: None
Product: Documentation
Classification: Unclassified
Component: Manual Pages (show other bugs)
Version: Latest
Hardware: Any Any
: --- Affects Many People
Assignee: Warner Losh
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-11-26 22:10 UTC by dacav
Modified: 2026-07-18 19:06 UTC (History)
3 users (show)

See Also:


Attachments
Shell session: trivial example + valgrind (1.41 KB, text/plain)
2025-11-26 22:10 UTC, dacav
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description dacav 2025-11-26 22:10:55 UTC
Created attachment 265666 [details]
Shell session: trivial example + valgrind

The manpage claims that:

> The hdestroy() function calls free(3) for each comparison key in
> the search table but not the data item associated with the key.

This seems incorrect.

The implementation frees the table but not the table items:
https://cgit.freebsd.org/src/tree/lib/libc/stdlib/hdestroy_r.c
See also attached proof.

I think the problem is in the manpage because current implementation behaves correctly:

- POSIX is not specific about it in the function description, but it provides an example where the caller holds ownership of the keys: https://pubs.opengroup.org/onlinepubs/9699919799/functions/hcreate.html

- The GNU manpage hsearch(3) claims that: "The hdestroy() and hdestroy_r() functions do not free the buffers pointed to by the key and data elements of the hash table entries".
Comment 1 commit-hook freebsd_committer freebsd_triage 2026-06-10 12:36:25 UTC
A commit in branch main references this bug:

URL: https://cgit.FreeBSD.org/src/commit/?id=ab8ceaaa86baa077fcdc020a0c05ccf88fcd54d1

commit ab8ceaaa86baa077fcdc020a0c05ccf88fcd54d1
Author:     Kit Dallege <xaum.io@gmail.com>
AuthorDate: 2026-03-27 01:57:10 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2026-06-10 12:35:05 +0000

    hcreate(3): fix incorrect claim that hdestroy frees keys

    The man page incorrectly stated that hdestroy() calls free(3) for
    each comparison key. The implementation (hdestroy_r.c) only frees
    the internal table structure, not the user-provided keys or data.
    This matches POSIX, which says hdestroy "shall dispose of the
    search table" without mentioning key deallocation.

    Update the description to clarify that the caller is responsible
    for freeing any memory associated with table entries.

    PR: 291240
    Signed-off-by: Kit Dallege <xaum.io@gmail.com>
    Reviewed by: imp
    Pull Request: https://github.com/freebsd/freebsd-src/pull/2095

 lib/libc/stdlib/hcreate.3 | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)