In fe_memutils.h, we have two sets of allocation/deallocation functions: 
those that start pg_ and those that start with p. pg_malloc vs palloc, 
pg_free vs pfree, etc. My understanding is that we probably want to 
match the allocator with the deallocator whenever possible, but that is 
not the case in HEAD. We have quite a few mismatches.

I discovered these issues when adding some __attribute__((malloc)) 
annotations to our allocation functions. gcc presents warnings in the 
form of:

        ../src/bin/psql/tab-complete.in.c: In function ‘psql_completion’:
        ../src/bin/psql/tab-complete.in.c:2143:9: warning: ‘free’ called on 
pointer returned from a mismatched allocation function [-Wmismatched-dealloc]
         2143 |         free(text_copy);
              |         ^~~~~~~~~~~~~~~
        ../src/bin/psql/tab-complete.in.c:1971:33: note: returned from 
‘pnstrdup’
         1971 |         char       *text_copy = pnstrdup(rl_line_buffer + 
start, end - start);
              |                                 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Memory that we allocated pnstrdup() is being deallocated with free(). 
In actuality, this is not an issue because pnstrdup() uses malloc() 
internally. However, it does create a little bit of mental overhead when 
analyzing memory management in code paths. Warnings like this are also 
a barrier to annotating our memory allocation functions with 
__attribute__((malloc)).

The supplied patch allows for a clean compliation on my Linux x86_64 
machine with malloc attribute applied. I will send that patch later 
after a little bit more development.

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:

        spatch --sp-file allocators.cocci --allow-inconsistent-paths \
                --in-place .

[0]: https://coccinelle.gitlabpages.inria.fr/website/

-- 
Tristan Partin
PostgreSQL Contributors Team
AWS (https://aws.amazon.com)
From 09f0e46cbc8bad67c45a2b717e09ea9fec6074fd Mon Sep 17 00:00:00 2001
From: Tristan Partin <[email protected]>
Date: Wed, 6 May 2026 21:58:16 +0000
Subject: [PATCH v1] Fix mismatched deallocation functions

In fe_memutils.h, we have various allocation functions beginning with
either pg_ or p. The pg_ functions have a matching pg_free() for freeing
memory, while the p functions use pfree(). In some cases, we were
allocating memory with one set of functions while using the wrong
deallocation functions. This creates a tiny bit of mental overhead when
reading code. Matching up allocation and deallocation functions makes it
easier to analyze memory handling in a code path.

Signed-off-by: Tristan Partin <[email protected]>
---
 contrib/oid2name/oid2name.c                   |   6 +-
 src/bin/initdb/initdb.c                       |  14 +-
 src/bin/pg_basebackup/pg_basebackup.c         |   2 +-
 src/bin/pg_basebackup/pg_createsubscriber.c   |  10 +-
 src/bin/pg_basebackup/streamutil.c            |   8 +-
 src/bin/pg_combinebackup/load_manifest.c      |   2 +-
 src/bin/pg_combinebackup/pg_combinebackup.c   |   2 +-
 src/bin/pg_combinebackup/reconstruct.c        |   8 +-
 src/bin/pg_ctl/pg_ctl.c                       |   8 +-
 src/bin/pg_dump/compress_gzip.c               |   8 +-
 src/bin/pg_dump/compress_lz4.c                |   2 +-
 src/bin/pg_dump/compress_none.c               |   2 +-
 src/bin/pg_dump/connectdb.c                   |  12 +-
 src/bin/pg_dump/dumputils.c                   |   4 +-
 src/bin/pg_dump/parallel.c                    |   2 +-
 src/bin/pg_dump/pg_backup_archiver.c          |  18 +--
 src/bin/pg_dump/pg_backup_custom.c            |   4 +-
 src/bin/pg_dump/pg_backup_db.c                |   2 +-
 src/bin/pg_dump/pg_backup_directory.c         |   2 +-
 src/bin/pg_dump/pg_backup_tar.c               |   6 +-
 src/bin/pg_dump/pg_dump.c                     | 128 +++++++++---------
 src/bin/pg_dump/pg_dump_sort.c                |  12 +-
 src/bin/pg_dump/pg_dumpall.c                  |   6 +-
 src/bin/pg_upgrade/check.c                    |   8 +-
 src/bin/pg_upgrade/function.c                 |   2 +-
 src/bin/pg_verifybackup/pg_verifybackup.c     |   4 +-
 src/bin/pgbench/pgbench.c                     |   4 +-
 src/bin/psql/command.c                        |  10 +-
 src/bin/psql/common.c                         |   4 +-
 src/bin/psql/describe.c                       |  14 +-
 src/bin/psql/help.c                           |   2 +-
 src/bin/psql/large_obj.c                      |   4 +-
 src/bin/psql/mainloop.c                       |  12 +-
 src/bin/psql/prompt.c                         |   4 +-
 src/bin/psql/startup.c                        |  14 +-
 src/bin/psql/stringutils.c                    |   4 +-
 src/bin/psql/tab-complete.in.c                |  12 +-
 src/bin/scripts/vacuuming.c                   |   2 +-
 src/common/logging.c                          |   2 +-
 src/fe_utils/print.c                          |  34 ++---
 src/interfaces/ecpg/test/pg_regress_ecpg.c    |   2 +-
 src/test/isolation/isolation_main.c           |   2 +-
 src/test/isolation/isolationtester.c          |  10 +-
 .../modules/libpq_pipeline/libpq_pipeline.c   |   8 +-
 src/test/regress/pg_regress.c                 |   6 +-
 src/test/regress/pg_regress_main.c            |   2 +-
 46 files changed, 217 insertions(+), 217 deletions(-)

diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c
index 1e9efcd395..fbe923370a 100644
--- a/contrib/oid2name/oid2name.c
+++ b/contrib/oid2name/oid2name.c
@@ -427,7 +427,7 @@ sql_exec(PGconn *conn, const char *todo, bool quiet)
 		memset(pad, '-', l);
 		pad[l] = '\0';
 		fprintf(stdout, "%s\n", pad);
-		free(pad);
+		pg_free(pad);
 	}
 
 	/* for each row, dump the information */
@@ -440,7 +440,7 @@ sql_exec(PGconn *conn, const char *todo, bool quiet)
 
 	/* cleanup */
 	PQclear(res);
-	free(length);
+	pg_free(length);
 
 	return 0;
 }
@@ -562,7 +562,7 @@ sql_exec_searchtables(PGconn *conn, struct options *opts)
 					opts->extended ? addfields : "",
 					qualifiers);
 
-	free(qualifiers);
+	pg_free(qualifiers);
 
 	sql_exec(conn, todo, opts->quiet);
 }
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 14cb79c26b..eb41be5ab9 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -983,12 +983,12 @@ find_matching_ts_config(const char *lc_type)
 	{
 		if (pg_strcasecmp(tsearch_config_languages[i].langname, langname) == 0)
 		{
-			free(langname);
+			pg_free(langname);
 			return tsearch_config_languages[i].tsconfname;
 		}
 	}
 
-	free(langname);
+	pg_free(langname);
 	return NULL;
 }
 
@@ -1052,7 +1052,7 @@ write_version_file(const char *extrapath)
 	if (fprintf(version_file, "%s\n", PG_MAJORVERSION) < 0 ||
 		fclose(version_file))
 		pg_fatal("could not write file \"%s\": %m", path);
-	free(path);
+	pfree(path);
 }
 
 /*
@@ -1071,7 +1071,7 @@ set_null_conf(void)
 		pg_fatal("could not open file \"%s\" for writing: %m", path);
 	if (fclose(conf_file))
 		pg_fatal("could not write file \"%s\": %m", path);
-	free(path);
+	pfree(path);
 }
 
 /*
@@ -3048,7 +3048,7 @@ create_xlog_or_symlink(void)
 					 subdirloc);
 	}
 
-	free(subdirloc);
+	pfree(subdirloc);
 }
 
 
@@ -3103,7 +3103,7 @@ initialize_data_directory(void)
 		if (mkdir(path, pg_dir_create_mode) < 0)
 			pg_fatal("could not create directory \"%s\": %m", path);
 
-		free(path);
+		pfree(path);
 	}
 
 	check_ok();
@@ -3303,7 +3303,7 @@ main(int argc, char *argv[])
 					*equals++ = '\0';	/* terminate variable name */
 					add_stringlist_item(&extra_guc_names, buf);
 					add_stringlist_item(&extra_guc_values, equals);
