| From: | "Tristan Partin" <tristan(at)partin(dot)io> |
|---|---|
| To: | "Zsolt Parragi" <zsolt(dot)parragi(at)percona(dot)com> |
| Cc: | "pgsql-hackers" <pgsql-hackers(at)postgresql(dot)org> |
| Subject: | Re: Fix mismatched deallocation functions |
| Date: | 2026-05-28 20:21:40 |
| Message-ID: | DIUL8DKMJPJU.2DJ3NIJYMZRAR@partin.io |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Thu May 7, 2026 at 10:01 PM UTC, Zsolt Parragi wrote:
> Hello!
>
> There are many cases missed by the script, for example:
>
> tab-complete.in.c:7089:
>
> `previous_words = pg_malloc_array(char *, point);`
>
> tab-complete.in.c:6364:
>
> `completion_ref_object = pg_strdup(word);`
>
> tab-complete.in.c:7090:
>
> `*buffer = (char *) pg_malloc(point * 2);`
>
> There's also completion_ref_schema, which is an out parameter of
> parse_identifier, still freed in the patch.
Thanks. I have adjusted the script to cover these instances, and fixed
the patch in v2.
> The strtokx change in stringutils.c is also strange - the patch
> converts one free at line 96, and leaves the same free a few lines
> above at line 73 as is.
Thanks. Fixed this as well in the script. Fixed in v2.
>> I generated the patch with the help of Coccinelle[0]. I'm no expert with
>> Coccinelle, but it seemed like a good candidate to get this refactor
>> done. You can run the attached script in your tree with the following
>> command:
>
> If I had to do it, I would try to approach this with static analysis
> tools instead: a custom rule that enforces attribute declarations for
> return values / output parameters allocated by pg_malloc and similar
> functions. Without attributes everywhere, these checks will never be
> complete because tools won't be able to fully reason about cross
> source file call paths.
> For example clang-tidy even has an auto fix mode that could apply
> these attributes automatically.
>
> With the attributes in place, we would automatically receive warnings
> for every incorrect free attribute, which a tool could then
> automatically fix.
This would be nice. GCC already has some of this functionality:
__attribute__((malloc(pfree))). When you add the deallocator, GCC will
warn: -Wmismatched-dealloc. Perhaps there was some confusion in my
initial proposal. I cannot confirm if this patch fixes every instance,
but what it does do is get all my __attribute__((malloc)) additions
added to the codebase without causing additional compiler warning noise,
which would be a prerequisite to committing the __attribute__((malloc))
additions. I would think that as GCC continues to evolve, we could get
even more warnings generated to help us find further issues with
mismatched deallocation functions.
> If we want to avoid generating noise by placing attributes everywhere
> in the source (I'm not sure how noisy that would be), that part could
> be a specialized CI run instead, since the transformation itself can
> be automated.
The current size of my attribute patch is not very noisy at all:
src/include/c.h | 12 ++++++++++++
src/include/common/fe_memutils.h | 36 ++++++++++++++++++------------------
src/include/utils/palloc.h | 30 +++++++++++++++---------------
3 files changed, 45 insertions(+), 33 deletions(-)
I would advocate for adding the attributes, which is why I have
submitted this preliminary patch. In addition to -Wmismatched-dealloc,
GCC also can use -Wfree-nonheap-object, when the attributes are present.
Attached you will find v2 of the patch and v2 of the Coccinelle script.
For more reading on __attribute__((malloc)), see the GCC documentation:
https://gcc.gnu.org/onlinedocs/gcc/Common-Attributes.html#index-malloc.
--
Tristan Partin
PostgreSQL Contributors Team
AWS (https://aws.amazon.com)
| Attachment | Content-Type | Size |
|---|---|---|
| v2-0001-Fix-mismatched-deallocation-functions.patch | text/x-patch | 51.4 KB |
| allocators.cocci | text/plain | 5.4 KB |
| From | Date | Subject | |
|---|---|---|---|
| Previous Message | Andres Freund | 2026-05-28 19:42:13 | Re: Heads Up: cirrus-ci is shutting down June 1st |