-					pfree(buf);
+					pg_free(buf);
 				}
 				break;
 			case 'D':
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index c1a4672aa6..b02b8c2fdd 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -2857,7 +2857,7 @@ main(int argc, char **argv)
 
 		if (symlink(xlog_dir, linkloc) != 0)
 			pg_fatal("could not create symbolic link \"%s\": %m", linkloc);
-		free(linkloc);
+		pfree(linkloc);
 	}
 
 	BaseBackup(compression_algorithm, compression_detail, compressloc,
diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c
index 15e06e5686..469204268c 100644
--- a/src/bin/pg_basebackup/pg_createsubscriber.c
+++ b/src/bin/pg_basebackup/pg_createsubscriber.c
@@ -759,7 +759,7 @@ modify_subscriber_sysid(const struct CreateSubscriberOptions *opt)
 	cmd_str = psprintf("\"%s\" -D \"%s\" >> \"%s\"", pg_resetwal_path,
 					   subscriber_dir, out_file);
 	if (opt->log_dir)
-		pg_free(out_file);
+		pfree(out_file);
 
 	pg_log_debug("pg_resetwal command is: %s", cmd_str);
 
@@ -774,7 +774,7 @@ modify_subscriber_sysid(const struct CreateSubscriberOptions *opt)
 	}
 
 	pg_free(cf);
-	pg_free(cmd_str);
+	pfree(cmd_str);
 }
 
 /*
@@ -2129,8 +2129,8 @@ set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, cons
 
 	PQfreemem(subname);
 	PQfreemem(dbname);
-	pg_free(originname);
-	pg_free(lsnstr);
+	pfree(originname);
+	pfree(lsnstr);
 	destroyPQExpBuffer(str);
 }
 
@@ -2514,7 +2514,7 @@ main(int argc, char **argv)
 		if (!internal_log_file_fp)
 			pg_fatal("could not open log file \"%s\": %m", internal_log_file);
 
-		pg_free(internal_log_file);
+		pfree(internal_log_file);
 
 		pg_logging_set_logfile(internal_log_file_fp);
 	}
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
index 76abdfa2ae..b5d3351dd3 100644
--- a/src/bin/pg_basebackup/streamutil.c
+++ b/src/bin/pg_basebackup/streamutil.c
@@ -203,15 +203,15 @@ GetConnection(void)
 	{
 		pg_log_error("%s", PQerrorMessage(tmpconn));
 		PQfinish(tmpconn);
-		free(values);
-		free(keywords);
+		pg_free(values);
+		pg_free(keywords);
 		PQconninfoFree(conn_opts);
 		return NULL;
 	}
 
 	/* Connection ok! */
-	free(values);
-	free(keywords);
+	pg_free(values);
+	pg_free(keywords);
 	PQconninfoFree(conn_opts);
 
 	/*
diff --git a/src/bin/pg_combinebackup/load_manifest.c b/src/bin/pg_combinebackup/load_manifest.c
index 2e50b7af4d..0b5a4ae4d7 100644
--- a/src/bin/pg_combinebackup/load_manifest.c
+++ b/src/bin/pg_combinebackup/load_manifest.c
@@ -214,7 +214,7 @@ load_backup_manifest(char *backup_directory)
 	}
 
 	/* All done. */
-	pfree(buffer);
+	pg_free(buffer);
 	return result;
 }
 
diff --git a/src/bin/pg_combinebackup/pg_combinebackup.c b/src/bin/pg_combinebackup/pg_combinebackup.c
index d13bf63eb1..43ea2f4f10 100644
--- a/src/bin/pg_combinebackup/pg_combinebackup.c
+++ b/src/bin/pg_combinebackup/pg_combinebackup.c
@@ -1159,7 +1159,7 @@ process_directory_recursively(Oid tsoid,
 
 		/* Avoid leaking memory. */
 		if (checksum_payload != NULL)
-			pfree(checksum_payload);
+			pg_free(checksum_payload);
 	}
 
 	closedir(dir);
diff --git a/src/bin/pg_combinebackup/reconstruct.c b/src/bin/pg_combinebackup/reconstruct.c
index 3349aa2441..2baf6656e1 100644
--- a/src/bin/pg_combinebackup/reconstruct.c
+++ b/src/bin/pg_combinebackup/reconstruct.c
@@ -372,9 +372,9 @@ reconstruct_from_incremental_file(char *input_filename,
 		pg_free(s->filename);
 		pg_free(s);
 	}
-	pfree(sourcemap);
-	pfree(offsetmap);
-	pfree(source);
+	pg_free(sourcemap);
+	pg_free(offsetmap);
+	pg_free(source);
 }
 
 /*
@@ -518,7 +518,7 @@ make_rfile(char *filename, bool missing_ok)
 	{
 		if (missing_ok && errno == ENOENT)
 		{
-			pg_free(rf->filename);
+			pfree(rf->filename);
 			pg_free(rf);
 			return NULL;
 		}
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 5539eb8ebe..85b878a6c2 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -357,7 +357,7 @@ readfile(const char *path, int *numlines)
 	if (len != statbuf.st_size)
 	{
 		/* oops, the file size changed between fstat and read */
-		free(buffer);
+		pg_free(buffer);
 		return NULL;
 	}
 
@@ -398,7 +398,7 @@ readfile(const char *path, int *numlines)
 	}
 	result[n] = NULL;
 
-	free(buffer);
+	pg_free(buffer);
 
 	return result;
 }
@@ -2168,7 +2168,7 @@ adjust_data_dir(void)
 		write_stderr(_("%s: could not determine the data directory using command \"%s\"\n"), progname, cmd);
 		exit(1);
 	}
-	free(my_exec_path);
+	pg_free(my_exec_path);
 
 	/* strip trailing newline and carriage return */
 	(void) pg_strip_crlf(filename);
@@ -2288,7 +2288,7 @@ main(int argc, char **argv)
 					 * but we do -D too for clearer postmaster 'ps' display
 					 */
 					pgdata_opt = psprintf("-D \"%s\" ", pgdata_D);
-					free(pgdata_D);
+					pg_free(pgdata_D);
 					break;
 				}
 			case 'e':
diff --git a/src/bin/pg_dump/compress_gzip.c b/src/bin/pg_dump/compress_gzip.c
index 60c553ba25..bd1043b236 100644
--- a/src/bin/pg_dump/compress_gzip.c
+++ b/src/bin/pg_dump/compress_gzip.c
@@ -229,9 +229,9 @@ ReadDataFromArchiveGzip(ArchiveHandle *AH, CompressorState *cs)
 	if (inflateEnd(zp) != Z_OK)
 		pg_fatal("could not close compression library: %s", zp->msg);
 
-	free(buf);
-	free(out);
-	free(zp);
+	pg_free(buf);
+	pg_free(out);
+	pg_free(zp);
 }
 
 /* Public routines that support gzip compressed data I/O */
@@ -421,7 +421,7 @@ Gzip_open_write(const char *path, const char *mode, CompressFileHandle *CFH)
 	ret = CFH->open_func(fname, -1, mode, CFH);
 
 	save_errno = errno;
-	pg_free(fname);
+	pfree(fname);
 	errno = save_errno;
 
 	return ret;
diff --git a/src/bin/pg_dump/compress_lz4.c b/src/bin/pg_dump/compress_lz4.c
index 0a7872116e..500d5e16a6 100644
--- a/src/bin/pg_dump/compress_lz4.c
+++ b/src/bin/pg_dump/compress_lz4.c
@@ -755,7 +755,7 @@ LZ4Stream_open_write(const char *path, const char *mode, CompressFileHandle *CFH
 	ret = CFH->open_func(fname, -1, mode, CFH);
 
 	save_errno = errno;
-	pg_free(fname);
+	pfree(fname);
 	errno = save_errno;
 
 	return ret;
diff --git a/src/bin/pg_dump/compress_none.c b/src/bin/pg_dump/compress_none.c
index 743e2ce94b..47bc6f1f3d 100644
--- a/src/bin/pg_dump/compress_none.c
+++ b/src/bin/pg_dump/compress_none.c
@@ -53,7 +53,7 @@ ReadDataFromArchiveNone(ArchiveHandle *AH, CompressorState *cs)
 		ahwrite(buf, 1, cnt, AH);
 	}
 
-	free(buf);
+	pg_free(buf);
 }
 
 
diff --git a/src/bin/pg_dump/connectdb.c b/src/bin/pg_dump/connectdb.c
index f3ce8b1cfb..b04076bf34 100644
--- a/src/bin/pg_dump/connectdb.c
+++ b/src/bin/pg_dump/connectdb.c
@@ -66,8 +66,8 @@ ConnectDatabase(const char *dbname, const char *connection_string,
 		char	   *err_msg = NULL;
 		int			i = 0;
 
-		free(keywords);
-		free(values);
+		pg_free(keywords);
+		pg_free(values);
 		PQconninfoFree(conn_opts);
 
 		/*
@@ -176,8 +176,8 @@ ConnectDatabase(const char *dbname, const char *connection_string,
 		{
 			PQfinish(conn);
 
-			free(keywords);
-			free(values);
+			pg_free(keywords);
+			pg_free(values);
 			PQconninfoFree(conn_opts);
 
 			return NULL;
@@ -191,8 +191,8 @@ ConnectDatabase(const char *dbname, const char *connection_string,
 	if (connstr)
 		*connstr = constructConnStr(keywords, values);
 
-	free(keywords);
-	free(values);
+	pg_free(keywords);
+	pg_free(values);
 	PQconninfoFree(conn_opts);
 
 	/* Check version */
diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c
index dfb1f603a4..2dc9855098 100644
--- a/src/bin/pg_dump/dumputils.c
+++ b/src/bin/pg_dump/dumputils.c
@@ -343,8 +343,8 @@ buildACLCommands(const char *name, const char *subname, const char *nspname,
 
 	free(aclitems);
 	free(baseitems);
-	free(grantitems);
-	free(revokeitems);
+	pg_free(grantitems);
+	pg_free(revokeitems);
 
 	return ok;
 }
diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
index a7bed5eccc..3e5e940d80 100644
--- a/src/bin/pg_dump/parallel.c
+++ b/src/bin/pg_dump/parallel.c
@@ -499,7 +499,7 @@ WaitForTerminatingWorkers(ParallelState *pstate)
 		ret = WaitForMultipleObjects(nrun, lpHandles, false, INFINITE);
 		Assert(ret != WAIT_FAILED);
 		hThread = (uintptr_t) lpHandles[ret - WAIT_OBJECT_0];
-		free(lpHandles);
+		pg_free(lpHandles);
 
 		/* Find dead worker's slot, and clear the hThread field */
 		for (j = 0; j < pstate->numWorkers; j++)
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index fecf6f2d1c..7e65562886 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -1698,12 +1698,12 @@ archprintf(Archive *AH, const char *fmt,...)
 			break;				/* success */
 
 		/* Release buffer and loop around to try again with larger len. */
-		free(p);
+		pg_free(p);
 		len = cnt;
 	}
 
 	WriteData(AH, p, cnt);
-	free(p);
+	pg_free(p);
 	return (int) cnt;
 }
 
@@ -1802,12 +1802,12 @@ ahprintf(ArchiveHandle *AH, const char *fmt,...)
 			break;				/* success */
 
 		/* Release buffer and loop around to try again with larger len. */
-		free(p);
+		pg_free(p);
 		len = cnt;
 	}
 
 	ahwrite(p, 1, cnt, AH);
-	free(p);
+	pg_free(p);
 	return (int) cnt;
 }
 
@@ -2865,7 +2865,7 @@ ReadToc(ArchiveHandle *AH)
 			}
 			else
 			{
-				free(deps);
+				pg_free(deps);
 				te->dependencies = NULL;
 				te->nDeps = 0;
 			}
@@ -2925,7 +2925,7 @@ processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
 		pg_fatal("invalid ENCODING item: %s",
 				 te->defn);
 
-	free(defn);
+	pg_free(defn);
 }
 
 static void
@@ -3908,7 +3908,7 @@ _getObjectDescription(PQExpBuffer buf, const TocEntry *te)
 
 		appendPQExpBufferStr(buf, first);
 
-		free(first);
+		pg_free(first);
 		return;
 	}
 	/* these object types don't have separate owners */
@@ -4124,7 +4124,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, const char *pfx)
 			char	   *cmdEnd = psprintf(" OWNER TO %s", fmtId(te->owner));
 
 			IssueCommandPerBlob(AH, te, "ALTER LARGE OBJECT ", cmdEnd);
-			pg_free(cmdEnd);
+			pfree(cmdEnd);
 		}
 		else
 		{
@@ -5104,7 +5104,7 @@ identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te)
 
 	if (nlockids == 0)
 	{
-		free(lockids);
+		pg_free(lockids);
 		return;
 	}
 
diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c
index 5299062094..052ad5c6a2 100644
--- a/src/bin/pg_dump/pg_backup_custom.c
+++ b/src/bin/pg_dump/pg_backup_custom.c
@@ -645,7 +645,7 @@ _skipData(ArchiveHandle *AH)
 		{
 			if (blkLen > buflen)
 			{
-				free(buf);
+				pg_free(buf);
 				buflen = Max(blkLen, 4 * 1024);
 				buf = (char *) pg_malloc(buflen);
 			}
@@ -661,7 +661,7 @@ _skipData(ArchiveHandle *AH)
 		blkLen = ReadInt(AH);
 	}
 
-	free(buf);
+	pg_free(buf);
 }
 
 /*
diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
index 5c349279be..4de391f5ac 100644
--- a/src/bin/pg_dump/pg_backup_db.c
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -425,7 +425,7 @@ ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen)
 			memcpy(str, buf, bufLen);
 			str[bufLen] = '\0';
 			ExecuteSqlCommand(AH, str, "could not execute query");
-			free(str);
+			pg_free(str);
 		}
 	}
 
diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c
index d6a1428c67..102c456283 100644
--- a/src/bin/pg_dump/pg_backup_directory.c
+++ b/src/bin/pg_dump/pg_backup_directory.c
@@ -365,7 +365,7 @@ _PrintFileData(ArchiveHandle *AH, char *filename)
 		ahwrite(buf, 1, cnt, AH);
 	}
 
-	free(buf);
+	pg_free(buf);
 	if (!EndCompressFileHandle(CFH))
 		pg_fatal("could not close data file \"%s\": %m", filename);
 }
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c
index a3879410c9..7d2dd007c9 100644
--- a/src/bin/pg_dump/pg_backup_tar.c
+++ b/src/bin/pg_dump/pg_backup_tar.c
@@ -975,12 +975,12 @@ tarPrintf(TAR_MEMBER *th, const char *fmt,...)
 			break;				/* success */
 
 		/* Release buffer and loop around to try again with larger len. */
-		free(p);
+		pg_free(p);
 		len = cnt;
 	}
 
 	cnt = tarWrite(p, cnt, th);
-	free(p);
+	pg_free(p);
 	return (int) cnt;
 }
 
@@ -1076,7 +1076,7 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename)
 			 * We're just scanning the archive for the next file, so return
 			 * null
 			 */
-			free(th);
+			pg_free(th);
 			return NULL;
 		}
 	}
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index d56dcc701c..cb1bc9a1b6 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -2787,7 +2787,7 @@ dumpTableData_insert(Archive *fout, const void *dcontext)
 	destroyPQExpBuffer(q);
 	if (insertStmt != NULL)
 		destroyPQExpBuffer(insertStmt);
-	free(attgenerated);
+	pg_free(attgenerated);
 
 	/* Revert back the setting */
 	if (tbinfo->relkind == RELKIND_FOREIGN_TABLE)
@@ -3766,7 +3766,7 @@ dumpDatabase(Archive *fout)
 
 	PQclear(res);
 
-	free(qdatname);
+	pg_free(qdatname);
 	destroyPQExpBuffer(dbQry);
 	destroyPQExpBuffer(delQry);
 	destroyPQExpBuffer(creaQry);
@@ -4501,11 +4501,11 @@ dumpPolicy(Archive *fout, const PolicyInfo *polinfo)
 					tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
 					polinfo->dobj.catId, 0, polinfo->dobj.dumpId);
 
-	free(tag);
+	pfree(tag);
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(delqry);
 	destroyPQExpBuffer(polprefix);
-	free(qtabname);
+	pg_free(qtabname);
 }
 
 /*
@@ -4793,7 +4793,7 @@ dumpPublication(Archive *fout, const PublicationInfo *pubinfo)
 
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qpubname);
+	pg_free(qpubname);
 }
 
 /*
@@ -5046,7 +5046,7 @@ dumpPublicationNamespace(Archive *fout, const PublicationSchemaInfo *pubsinfo)
 
 	/* These objects can't currently have comments or seclabels */
 
-	free(tag);
+	pfree(tag);
 	destroyPQExpBuffer(query);
 }
 
@@ -5108,7 +5108,7 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo)
 
 	/* These objects can't currently have comments or seclabels */
 
-	free(tag);
+	pfree(tag);
 	destroyPQExpBuffer(query);
 }
 
@@ -5551,7 +5551,7 @@ dumpSubscriptionTable(Archive *fout, const SubRelInfo *subrinfo)
 
 	/* These objects can't currently have comments or seclabels */
 
-	free(tag);
+	pfree(tag);
 	destroyPQExpBuffer(query);
 }
 
@@ -5717,7 +5717,7 @@ dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo)
 
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qsubname);
+	pg_free(qsubname);
 }
 
 /*
@@ -10219,7 +10219,7 @@ determineNotNullFlags(Archive *fout, PGresult *res, int r,
 					tbinfo->notnull_constrs[j] =
 						pstrdup(PQgetvalue(res, r, i_notnull_name));
 				}
-				free(default_name);
+				pfree(default_name);
 			}
 		}
 	}
@@ -12079,7 +12079,7 @@ dumpNamespace(Archive *fout, const NamespaceInfo *nspinfo)
 				qnspname, NULL, NULL,
 				NULL, nspinfo->rolname, &nspinfo->dacl);
 
-	free(qnspname);
+	pg_free(qnspname);
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
@@ -12202,7 +12202,7 @@ dumpExtension(Archive *fout, const ExtensionInfo *extinfo)
 					NULL, "",
 					extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
 
-	free(qextname);
+	pg_free(qextname);
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
@@ -12375,8 +12375,8 @@ dumpEnumType(Archive *fout, const TypeInfo *tyinfo)
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qtypname);
-	free(qualtypname);
+	pg_free(qtypname);
+	pg_free(qualtypname);
 }
 
 /*
@@ -12528,8 +12528,8 @@ dumpRangeType(Archive *fout, const TypeInfo *tyinfo)
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qtypname);
-	free(qualtypname);
+	pg_free(qtypname);
+	pg_free(qualtypname);
 }
 
 /*
@@ -12597,8 +12597,8 @@ dumpUndefinedType(Archive *fout, const TypeInfo *tyinfo)
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
-	free(qtypname);
-	free(qualtypname);
+	pg_free(qtypname);
+	pg_free(qualtypname);
 }
 
 /*
@@ -12846,8 +12846,8 @@ dumpBaseType(Archive *fout, const TypeInfo *tyinfo)
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qtypname);
-	free(qualtypname);
+	pg_free(qtypname);
+	pg_free(qualtypname);
 }
 
 /*
@@ -12961,7 +12961,7 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo)
 				else
 					appendPQExpBuffer(q, " CONSTRAINT %s %s",
 									  fmtId(notnull->dobj.name), notnull->condef);
-				free(default_name);
+				pfree(default_name);
 			}
 		}
 	}
@@ -13070,8 +13070,8 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo)
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qtypname);
-	free(qualtypname);
+	pg_free(qtypname);
+	pg_free(qualtypname);
 }
 
 /*
@@ -13272,8 +13272,8 @@ dumpCompositeType(Archive *fout, const TypeInfo *tyinfo)
 	destroyPQExpBuffer(dropped);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qtypname);
-	free(qualtypname);
+	pg_free(qtypname);
+	pg_free(qualtypname);
 }
 
 /*
@@ -13539,7 +13539,7 @@ dumpProcLang(Archive *fout, const ProcLangInfo *plang)
 				qlanname, NULL, NULL,
 				NULL, plang->lanowner, &plang->dacl);
 
-	free(qlanname);
+	pg_free(qlanname);
 
 	destroyPQExpBuffer(defqry);
 	destroyPQExpBuffer(delqry);
@@ -13850,7 +13850,7 @@ dumpFunc(Archive *fout, const FuncInfo *finfo)
 							  getFormattedTypeName(fout, typeids[i], zeroAsNone));
 		}
 
-		free(typeids);
+		pg_free(typeids);
 	}
 
 	if (prokind[0] == PROKIND_WINDOW)
@@ -14018,7 +14018,7 @@ dumpFunc(Archive *fout, const FuncInfo *finfo)
 	free(funcsig);
 	free(funcfullsig);
 	free(funcsig_tag);
-	free(qual_funcsig);
+	pfree(qual_funcsig);
 	free(configitems);
 }
 
@@ -14604,7 +14604,7 @@ dumpAccessMethod(Archive *fout, const AccessMethodInfo *aminfo)
 						   aminfo->amtype, qamname);
 			destroyPQExpBuffer(q);
 			destroyPQExpBuffer(delq);
-			free(qamname);
+			pg_free(qamname);
 			return;
 	}
 
@@ -14633,7 +14633,7 @@ dumpAccessMethod(Archive *fout, const AccessMethodInfo *aminfo)
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
-	free(qamname);
+	pg_free(qamname);
 }
 
 /*
@@ -14905,9 +14905,9 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo)
 					opcinfo->dobj.namespace->dobj.name, opcinfo->rolname,
 					opcinfo->dobj.catId, 0, opcinfo->dobj.dumpId);
 
-	free(opcintype);
-	free(opcfamily);
-	free(amname);
+	pg_free(opcintype);
+	pg_free(opcfamily);
+	pg_free(amname);
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
@@ -15127,7 +15127,7 @@ dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo)
 					opfinfo->dobj.namespace->dobj.name, opfinfo->rolname,
 					opfinfo->dobj.catId, 0, opfinfo->dobj.dumpId);
 
-	free(amname);
+	pg_free(amname);
 	PQclear(res_ops);
 	PQclear(res_procs);
 	destroyPQExpBuffer(query);
@@ -15390,7 +15390,7 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
-	free(qcollname);
+	pg_free(qcollname);
 }
 
 /*
@@ -15484,7 +15484,7 @@ dumpConversion(Archive *fout, const ConvInfo *convinfo)
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
-	free(qconvname);
+	pg_free(qconvname);
 }
 
 /*
@@ -15942,7 +15942,7 @@ dumpTSParser(Archive *fout, const TSParserInfo *prsinfo)
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
-	free(qprsname);
+	pg_free(qprsname);
 }
 
 /*
@@ -16022,7 +16022,7 @@ dumpTSDictionary(Archive *fout, const TSDictInfo *dictinfo)
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qdictname);
+	pg_free(qdictname);
 }
 
 /*
@@ -16080,7 +16080,7 @@ dumpTSTemplate(Archive *fout, const TSTemplateInfo *tmplinfo)
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
-	free(qtmplname);
+	pg_free(qtmplname);
 }
 
 /*
@@ -16200,7 +16200,7 @@ dumpTSConfig(Archive *fout, const TSConfigInfo *cfginfo)
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qcfgname);
+	pg_free(qcfgname);
 }
 
 /*
@@ -16270,7 +16270,7 @@ dumpForeignDataWrapper(Archive *fout, const FdwInfo *fdwinfo)
 				"FOREIGN DATA WRAPPER", qfdwname, NULL, NULL,
 				NULL, fdwinfo->rolname, &fdwinfo->dacl);
 
-	free(qfdwname);
+	pg_free(qfdwname);
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
@@ -16366,7 +16366,7 @@ dumpForeignServer(Archive *fout, const ForeignServerInfo *srvinfo)
 
 	PQclear(res);
 
-	free(qsrvname);
+	pg_free(qsrvname);
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
@@ -17158,13 +17158,13 @@ dumpTable(Archive *fout, const TableInfo *tbinfo)
 					"TABLE", namecopy, attnamecopy,
 					tbinfo->dobj.namespace->dobj.name,
 					NULL, tbinfo->rolname, &coldacl);
-			free(attnamecopy);
+			pg_free(attnamecopy);
 		}
 		PQclear(res);
 		destroyPQExpBuffer(query);
 	}
 
-	free(namecopy);
+	pg_free(namecopy);
 }
 
 /*
@@ -18154,9 +18154,9 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo)
 								  tbinfo->attfdwoptions[j]);
 		}						/* end loop over columns */
 
-		free(partkeydef);
-		free(ftoptions);
-		free(srvname);
+		pg_free(partkeydef);
+		pg_free(ftoptions);
+		pg_free(srvname);
 	}
 
 	/*
@@ -18300,8 +18300,8 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo)
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(extra);
-	free(qrelname);
-	free(qualrelname);
+	pg_free(qrelname);
+	pg_free(qualrelname);
 }
 
 /*
@@ -18435,10 +18435,10 @@ dumpAttrDef(Archive *fout, const AttrDefInfo *adinfo)
 								  .createStmt = q->data,
 								  .dropStmt = delq->data));
 
-	free(tag);
+	pfree(tag);
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
-	free(qualrelname);
+	pg_free(qualrelname);
 }
 
 /*
@@ -18620,8 +18620,8 @@ dumpIndex(Archive *fout, const IndxInfo *indxinfo)
 
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
-	free(qindxname);
-	free(qqindxname);
+	pg_free(qindxname);
+	pg_free(qqindxname);
 }
 
 /*
@@ -18741,7 +18741,7 @@ dumpStatisticsExt(Archive *fout, const StatsExtInfo *statsextinfo)
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(query);
-	free(qstatsextname);
+	pg_free(qstatsextname);
 }
 
 /*
@@ -19322,7 +19322,7 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo)
 							tyinfo->rolname,
 							coninfo->dobj.catId, 0, coninfo->dobj.dumpId);
 				destroyPQExpBuffer(conprefix);
-				free(qtypname);
+				pg_free(qtypname);
 			}
 		}
 	}
@@ -19337,7 +19337,7 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo)
 		coninfo->dobj.dump & DUMP_COMPONENT_COMMENT)
 		dumpTableConstraintComment(fout, coninfo);
 
-	free(tag);
+	pfree(tag);
 	destroyPQExpBuffer(q);
 	destroyPQExpBuffer(delq);
 }
@@ -19369,7 +19369,7 @@ dumpTableConstraintComment(Archive *fout, const ConstraintInfo *coninfo)
 					coninfo->separate ? coninfo->dobj.dumpId : tbinfo->dobj.dumpId);
 
 	destroyPQExpBuffer(conprefix);
-	free(qtabname);
+	pg_free(qtabname);
 }
 
 static inline SeqType
@@ -19712,7 +19712,7 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo)
 		pg_free(seq);
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(delqry);
-	free(qseqname);
+	pg_free(qseqname);
 }
 
 /*
@@ -19922,12 +19922,12 @@ dumpTrigger(Archive *fout, const TriggerInfo *tginfo)
 					tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
 					tginfo->dobj.catId, 0, tginfo->dobj.dumpId);
 
-	free(tag);
+	pfree(tag);
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(delqry);
 	destroyPQExpBuffer(trigprefix);
 	destroyPQExpBuffer(trigidentity);
-	free(qtabname);
+	pg_free(qtabname);
 }
 
 /*
@@ -20017,7 +20017,7 @@ dumpEventTrigger(Archive *fout, const EventTriggerInfo *evtinfo)
 
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(delqry);
-	free(qevtname);
+	pg_free(qevtname);
 }
 
 /*
@@ -20173,12 +20173,12 @@ dumpRule(Archive *fout, const RuleInfo *rinfo)
 					tbinfo->rolname,
 					rinfo->dobj.catId, 0, rinfo->dobj.dumpId);
 
-	free(tag);
+	pfree(tag);
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(cmd);
 	destroyPQExpBuffer(delcmd);
 	destroyPQExpBuffer(ruleprefix);
-	free(qtabname);
+	pg_free(qtabname);
 }
 
 /*
@@ -20821,7 +20821,7 @@ BuildArchiveDependencies(Archive *fout)
 			te->nDeps = nDeps;
 		}
 		else
-			free(dependencies);
+			pg_free(dependencies);
 	}
 }
 
diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c
index 03e5c1c111..5b3ea0f2a1 100644
--- a/src/bin/pg_dump/pg_dump_sort.c
+++ b/src/bin/pg_dump/pg_dump_sort.c
@@ -578,7 +578,7 @@ sortDumpableObjects(DumpableObject **objs, int numObjs,
 
 	memcpy(objs, ordering, numObjs * sizeof(DumpableObject *));
 
-	free(ordering);
+	pg_free(ordering);
 }
 
 /*
@@ -734,8 +734,8 @@ TopoSort(DumpableObject **objs,
 
 	/* Done */
 	binaryheap_free(pendingHeap);
-	free(beforeConstraints);
-	free(idMap);
+	pg_free(beforeConstraints);
+	pg_free(idMap);
 
 	return (i == 0);
 }
@@ -830,9 +830,9 @@ findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs)
 	if (!fixedloop)
 		pg_fatal("could not identify dependency loop");
 
-	free(workspace);
-	free(searchFailed);
-	free(processed);
+	pg_free(workspace);
+	pg_free(searchFailed);
+	pg_free(processed);
 }
 
 /*
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index c1f43113c5..1ad38fbb82 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -1594,7 +1594,7 @@ dumpRoleGUCPrivs(PGconn *conn)
 									  .section = SECTION_PRE_DATA,
 									  .createStmt = buf->data));
 
-		free(fparname);
+		pg_free(fparname);
 		destroyPQExpBuffer(buf);
 	}
 
@@ -1799,7 +1799,7 @@ dumpTablespaces(PGconn *conn)
 										  .createStmt = seclabel_buf->data));
 		}
 
-		free(fspcname);
+		pg_free(fspcname);
 		destroyPQExpBuffer(buf);
 	}
 
@@ -1865,7 +1865,7 @@ dropDBs(PGconn *conn)
 										  .description = "DROP_GLOBAL",
 										  .section = SECTION_PRE_DATA,
 										  .createStmt = stmt));
-				pg_free(stmt);
+				pfree(stmt);
 			}
 		}
 	}
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
index 5a7afe62ea..d0cca5bf64 100644
--- a/src/bin/pg_upgrade/check.c
+++ b/src/bin/pg_upgrade/check.c
@@ -1034,7 +1034,7 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
 
 		/* Unlink file in case it is left over from a previous run. */
 		unlink(*deletion_script_file_name);
-		pg_free(*deletion_script_file_name);
+		pfree(*deletion_script_file_name);
 		*deletion_script_file_name = NULL;
 		return;
 	}
@@ -1058,7 +1058,7 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
 
 			/* Unlink file in case it is left over from a previous run. */
 			unlink(*deletion_script_file_name);
-			pg_free(*deletion_script_file_name);
+			pfree(*deletion_script_file_name);
 			*deletion_script_file_name = NULL;
 			return;
 		}
@@ -1086,7 +1086,7 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
 		fprintf(script, RMDIR_CMD " %c%s%s%c\n", PATH_QUOTE,
 				fix_path_separator(old_cluster.tablespaces[tblnum]),
 				old_tblspc_suffix, PATH_QUOTE);
-	pfree(old_tblspc_suffix);
+	pg_free(old_tblspc_suffix);
 
 	fclose(script);
 
@@ -1639,7 +1639,7 @@ check_for_incompatible_polymorphics(ClusterInfo *cluster)
 		check_ok();
 
 	termPQExpBuffer(&old_polymorphics);
-	pg_free(query);
+	pfree(query);
 }
 
 /*
diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c
index bc7e8006d8..ebc78a634d 100644
--- a/src/bin/pg_upgrade/function.c
+++ b/src/bin/pg_upgrade/function.c
@@ -154,7 +154,7 @@ get_loadable_libraries(void)
 	}
 
 	pg_free(state.ress);
-	pg_free(query);
+	pfree(query);
 
 	os_info.num_libraries = totaltups;
 }
diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c
index bb4fb97219..1baccbbf4f 100644
--- a/src/bin/pg_verifybackup/pg_verifybackup.c
+++ b/src/bin/pg_verifybackup/pg_verifybackup.c
@@ -509,7 +509,7 @@ parse_manifest_file(char *manifest_path)
 	}
 
 	/* Done with the buffer. */
-	pfree(buffer);
+	pg_free(buffer);
 
 	return result;
 }
@@ -1109,7 +1109,7 @@ verify_backup_checksums(verifier_context *context)
 		}
 	}
 
-	pfree(buffer);
+	pg_free(buffer);
 
 	progress_report(true);
 }
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index c969afab3a..06266650db 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -3162,7 +3162,7 @@ sendCommand(CState *st, Command *command)
 
 		pg_log_debug("client %d sending %s", st->id, sql);
 		r = PQsendQuery(st->con, sql);
-		free(sql);
+		pg_free(sql);
 	}
 	else if (querymode == QUERY_EXTENDED)
 	{
@@ -3355,7 +3355,7 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix)
 						}
 
 						if (*varprefix != '\0')
-							pg_free(varname);
+							pfree(varname);
 					}
 				}
 				/* otherwise the result is simply thrown away by PQclear below */
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 493400f909..10ae979893 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -2601,7 +2601,7 @@ exec_command_password(PsqlScanState scan_state, bool active_branch)
 			PQclear(res);
 		}
 
-		free(user);
+		pg_free(user);
 		free(pw1);
 		free(pw2);
 		termPQExpBuffer(&buf);
@@ -2913,7 +2913,7 @@ exec_command_set(PsqlScanState scan_state, bool active_branch)
 			if (!SetVariable(pset.vars, opt0, newval))
 				success = false;
 
-			free(newval);
+			pg_free(newval);
 		}
 		free(opt0);
 	}
@@ -3881,7 +3881,7 @@ prompt_for_password(const char *username, bool *canceled)
 
 		prompt_text = psprintf(_("Password for user %s: "), username);
 		result = simple_prompt_extended(prompt_text, false, &prompt_ctx);
-		free(prompt_text);
+		pfree(prompt_text);
 	}
 
 	if (canceled)
@@ -4706,7 +4706,7 @@ editFile(const char *fname, int lineno)
 		pg_log_error("could not start editor \"%s\"", editorName);
 	else if (result == 127)
 		pg_log_error("could not start /bin/sh");
-	free(sys);
+	pfree(sys);
 
 	return result == 0;
 }
@@ -5887,7 +5887,7 @@ do_shell(const char *command)
 		sys = psprintf("\"%s\"", shellName);
 #endif
 		result = system(sys);
-		free(sys);
+		pfree(sys);
 	}
 	else
 		result = system(command);
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 476e7fe673..1e937fefba 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -838,12 +838,12 @@ StoreQueryTuple(const PGresult *result)
 
 			if (!SetVariable(pset.vars, varname, value))
 			{
-				free(varname);
+				pfree(varname);
 				success = false;
 				break;
 			}
 
-			free(varname);
+			pfree(varname);
 		}
 	}
 
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index e1449654f9..f1ae3f4e81 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -1926,8 +1926,8 @@ describeOneTableDetails(const char *schemaname,
 
 		printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
 
-		free(footers[0]);
-		free(footers[1]);
+		pg_free(footers[0]);
+		pg_free(footers[1]);
 
 		retval = true;
 		goto error_return;		/* not an error, just return early */
@@ -2000,8 +2000,8 @@ describeOneTableDetails(const char *schemaname,
 
 		printQuery(res, &popt, pset.queryFout, false, pset.logfile);
 
-		free(footers[0]);
-		free(footers[1]);
+		pg_free(footers[0]);
+		pg_free(footers[1]);
 
 		retval = true;
 		goto error_return;		/* not an error, just return early */
@@ -3855,7 +3855,7 @@ describeOneTableDetails(const char *schemaname,
 	termPQExpBuffer(&title);
 	termPQExpBuffer(&tmpbuf);
 
-	free(view_def);
+	pg_free(view_def);
 
 	PQclear(res);
 
@@ -4063,8 +4063,8 @@ describeRoles(const char *pattern, bool verbose, bool showSystem)
 	printTableCleanup(&cont);
 
 	for (i = 0; i < nrows; i++)
-		free(attr[i]);
-	free(attr);
+		pg_free(attr[i]);
+	pg_free(attr);
 
 	PQclear(res);
 	return true;
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 5e0d8f3aae..bfd3fea177 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -725,7 +725,7 @@ helpSQL(const char *topic, unsigned short int pager)
 							_(QL_HELP[i].help),
 							buffer.data,
 							url);
-					free(url);
+					pfree(url);
 					termPQExpBuffer(&buffer);
 
 					/* If we have an exact match, exit.  Fixes \h SELECT */
diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c
index 021f78e0f7..72e81403bf 100644
--- a/src/bin/psql/large_obj.c
+++ b/src/bin/psql/large_obj.c
@@ -210,12 +210,12 @@ do_lo_import(const char *filename_arg, const char *comment_arg)
 
 		if (!(res = PSQLexec(cmdbuf)))
 		{
-			free(cmdbuf);
+			pg_free(cmdbuf);
 			return fail_lo_xact("\\lo_import", own_transaction);
 		}
 
 		PQclear(res);
-		free(cmdbuf);
+		pg_free(cmdbuf);
 	}
 
 	if (!finish_lo_xact("\\lo_import", own_transaction))
diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c
index e9abda0716..1f409a573b 100644
--- a/src/bin/psql/mainloop.c
+++ b/src/bin/psql/mainloop.c
@@ -210,7 +210,7 @@ MainLoop(FILE *source)
 		if (pset.lineno == 1 && !pset.cur_cmd_interactive &&
 			strncmp(line, "PGDMP", 5) == 0)
 		{
-			free(line);
+			pg_free(line);
 			puts(_("The input is a PostgreSQL custom-format dump.\n"
 				   "Use the pg_restore command-line client to restore this dump to a database.\n"));
 			fflush(stdout);
@@ -221,7 +221,7 @@ MainLoop(FILE *source)
 		/* no further processing of empty lines, unless within a literal */
 		if (line[0] == '\0' && !psql_scan_in_quote(scan_state))
 		{
-			free(line);
+			pg_free(line);
 			continue;
 		}
 
@@ -304,7 +304,7 @@ MainLoop(FILE *source)
 							 "       \\? for help with psql commands\n"
 							 "       \\g or terminate with semicolon to execute query\n"
 							 "       \\q to quit\n"));
-					free(line);
+					pg_free(line);
 					fflush(stdout);
 					continue;
 				}
@@ -334,7 +334,7 @@ MainLoop(FILE *source)
 				else
 				{
 					/* exit app */
-					free(line);
+					pg_free(line);
 					fflush(stdout);
 					successResult = EXIT_SUCCESS;
 					break;
@@ -536,7 +536,7 @@ MainLoop(FILE *source)
 						appendPQExpBufferChar(query_buf, '\n');
 					/* rescan query_buf as new input */
 					psql_scan_finish(scan_state);
-					free(line);
+					pg_free(line);
 					line = pg_strdup(query_buf->data);
 					resetPQExpBuffer(query_buf);
 					/* reset parsing state since we are rescanning whole line */
@@ -574,7 +574,7 @@ MainLoop(FILE *source)
 		}
 
 		psql_scan_finish(scan_state);
-		free(line);
+		pg_free(line);
 
 		if (slashCmdStatus == PSQL_CMD_TERMINATE)
 		{
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
index 9725d53dfe..4906f320e7 100644
--- a/src/bin/psql/prompt.c
+++ b/src/bin/psql/prompt.c
@@ -333,7 +333,7 @@ get_prompt(promptStatus_t status, ConditionalStack cstack)
 						/* strip trailing newline and carriage return */
 						(void) pg_strip_crlf(buf);
 
-						free(file);
+						pfree(file);
 						p += cmdend + 1;
 						break;
 					}
@@ -348,7 +348,7 @@ get_prompt(promptStatus_t status, ConditionalStack cstack)
 						val = GetVariable(pset.vars, name);
 						if (val)
 							strlcpy(buf, val, sizeof(buf));
-						free(name);
+						pfree(name);
 						p += nameend + 1;
 						break;
 					}
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 69d044d405..23f23259c5 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -276,8 +276,8 @@ main(int argc, char *argv[])
 
 		new_pass = false;
 		pset.db = PQconnectdbParams(keywords, values, true);
-		free(keywords);
-		free(values);
+		pg_free(keywords);
+		pg_free(values);
 
 		if (PQstatus(pset.db) == CONNECTION_BAD &&
 			PQconnectionNeedsPassword(pset.db) &&
@@ -300,7 +300,7 @@ main(int argc, char *argv[])
 			PQfinish(pset.db);
 
 			password = simple_prompt(password_prompt, false);
-			free(password_prompt);
+			pg_free(password_prompt);
 			new_pass = true;
 		}
 	} while (new_pass);
@@ -620,7 +620,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
 					if (!result)
 						pg_fatal("could not set printing parameter \"%s\"", value);
 
-					free(value);
+					pg_free(value);
 					break;
 				}
 			case 'q':
@@ -664,7 +664,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
 							exit(EXIT_FAILURE); /* error already printed */
 					}
 
-					free(value);
+					pg_free(value);
 					break;
 				}
 			case 'V':
@@ -834,8 +834,8 @@ process_psqlrc_file(char *filename)
 	else if (access(filename, R_OK) == 0)
 		(void) process_file(filename, false);
 
-	free(psqlrc_minor);
-	free(psqlrc_major);
+	pfree(psqlrc_minor);
+	pfree(psqlrc_major);
 }
 
 
diff --git a/src/bin/psql/stringutils.c b/src/bin/psql/stringutils.c
index ad75622711..2140668ea0 100644
--- a/src/bin/psql/stringutils.c
+++ b/src/bin/psql/stringutils.c
@@ -93,7 +93,7 @@ strtokx(const char *s,
 	if (*start == '\0')
 	{
 		/* technically we don't need to free here, but we're nice */
-		free(storage);
+		pg_free(storage);
 		storage = NULL;
 		string = NULL;
 		return NULL;
@@ -334,7 +334,7 @@ quote_if_needed(const char *source, const char *entails_quote,
 
 	if (!need_quotes)
 	{
-		free(ret);
+		pg_free(ret);
 		ret = NULL;
 	}
 
diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c
index db65d130fc..0dfe4e906c 100644
--- a/src/bin/psql/tab-complete.in.c
+++ b/src/bin/psql/tab-complete.in.c
@@ -2140,7 +2140,7 @@ psql_completion(const char *text, int start, int end)
 	/* free storage */
 	free(previous_words);
 	free(words_buffer);
-	free(text_copy);
+	pfree(text_copy);
 	free(completion_ref_object);
 	completion_ref_object = NULL;
 	free(completion_ref_schema);
@@ -6223,7 +6223,7 @@ _complete_from_query(const char *simple_query,
 		/* Clean up */
 		termPQExpBuffer(&query_buffer);
 		free(schemaname);
-		free(objectname);
+		pg_free(objectname);
 		free(e_object_like);
 		free(e_schemaname);
 		free(e_ref_object);
@@ -6523,7 +6523,7 @@ complete_from_variables(const char *text, const char *prefix, const char *suffix
 
 	for (i = 0; i < nvars; i++)
 		free(varnames[i]);
-	free(varnames);
+	pg_free(varnames);
 
 	return matches;
 }
@@ -6779,7 +6779,7 @@ make_like_pattern(const char *word)
 	*bptr = '\0';
 
 	result = escape_string(buffer);
-	free(buffer);
+	pg_free(buffer);
 	return result;
 }
 
@@ -7165,7 +7165,7 @@ get_previous_words(int point, char **buffer, int *nwords)
 
 	/* Release parsing input workspace, if we made one above */
 	if (buf != rl_line_buffer)
-		free(buf);
+		pg_free(buf);
 
 	*nwords = words_found;
 	return previous_words;
@@ -7292,7 +7292,7 @@ dequote_file_name(char *fname, int quote_char)
 		strcpy(workspace + 1, fname);
 		unquoted_fname = strtokx(workspace, "", NULL, "'", *completion_charp,
 								 false, true, pset.encoding);
-		free(workspace);
+		pg_free(workspace);
 	}
 	else
 		unquoted_fname = strtokx(fname, "", NULL, "'", *completion_charp,
diff --git a/src/bin/scripts/vacuuming.c b/src/bin/scripts/vacuuming.c
index faac9089a0..33407ad59f 100644
--- a/src/bin/scripts/vacuuming.c
+++ b/src/bin/scripts/vacuuming.c
@@ -490,7 +490,7 @@ vacuum_all_databases(ConnParams *cparams,
 		{
 			for (int i = 0; i < numdbs; i++)
 				free_retrieved_objects(found_objs[i]);
-			pg_free(found_objs);
+			pfree(found_objs);
 		}
 	}
 	else
diff --git a/src/common/logging.c b/src/common/logging.c
index 4a69d96281..75d6355b93 100644
--- a/src/common/logging.c
+++ b/src/common/logging.c
@@ -360,5 +360,5 @@ pg_log_generic_v(enum pg_log_level level, enum pg_log_part part,
 		fflush(log_logfile);
 	}
 
-	free(buf);
+	pg_free(buf);
 }
diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c
index f2dd52003c..fc27735d46 100644
--- a/src/fe_utils/print.c
+++ b/src/fe_utils/print.c
@@ -1180,21 +1180,21 @@ print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
 	/* clean up */
 	for (i = 0; i < col_count; i++)
 	{
-		free(col_lineptrs[i]);
-		free(format_buf[i]);
+		pg_free(col_lineptrs[i]);
+		pg_free(format_buf[i]);
 	}
-	free(width_header);
-	free(width_average);
-	free(max_width);
-	free(width_wrap);
-	free(max_nl_lines);
-	free(curr_nl_line);
-	free(col_lineptrs);
-	free(max_bytes);
-	free(format_buf);
-	free(header_done);
-	free(bytes_output);
-	free(wrap);
+	pg_free(width_header);
+	pg_free(width_average);
+	pg_free(max_width);
+	pg_free(width_wrap);
+	pg_free(max_nl_lines);
+	pg_free(curr_nl_line);
+	pg_free(col_lineptrs);
+	pg_free(max_bytes);
+	pg_free(format_buf);
+	pg_free(header_done);
+	pg_free(bytes_output);
+	pg_free(wrap);
 
 	if (is_local_pager)
 		ClosePager(fout);
@@ -1808,8 +1808,8 @@ print_aligned_vertical(const printTableContent *cont,
 
 	free(hlineptr->ptr);
 	free(dlineptr->ptr);
-	free(hlineptr);
-	free(dlineptr);
+	pg_free(hlineptr);
+	pg_free(dlineptr);
 
 	if (is_local_pager)
 		ClosePager(fout);
@@ -3618,7 +3618,7 @@ count_table_lines(const printTableContent *cont,
 		}
 	}
 
-	free(header_height);
+	pg_free(header_height);
 
 	return lines;
 }
diff --git a/src/interfaces/ecpg/test/pg_regress_ecpg.c b/src/interfaces/ecpg/test/pg_regress_ecpg.c
index ad66e4d65c..ffac915d19 100644
--- a/src/interfaces/ecpg/test/pg_regress_ecpg.c
+++ b/src/interfaces/ecpg/test/pg_regress_ecpg.c
@@ -217,7 +217,7 @@ ecpg_start_test(const char *testname,
 
 	appnameenv = psprintf("ecpg/%s", testname_dash.data);
 	setenv("PGAPPNAME", appnameenv, 1);
-	free(appnameenv);
+	pfree(appnameenv);
 
 	pid = spawn_process(cmd);
 
diff --git a/src/test/isolation/isolation_main.c b/src/test/isolation/isolation_main.c
index 423b018afb..56a758c76b 100644
--- a/src/test/isolation/isolation_main.c
+++ b/src/test/isolation/isolation_main.c
@@ -89,7 +89,7 @@ isolation_start_test(const char *testname,
 
 	appnameenv = psprintf("isolation/%s", testname);
 	setenv("PGAPPNAME", appnameenv, 1);
-	free(appnameenv);
+	pfree(appnameenv);
 
 	pid = spawn_process(psql_cmd.data);
 
diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index 440c875b8a..e64dc020b1 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -383,7 +383,7 @@ check_testspec(TestSpec *testspec)
 		}
 	}
 
-	free(allsteps);
+	pg_free(allsteps);
 }
 
 /*
@@ -437,9 +437,9 @@ run_all_permutations(TestSpec *testspec)
 
 	run_all_permutations_recurse(testspec, piles, 0, stepptrs);
 
-	free(steps);
-	free(stepptrs);
-	free(piles);
+	pg_free(steps);
+	pg_free(stepptrs);
+	pg_free(piles);
 }
 
 static void
@@ -742,7 +742,7 @@ run_permutation(TestSpec *testspec, int nsteps, PermutationStep **steps)
 		PQclear(res);
 	}
 
-	free(waiting);
+	pg_free(waiting);
 }
 
 /*
diff --git a/src/test/modules/libpq_pipeline/libpq_pipeline.c b/src/test/modules/libpq_pipeline/libpq_pipeline.c
index aa0a6bbe76..18f2fbe8d3 100644
--- a/src/test/modules/libpq_pipeline/libpq_pipeline.c
+++ b/src/test/modules/libpq_pipeline/libpq_pipeline.c
@@ -281,8 +281,8 @@ copy_connection(PGconn *conn)
 		pg_fatal("Connection to database failed: %s",
 				 PQerrorMessage(copyConn));
 
-	pfree(keywords);
-	pfree(vals);
+	pg_free(keywords);
+	pg_free(vals);
 	PQconninfoFree(opts);
 
 	return copyConn;
@@ -1438,8 +1438,8 @@ test_protocol_version(PGconn *conn)
 
 	PQfinish(conn);
 
-	pfree(keywords);
-	pfree(vals);
+	pg_free(keywords);
+	pg_free(vals);
 	PQconninfoFree(opts);
 }
 
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index c26efeba1e..bd2acaac6b 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -811,7 +811,7 @@ initialize_environment(void)
 		new_pgoptions = psprintf("%s %s",
 								 old_pgoptions, my_pgoptions);
 		setenv("PGOPTIONS", new_pgoptions, 1);
-		free(new_pgoptions);
+		pfree(new_pgoptions);
 	}
 
 	if (temp_instance)
@@ -997,7 +997,7 @@ current_windows_user(const char **acct, const char **dom)
 			 GetLastError());
 	}
 
-	free(tokenuser);
+	pg_free(tokenuser);
 
 	*acct = accountname;
 	*dom = domainname;
@@ -1680,7 +1680,7 @@ wait_for_tests(PID_TYPE * pids, int *statuses, instr_time *stoptimes,
 	}
 
 #ifdef WIN32
-	free(active_pids);
+	pg_free(active_pids);
 #endif
 }
 
diff --git a/src/test/regress/pg_regress_main.c b/src/test/regress/pg_regress_main.c
index 701f3dd5d9..169646e351 100644
--- a/src/test/regress/pg_regress_main.c
+++ b/src/test/regress/pg_regress_main.c
@@ -82,7 +82,7 @@ psql_start_test(const char *testname,
 
 	appnameenv = psprintf("pg_regress/%s", testname);
 	setenv("PGAPPNAME", appnameenv, 1);
-	free(appnameenv);
+	pfree(appnameenv);
 
 	pid = spawn_process(psql_cmd.data);
 
-- 
Tristan Partin
https://tristan.partin.io

// Skip pointers that are also assigned from libc allocators (e.g. #ifdef 
FRONTEND)
@ palloc_skip exists @
type T;
T *ptr;
identifier libc_alloc =~ "^(malloc|calloc|realloc|strdup)$";
identifier dealloc =~ "^(free|pg_free)$";
position p;
@@
ptr = libc_alloc(...);
...
dealloc@p(ptr);

// palloc-family allocated memory must be freed with pfree, not free/pg_free.
// Handles: ptr = palloc(...);
@ exists @
type T;
T *ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);

// palloc-family with chained assignment: x = ptr = palloc(...);
@ exists @
type T;
T *ptr;
expression E;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
E = ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);

// palloc-family with typedef'd pointer: T ptr = palloc(...);
@ exists @
type T;
T ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);

// palloc-family with cast: ptr = (C *) palloc(...);
@ exists @
type T, C;
T *ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
ptr = (C *) alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);

// palloc-family with declaration: T *ptr = palloc(...);
@ exists @
type T;
identifier ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
T *ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);

// palloc-family with declaration and cast: T *ptr = (C *) palloc(...);
@ exists @
type T, C;
identifier ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
T *ptr = (C *) alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);

// Skip pointers that are also assigned from libc allocators for pg_malloc rules
@ pgmalloc_skip exists @
type T;
T *ptr;
identifier libc_alloc =~ "^(malloc|calloc|realloc|strdup)$";
identifier dealloc =~ "^(free|pfree)$";
position p;
@@
ptr = libc_alloc(...);
...
dealloc@p(ptr);

// pg_malloc-family allocated memory must be freed with pg_free, not free/pfree.
// Handles: ptr = pg_malloc(...);
@ exists @
type T;
T *ptr;
identifier alloc =~ 
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);

// pg_malloc-family with chained assignment: x = ptr = pg_malloc(...);
@ exists @
type T;
T *ptr;
expression E;
identifier alloc =~ 
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
E = ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);

// pg_malloc-family with typedef'd pointer: T ptr = pg_malloc(...);
@ exists @
type T;
T ptr;
identifier alloc =~ 
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);

// pg_malloc-family with cast: ptr = (C *) pg_malloc(...);
@ exists @
type T, C;
T *ptr;
identifier alloc =~ 
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
ptr = (C *) alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);

// pg_malloc-family with declaration: T *ptr = pg_malloc(...);
@ exists @
type T;
identifier ptr;
identifier alloc =~ 
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
T *ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);

// pg_malloc-family with declaration and cast: T *ptr = (C *) pg_malloc(...);
@ exists @
type T, C;
identifier ptr;
identifier alloc =~ 
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
T *ptr = (C *) alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);

Reply via email to