diff --git a/contrib/bloom/blcost.c b/contrib/bloom/blcost.c
index d42e4e9628..b35e96ea20 100644
--- a/contrib/bloom/blcost.c
+++ b/contrib/bloom/blcost.c
@@ -28,7 +28,7 @@ blcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 	IndexOptInfo *index = path->indexinfo;
 	GenericCosts costs;
 
-	MemSet(&costs, 0, sizeof(costs));
+	MemSet(&costs, 0, sizeof(GenericCosts));
 
 	/* We have to visit all index tuples anyway */
 	costs.numIndexTuples = index->tuples;
diff --git a/contrib/bloom/blinsert.c b/contrib/bloom/blinsert.c
index 82378db441..b80c47cd65 100644
--- a/contrib/bloom/blinsert.c
+++ b/contrib/bloom/blinsert.c
@@ -132,7 +132,7 @@ blbuild(Relation heap, Relation index, IndexInfo *indexInfo)
 	BloomInitMetapage(index);
 
 	/* Initialize the bloom build state */
-	memset(&buildstate, 0, sizeof(buildstate));
+	memset(&buildstate, 0, sizeof(BloomBuildState));
 	initBloomState(&buildstate.blstate, index);
 	buildstate.tmpCtx = AllocSetContextCreate(CurrentMemoryContext,
 											  "Bloom build temporary context",
diff --git a/contrib/intarray/_int_selfuncs.c b/contrib/intarray/_int_selfuncs.c
index 3d8ff6781b..4ec42e9edf 100644
--- a/contrib/intarray/_int_selfuncs.c
+++ b/contrib/intarray/_int_selfuncs.c
@@ -221,7 +221,7 @@ _int_matchsel(PG_FUNCTION_ARGS)
 		}
 	}
 	else
-		memset(&sslot, 0, sizeof(sslot));
+		memset(&sslot, 0, sizeof(AttStatsSlot));
 
 	/* Process the logical expression in the query, using the stats */
 	selec = int_query_opr_selec(GETQUERY(query) + query->size - 1,
diff --git a/contrib/pg_trgm/trgm_regexp.c b/contrib/pg_trgm/trgm_regexp.c
index 58d32ba946..adabb3d8cd 100644
--- a/contrib/pg_trgm/trgm_regexp.c
+++ b/contrib/pg_trgm/trgm_regexp.c
@@ -926,7 +926,7 @@ transformGraph(TrgmNFA *trgmNFA)
 	trgmNFA->nstates = 0;
 
 	/* Create initial state: ambiguous prefix, NFA's initial state */
-	MemSet(&initkey, 0, sizeof(initkey));
+	MemSet(&initkey, 0, sizeof(TrgmStateKey));
 	initkey.prefix.colors[0] = COLOR_UNKNOWN;
 	initkey.prefix.colors[1] = COLOR_UNKNOWN;
 	initkey.nstate = pg_reg_getinitialstate(trgmNFA->regex);
@@ -1028,7 +1028,7 @@ addKey(TrgmNFA *trgmNFA, TrgmState *state, TrgmStateKey *key)
 	 * Ensure any pad bytes in destKey are zero, since it may get used as a
 	 * hashtable key by getState.
 	 */
-	MemSet(&destKey, 0, sizeof(destKey));
+	MemSet(&destKey, 0, sizeof(TrgmStateKey));
 
 	/*
 	 * Compare key to each existing enter key of the state to check for
@@ -1209,7 +1209,7 @@ addArcs(TrgmNFA *trgmNFA, TrgmState *state)
 	 * Ensure any pad bytes in destKey are zero, since it may get used as a
 	 * hashtable key by getState.
 	 */
-	MemSet(&destKey, 0, sizeof(destKey));
+	MemSet(&destKey, 0, sizeof(TrgmStateKey));
 
 	/*
 	 * Iterate over enter keys associated with this expanded-graph state. This
diff --git a/contrib/pgcrypto/crypt-blowfish.c b/contrib/pgcrypto/crypt-blowfish.c
index a663852ccf..63fcef562d 100644
--- a/contrib/pgcrypto/crypt-blowfish.c
+++ b/contrib/pgcrypto/crypt-blowfish.c
@@ -750,7 +750,7 @@ _crypt_blowfish_rn(const char *key, const char *setting,
 /* Overwrite the most obvious sensitive data we have on the stack. Note
  * that this does not guarantee there's no sensitive data left on the
  * stack and/or in registers; I'm not aware of portable code that does. */
-	px_memset(&data, 0, sizeof(data));
+	px_memset(&data, 0, sizeof(struct data));
 
 	return output;
 }
diff --git a/contrib/pgstattuple/pgstatindex.c b/contrib/pgstattuple/pgstatindex.c
index e1048e47ff..87be62f023 100644
--- a/contrib/pgstattuple/pgstatindex.c
+++ b/contrib/pgstattuple/pgstatindex.c
@@ -601,7 +601,7 @@ pgstathashindex(PG_FUNCTION_ARGS)
 				 errmsg("cannot access temporary indexes of other sessions")));
 
 	/* Get the information we need from the metapage. */
-	memset(&stats, 0, sizeof(stats));
+	memset(&stats, 0, sizeof(HashIndexStat));
 	metabuf = _hash_getbuf(rel, HASH_METAPAGE, HASH_READ, LH_META_PAGE);
 	metap = HashPageGetMeta(BufferGetPage(metabuf));
 	stats.version = metap->hashm_version;
diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c
index 061ffaf329..20a8162268 100644
--- a/contrib/postgres_fdw/connection.c
+++ b/contrib/postgres_fdw/connection.c
@@ -311,7 +311,7 @@ make_new_connection(ConnCacheEntry *entry, UserMapping *user)
 	entry->mapping_hashvalue =
 		GetSysCacheHashValue1(USERMAPPINGOID,
 							  ObjectIdGetDatum(user->umid));
-	memset(&entry->state, 0, sizeof(entry->state));
+	memset(&entry->state, 0, sizeof(PgFdwConnState));
 
 	/*
 	 * Determine whether to keep the connection that we're about to make here
@@ -1533,7 +1533,7 @@ pgfdw_abort_cleanup(ConnCacheEntry *entry, bool toplevel)
 	 * fetch_more_data(); in that case reset the per-connection state here.
 	 */
 	if (entry->state.pendingAreq)
-		memset(&entry->state, 0, sizeof(entry->state));
+		memset(&entry->state, 0, sizeof(PgFdwConnState));
 
 	/* Disarm changing_xact_state if it all worked */
 	entry->changing_xact_state = false;
diff --git a/contrib/sepgsql/hooks.c b/contrib/sepgsql/hooks.c
index 97e61b8043..2882ddb377 100644
--- a/contrib/sepgsql/hooks.c
+++ b/contrib/sepgsql/hooks.c
@@ -480,5 +480,5 @@ _PG_init(void)
 	ProcessUtility_hook = sepgsql_utility_command;
 
 	/* init contextual info */
-	memset(&sepgsql_context_info, 0, sizeof(sepgsql_context_info));
+	memset(&sepgsql_context_info, 0, sizeof(sepgsql_context_info_t));
 }
diff --git a/src/backend/access/common/scankey.c b/src/backend/access/common/scankey.c
index ff2b608f2e..e761f17dd2 100644
--- a/src/backend/access/common/scankey.c
+++ b/src/backend/access/common/scankey.c
@@ -51,7 +51,7 @@ ScanKeyEntryInitialize(ScanKey entry,
 	else
 	{
 		Assert(flags & (SK_SEARCHNULL | SK_SEARCHNOTNULL));
-		MemSet(&entry->sk_func, 0, sizeof(entry->sk_func));
+		MemSet(&entry->sk_func, 0, sizeof(FmgrInfo));
 	}
 }
 
diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c
index 7409fdc165..8119baaacb 100644
--- a/src/backend/access/gin/ginfast.c
+++ b/src/backend/access/gin/ginfast.c
@@ -1058,7 +1058,7 @@ gin_clean_pending_list(PG_FUNCTION_ARGS)
 		aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_INDEX,
 					   RelationGetRelationName(indexRel));
 
-	memset(&stats, 0, sizeof(stats));
+	memset(&stats, 0, sizeof(IndexBulkDeleteResult));
 	initGinState(&ginstate, indexRel);
 	ginInsertCleanup(&ginstate, true, true, true, &stats);
 
diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c
index b4fa5f6bf8..451fe28ff1 100644
--- a/src/backend/access/gin/ginvacuum.c
+++ b/src/backend/access/gin/ginvacuum.c
@@ -721,7 +721,7 @@ ginvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
 						 false, true, stats);
 	}
 
-	memset(&idxStat, 0, sizeof(idxStat));
+	memset(&idxStat, 0, sizeof(GinStatsData));
 
 	/*
 	 * XXX we always report the heap tuple count as the number of index
diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c
index 2a53826736..01989d79a2 100644
--- a/src/backend/access/heap/rewriteheap.c
+++ b/src/backend/access/heap/rewriteheap.c
@@ -411,7 +411,7 @@ rewrite_heap_tuple(RewriteState state,
 	{
 		OldToNewMapping mapping;
 
-		memset(&hashkey, 0, sizeof(hashkey));
+		memset(&hashkey, 0, sizeof(TidHashKey));
 		hashkey.xmin = HeapTupleHeaderGetUpdateXid(old_tuple->t_data);
 		hashkey.tid = old_tuple->t_data->t_ctid;
 
@@ -493,7 +493,7 @@ rewrite_heap_tuple(RewriteState state,
 			 */
 			UnresolvedTup unresolved;
 
-			memset(&hashkey, 0, sizeof(hashkey));
+			memset(&hashkey, 0, sizeof(TidHashKey));
 			hashkey.xmin = HeapTupleHeaderGetXmin(new_tuple->t_data);
 			hashkey.tid = old_tid;
 
@@ -581,7 +581,7 @@ rewrite_heap_dead_tuple(RewriteState state, HeapTuple old_tuple)
 	TidHashKey	hashkey;
 	bool		found;
 
-	memset(&hashkey, 0, sizeof(hashkey));
+	memset(&hashkey, 0, sizeof(TidHashKey));
 	hashkey.xmin = HeapTupleHeaderGetXmin(old_tuple->t_data);
 	hashkey.tid = old_tuple->t_self;
 
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c
index e84b5edc03..6194a92542 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -818,7 +818,7 @@ doPickSplit(Relation index, SpGistState *state,
 	oldLeafs[in.nTuples] = newLeafTuple;
 	in.nTuples++;
 
-	memset(&out, 0, sizeof(out));
+	memset(&out, 0, sizeof(spgPickSplitOut));
 
 	if (!isNulls)
 	{
@@ -2185,7 +2185,7 @@ spgdoinsert(Relation index, SpGistState *state,
 			in.nNodes = innerTuple->nNodes;
 			in.nodeLabels = spgExtractNodeLabels(state, innerTuple);
 
-			memset(&out, 0, sizeof(out));
+			memset(&out, 0, sizeof(spgChooseOut));
 
 			if (!isnull)
 			{
diff --git a/src/backend/access/spgist/spgscan.c b/src/backend/access/spgist/spgscan.c
index 87a345d290..888722f9e3 100644
--- a/src/backend/access/spgist/spgscan.c
+++ b/src/backend/access/spgist/spgscan.c
@@ -672,7 +672,7 @@ spgInnerTest(SpGistScanOpaque so, SpGistSearchItem *item,
 	int			nNodes = innerTuple->nNodes;
 	int			i;
 
-	memset(&out, 0, sizeof(out));
+	memset(&out, 0, sizeof(spgInnerConsistentOut));
 
 	if (!isnull)
 	{
diff --git a/src/backend/access/spgist/spgvalidate.c b/src/backend/access/spgist/spgvalidate.c
index 82281f7b83..5167f60454 100644
--- a/src/backend/access/spgist/spgvalidate.c
+++ b/src/backend/access/spgist/spgvalidate.c
@@ -112,7 +112,7 @@ spgvalidate(Oid opclassoid)
 				ok = check_amproc_signature(procform->amproc, VOIDOID, true,
 											2, 2, INTERNALOID, INTERNALOID);
 				configIn.attType = procform->amproclefttype;
-				memset(&configOut, 0, sizeof(configOut));
+				memset(&configOut, 0, sizeof(spgConfigOut));
 
 				OidFunctionCall2(procform->amproc,
 								 PointerGetDatum(&configIn),
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index df0cd77558..3575a17ed2 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -557,7 +557,7 @@ LaunchParallelWorkers(ParallelContext *pcxt)
 	oldcontext = MemoryContextSwitchTo(TopTransactionContext);
 
 	/* Configure a worker. */
-	memset(&worker, 0, sizeof(worker));
+	memset(&worker, 0, sizeof(BackgroundWorker));
 	snprintf(worker.bgw_name, BGW_MAXLEN, "parallel worker for PID %d",
 			 MyProcPid);
 	snprintf(worker.bgw_type, BGW_MAXLEN, "parallel worker");
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 71136b11a2..afb918f13b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6302,7 +6302,7 @@ CreateCheckPoint(int flags)
 	 * checkpoint proceeds, we always accumulate stats, even if
 	 * log_checkpoints is currently off.
 	 */
-	MemSet(&CheckpointStats, 0, sizeof(CheckpointStats));
+	MemSet(&CheckpointStats, 0, sizeof(CheckpointStatsData));
 	CheckpointStats.ckpt_start_t = GetCurrentTimestamp();
 
 	/*
@@ -6327,7 +6327,7 @@ CreateCheckPoint(int flags)
 	}
 
 	/* Begin filling in the checkpoint WAL record */
-	MemSet(&checkPoint, 0, sizeof(checkPoint));
+	MemSet(&checkPoint, 0, sizeof(CheckPoint));
 	checkPoint.time = (pg_time_t) time(NULL);
 
 	/*
@@ -6999,7 +6999,7 @@ CreateRestartPoint(int flags)
 	 * checkpoint proceeds, we always accumulate stats, even if
 	 * log_checkpoints is currently off.
 	 */
-	MemSet(&CheckpointStats, 0, sizeof(CheckpointStats));
+	MemSet(&CheckpointStats, 0, sizeof(CheckpointStatsData));
 	CheckpointStats.ckpt_start_t = GetCurrentTimestamp();
 
 	if (log_checkpoints)
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c
index de10923391..219dc21b28 100644
--- a/src/backend/catalog/dependency.c
+++ b/src/backend/catalog/dependency.c
@@ -572,8 +572,8 @@ findDependentObjects(const ObjectAddress *object,
 							  NULL, nkeys, key);
 
 	/* initialize variables that loop may fill */
-	memset(&owningObject, 0, sizeof(owningObject));
-	memset(&partitionObject, 0, sizeof(partitionObject));
+	memset(&owningObject, 0, sizeof(ObjectAddress));
+	memset(&partitionObject, 0, sizeof(ObjectAddress));
 
 	while (HeapTupleIsValid(tup = systable_getnext(scan)))
 	{
@@ -997,7 +997,7 @@ findDependentObjects(const ObjectAddress *object,
 	else if (stack)
 		extra.dependee = *stack->object;
 	else
-		memset(&extra.dependee, 0, sizeof(extra.dependee));
+		memset(&extra.dependee, 0, sizeof(ObjectAddress));
 	add_exact_object_address_extra(object, &extra, targetObjects);
 }
 
@@ -1640,7 +1640,7 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
 	context.addrs = new_object_addresses();
 
 	/* We gin up a rather bogus rangetable list to handle Vars */
-	MemSet(&rte, 0, sizeof(rte));
+	MemSet(&rte, 0, sizeof(RangeTblEntry));
 	rte.type = T_RangeTblEntry;
 	rte.rtekind = RTE_RELATION;
 	rte.relid = relId;
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 2da6b75a15..e9eeab9727 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -2394,7 +2394,7 @@ compute_scalar_stats(VacAttrStatsP stats,
 	tupnoLink = (int *) palloc(samplerows * sizeof(int));
 	track = (ScalarMCVItem *) palloc(num_mcv * sizeof(ScalarMCVItem));
 
-	memset(&ssup, 0, sizeof(ssup));
+	memset(&ssup, 0, sizeof(SortSupportData));
 	ssup.ssup_cxt = CurrentMemoryContext;
 	ssup.ssup_collation = stats->attrcollid;
 	ssup.ssup_nulls_first = false;
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 2de0ebacec..5b837a0ee3 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -11508,7 +11508,7 @@ validateForeignKeyConstraint(char *conname,
 	/*
 	 * Build a trigger call structure; we'll need it either way.
 	 */
-	MemSet(&trig, 0, sizeof(trig));
+	MemSet(&trig, 0, sizeof(Trigger));
 	trig.tgoid = InvalidOid;
 	trig.tgname = conname;
 	trig.tgenabled = TRIGGER_FIRES_ON_ORIGIN;
@@ -19231,7 +19231,7 @@ ATDetachCheckNoForeignKeyRefs(Relation partition)
 		/* prevent data changes into the referencing table until commit */
 		rel = table_open(constrForm->conrelid, ShareLock);
 
-		MemSet(&trig, 0, sizeof(trig));
+		MemSet(&trig, 0, sizeof(Trigger));
 		trig.tgoid = InvalidOid;
 		trig.tgname = NameStr(constrForm->conname);
 		trig.tgenabled = TRIGGER_FIRES_ON_ORIGIN;
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 9b92b04242..a2d9904568 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -4119,7 +4119,7 @@ AlterType(AlterTypeStmt *stmt)
 	typForm = (Form_pg_type) GETSTRUCT(tup);
 
 	/* Process options */
-	memset(&atparams, 0, sizeof(atparams));
+	memset(&atparams, 0, sizeof(AlterTypeRecurseParams));
 	foreach(pl, stmt->options)
 	{
 		DefElem    *defel = (DefElem *) lfirst(pl);
@@ -4441,7 +4441,7 @@ AlterTypeRecurse(Oid typeOid, bool isImplicitArray,
 			if (!HeapTupleIsValid(arrtup))
 				elog(ERROR, "cache lookup failed for type %u", arrtypoid);
 
-			memset(&arrparams, 0, sizeof(arrparams));
+			memset(&arrparams, 0, sizeof(AlterTypeRecurseParams));
 			arrparams.updateTypmodin = atparams->updateTypmodin;
 			arrparams.updateTypmodout = atparams->updateTypmodout;
 			arrparams.typmodinOid = atparams->typmodinOid;
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index 2831e7978b..a9d6cc4e07 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -3163,7 +3163,7 @@ ExecInitSubscriptingRef(ExprEvalStep *scratch, SubscriptingRef *sbsref,
 	 * execution steps below; and it can optionally set up some data pointed
 	 * to by the workspace field.
 	 */
-	memset(&methods, 0, sizeof(methods));
+	memset(&methods, 0, sizeof(SubscriptExecSteps));
 	sbsroutines->exec_setup(sbsref, sbsrefstate, &methods);
 
 	/*
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 29bc26669b..701ef3e132 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -611,7 +611,7 @@ SPI_execute(const char *src, bool read_only, long tcount)
 
 	_SPI_prepare_oneshot_plan(src, &plan);
 
-	memset(&options, 0, sizeof(options));
+	memset(&options, 0, sizeof(SPIExecuteOptions));
 	options.read_only = read_only;
 	options.tcount = tcount;
 
@@ -683,7 +683,7 @@ SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls,
 	if (res < 0)
 		return res;
 
-	memset(&options, 0, sizeof(options));
+	memset(&options, 0, sizeof(SPIExecuteOptions));
 	options.params = _SPI_convert_params(plan->nargs, plan->argtypes,
 										 Values, Nulls);
 	options.read_only = read_only;
@@ -741,7 +741,7 @@ SPI_execute_plan_with_paramlist(SPIPlanPtr plan, ParamListInfo params,
 	if (res < 0)
 		return res;
 
-	memset(&options, 0, sizeof(options));
+	memset(&options, 0, sizeof(SPIExecuteOptions));
 	options.params = params;
 	options.read_only = read_only;
 	options.tcount = tcount;
@@ -786,7 +786,7 @@ SPI_execute_snapshot(SPIPlanPtr plan,
 	if (res < 0)
 		return res;
 
-	memset(&options, 0, sizeof(options));
+	memset(&options, 0, sizeof(SPIExecuteOptions));
 	options.params = _SPI_convert_params(plan->nargs, plan->argtypes,
 										 Values, Nulls);
 	options.read_only = read_only;
@@ -841,7 +841,7 @@ SPI_execute_with_args(const char *src,
 
 	_SPI_prepare_oneshot_plan(src, &plan);
 
-	memset(&options, 0, sizeof(options));
+	memset(&options, 0, sizeof(SPIExecuteOptions));
 	options.params = paramLI;
 	options.read_only = read_only;
 	options.tcount = tcount;
diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index efc53f3135..450ea73b22 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -3041,7 +3041,7 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por
 	if (identifier == NULL)
 		identifier = "postgresql";
 
-	MemSet(&hint, 0, sizeof(hint));
+	MemSet(&hint, 0, sizeof(struct addrinfo));
 	hint.ai_socktype = SOCK_DGRAM;
 	hint.ai_family = AF_UNSPEC;
 	port = atoi(portstr);
@@ -3133,8 +3133,8 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por
 		return STATUS_ERROR;
 	}
 
-	memset(&localaddr, 0, sizeof(localaddr));
 #ifdef HAVE_IPV6
+	memset(&localaddr, 0, sizeof(struct sockaddr_in6));
 	localaddr.sin6_family = serveraddrs[0].ai_family;
 	localaddr.sin6_addr = in6addr_any;
 	if (localaddr.sin6_family == AF_INET6)
@@ -3142,6 +3142,7 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por
 	else
 		addrsize = sizeof(struct sockaddr_in);
 #else
+	memset(&localaddr, 0, sizeof(struct sockaddr_in));
 	localaddr.sin_family = serveraddrs[0].ai_family;
 	localaddr.sin_addr.s_addr = INADDR_ANY;
 	addrsize = sizeof(struct sockaddr_in);
diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c
index 327a4b42af..eb67505180 100644
--- a/src/backend/libpq/hba.c
+++ b/src/backend/libpq/hba.c
@@ -1964,7 +1964,7 @@ parse_hba_auth_opt(char *name, char *val, HbaLine *hbaline,
 		/* For each entry in the list, translate it */
 		foreach(l, parsed_servers)
 		{
-			MemSet(&hints, 0, sizeof(hints));
+			MemSet(&hints, 0, sizeof(struct addrinfo));
 			hints.ai_socktype = SOCK_DGRAM;
 			hints.ai_family = AF_UNSPEC;
 
diff --git a/src/backend/libpq/ifaddr.c b/src/backend/libpq/ifaddr.c
index a41808aff0..346620ef33 100644
--- a/src/backend/libpq/ifaddr.c
+++ b/src/backend/libpq/ifaddr.c
@@ -137,7 +137,7 @@ pg_sockaddr_cidr_mask(struct sockaddr_storage *mask, char *numbits, int family)
 
 				if (bits < 0 || bits > 32)
 					return -1;
-				memset(&mask4, 0, sizeof(mask4));
+				memset(&mask4, 0, sizeof(struct sockaddr_in));
 				/* avoid "x << 32", which is not portable */
 				if (bits > 0)
 					maskl = (0xffffffffUL << (32 - (int) bits))
@@ -157,7 +157,7 @@ pg_sockaddr_cidr_mask(struct sockaddr_storage *mask, char *numbits, int family)
 
 				if (bits < 0 || bits > 128)
 					return -1;
-				memset(&mask6, 0, sizeof(mask6));
+				memset(&mask6, 0, sizeof(struct sockaddr_in6));
 				for (i = 0; i < 16; i++)
 				{
 					if (bits <= 0)
@@ -387,7 +387,7 @@ pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data)
 			return -1;
 		}
 
-		memset(&lifc, 0, sizeof(lifc));
+		memset(&lifc, 0, sizeof(struct lifconf));
 		lifc.lifc_family = AF_UNSPEC;
 		lifc.lifc_buf = buffer = ptr;
 		lifc.lifc_len = n_buffer;
@@ -508,7 +508,7 @@ pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data)
 			return -1;
 		}
 
-		memset(&ifc, 0, sizeof(ifc));
+		memset(&ifc, 0, sizeof(struct ifconf));
 		ifc.ifc_buf = buffer = ptr;
 		ifc.ifc_len = n_buffer;
 
@@ -566,10 +566,10 @@ pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data)
 #endif
 
 	/* addr 127.0.0.1/8 */
-	memset(&addr, 0, sizeof(addr));
+	memset(&addr, 0, sizeof(struct sockaddr_in));
 	addr.sin_family = AF_INET;
 	addr.sin_addr.s_addr = pg_ntoh32(0x7f000001);
-	memset(&mask, 0, sizeof(mask));
+	memset(&mask, 0, sizeof(struct sockaddr_storage));
 	pg_sockaddr_cidr_mask(&mask, "8", AF_INET);
 	run_ifaddr_callback(callback, cb_data,
 						(struct sockaddr *) &addr,
@@ -577,10 +577,10 @@ pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data)
 
 #ifdef HAVE_IPV6
 	/* addr ::1/128 */
-	memset(&addr6, 0, sizeof(addr6));
+	memset(&addr6, 0, sizeof(struct sockaddr_in6));
 	addr6.sin6_family = AF_INET6;
 	addr6.sin6_addr.s6_addr[15] = 1;
-	memset(&mask, 0, sizeof(mask));
+	memset(&mask, 0, sizeof(struct sockaddr_storage));
 	pg_sockaddr_cidr_mask(&mask, "128", AF_INET6);
 	run_ifaddr_callback(callback, cb_data,
 						(struct sockaddr *) &addr6,
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 75392a8bb7..ed041b79eb 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -343,7 +343,7 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber,
 #endif
 
 	/* Initialize hint structure */
-	MemSet(&hint, 0, sizeof(hint));
+	MemSet(&hint, 0, sizeof(struct addrinfo));
 	hint.ai_family = family;
 	hint.ai_flags = AI_PASSIVE;
 	hint.ai_socktype = SOCK_STREAM;
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index 7ac116a791..77f1d0665f 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -2467,7 +2467,7 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel,
 	 * will be set true if we find that output column i of the subquery is
 	 * unsafe to use in a pushed-down qual.
 	 */
-	memset(&safetyInfo, 0, sizeof(safetyInfo));
+	memset(&safetyInfo, 0, sizeof(pushdown_safety_info));
 	safetyInfo.unsafeColumns = (bool *)
 		palloc0((list_length(subquery->targetList) + 1) * sizeof(bool));
 
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 0ef70ad7f1..f78d38e019 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -269,7 +269,7 @@ create_index_paths(PlannerInfo *root, RelOptInfo *rel)
 		/*
 		 * Identify the restriction clauses that can match the index.
 		 */
-		MemSet(&rclauseset, 0, sizeof(rclauseset));
+		MemSet(&rclauseset, 0, sizeof(IndexClauseSet));
 		match_restriction_clauses_to_index(root, index, &rclauseset);
 
 		/*
@@ -286,7 +286,7 @@ create_index_paths(PlannerInfo *root, RelOptInfo *rel)
 		 * step finds only "loose" join clauses that have not been merged into
 		 * EquivalenceClasses.  Also, collect join OR clauses for later.
 		 */
-		MemSet(&jclauseset, 0, sizeof(jclauseset));
+		MemSet(&jclauseset, 0, sizeof(IndexClauseSet));
 		match_join_clauses_to_index(root, rel, index,
 									&jclauseset, &joinorclauses);
 
@@ -294,7 +294,7 @@ create_index_paths(PlannerInfo *root, RelOptInfo *rel)
 		 * Look for EquivalenceClasses that can generate joinclauses matching
 		 * the index.
 		 */
-		MemSet(&eclauseset, 0, sizeof(eclauseset));
+		MemSet(&eclauseset, 0, sizeof(IndexClauseSet));
 		match_eclass_clauses_to_index(root, index,
 									  &eclauseset);
 
@@ -616,7 +616,7 @@ get_join_index_paths(PlannerInfo *root, RelOptInfo *rel,
 		return;
 
 	/* Identify indexclauses usable with this relids set */
-	MemSet(&clauseset, 0, sizeof(clauseset));
+	MemSet(&clauseset, 0, sizeof(IndexClauseSet));
 
 	for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++)
 	{
@@ -1211,7 +1211,7 @@ build_paths_for_OR(PlannerInfo *root, RelOptInfo *rel,
 		/*
 		 * Identify the restriction clauses that can match the index.
 		 */
-		MemSet(&clauseset, 0, sizeof(clauseset));
+		MemSet(&clauseset, 0, sizeof(IndexClauseSet));
 		match_clauses_to_index(root, clauses, index, &clauseset);
 
 		/*
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index a0f2390334..598bf3960a 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -5915,12 +5915,12 @@ expression_planner_with_deps(Expr *expr,
 	PlannerInfo root;
 
 	/* Make up dummy planner state so we can use setrefs machinery */
-	MemSet(&glob, 0, sizeof(glob));
+	MemSet(&glob, 0, sizeof(PlannerGlobal));
 	glob.type = T_PlannerGlobal;
 	glob.relationOids = NIL;
 	glob.invalItems = NIL;
 
-	MemSet(&root, 0, sizeof(root));
+	MemSet(&root, 0, sizeof(PlannerInfo));
 	root.type = T_PlannerInfo;
 	root.glob = &glob;
 
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index d95fd89807..eabeacb0e5 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -3274,14 +3274,14 @@ extract_query_dependencies(Node *query,
 	PlannerInfo root;
 
 	/* Make up dummy planner state so we can use this module's machinery */
-	MemSet(&glob, 0, sizeof(glob));
+	MemSet(&glob, 0, sizeof(PlannerGlobal));
 	glob.type = T_PlannerGlobal;
 	glob.relationOids = NIL;
 	glob.invalItems = NIL;
 	/* Hack: we use glob.dependsOnRole to collect hasRowSecurity flags */
 	glob.dependsOnRole = false;
 
-	MemSet(&root, 0, sizeof(root));
+	MemSet(&root, 0, sizeof(PlannerInfo));
 	root.type = T_PlannerInfo;
 	root.glob = &glob;
 
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index 2a1d44b813..375714154a 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -1596,7 +1596,7 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup)
 					 */
 					ParseState	mypstate;
 
-					MemSet(&mypstate, 0, sizeof(mypstate));
+					MemSet(&mypstate, 0, sizeof(ParseState));
 					mypstate.parentParseState = pstate;
 					mypstate.p_rtable = rte->subquery->rtable;
 					/* don't bother filling the rest of the fake pstate */
@@ -1652,7 +1652,7 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup)
 					ParseState	mypstate;
 					Index		levelsup;
 
-					MemSet(&mypstate, 0, sizeof(mypstate));
+					MemSet(&mypstate, 0, sizeof(ParseState));
 					/* this loop must work, since GetCTEForRTE did */
 					for (levelsup = 0;
 						 levelsup < rte->ctelevelsup + netlevelsup;
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 3b73e26956..76ba287da4 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -4525,7 +4525,7 @@ postmaster_forkexec(int argc, char *argv[])
 	Port		port;
 
 	/* This entry point passes dummy values for the Port variables */
-	memset(&port, 0, sizeof(port));
+	memset(&port, 0, sizeof(Port));
 	return internal_forkexec(argc, argv, &port);
 }
 
diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c
index bd5f78cf9a..14014461a1 100644
--- a/src/backend/replication/logical/launcher.c
+++ b/src/backend/replication/logical/launcher.c
@@ -391,7 +391,7 @@ retry:
 	LWLockRelease(LogicalRepWorkerLock);
 
 	/* Register the new dynamic worker. */
-	memset(&bgw, 0, sizeof(bgw));
+	memset(&bgw, 0, sizeof(BackgroundWorker));
 	bgw.bgw_flags = BGWORKER_SHMEM_ACCESS |
 		BGWORKER_BACKEND_DATABASE_CONNECTION;
 	bgw.bgw_start_time = BgWorkerStart_RecoveryFinished;
@@ -710,7 +710,7 @@ ApplyLauncherRegister(void)
 	if (max_logical_replication_workers == 0)
 		return;
 
-	memset(&bgw, 0, sizeof(bgw));
+	memset(&bgw, 0, sizeof(BackgroundWorker));
 	bgw.bgw_flags = BGWORKER_SHMEM_ACCESS |
 		BGWORKER_BACKEND_DATABASE_CONNECTION;
 	bgw.bgw_start_time = BgWorkerStart_RecoveryFinished;
diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c
index 21937ab2d3..524b880f78 100644
--- a/src/backend/replication/logical/origin.c
+++ b/src/backend/replication/logical/origin.c
@@ -615,7 +615,7 @@ CheckPointReplicationOrigin(void)
 			continue;
 
 		/* zero, to avoid uninitialized padding bytes */
-		memset(&disk_state, 0, sizeof(disk_state));
+		memset(&disk_state, 0, sizeof(ReplicationStateOnDisk));
 
 		LWLockAcquire(&curstate->lock, LW_SHARED);
 
diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 8da5f9089c..628087c417 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -314,7 +314,7 @@ ReorderBufferAllocate(void)
 	buffer =
 		(ReorderBuffer *) MemoryContextAlloc(new_ctx, sizeof(ReorderBuffer));
 
-	memset(&hash_ctl, 0, sizeof(hash_ctl));
+	memset(&hash_ctl, 0, sizeof(HASHCTL));
 
 	buffer->context = new_ctx;
 
@@ -4740,7 +4740,7 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn,
 		else
 			SET_VARSIZE(reconstructed, data_done + VARHDRSZ);
 
-		memset(&redirect_pointer, 0, sizeof(redirect_pointer));
+		memset(&redirect_pointer, 0, sizeof(struct varatt_indirect));
 		redirect_pointer.pointer = reconstructed;
 
 		SET_VARTAG_EXTERNAL(new_datum, VARTAG_INDIRECT);
@@ -5115,7 +5115,7 @@ ResolveCminCmaxDuringDecoding(HTAB *tuplecid_data,
 		return false;
 
 	/* be careful about padding */
-	memset(&key, 0, sizeof(key));
+	memset(&key, 0, sizeof(ReorderBufferTupleCidKey));
 
 	Assert(!BufferIsLocal(buffer));
 
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c
index 671b00a33c..42a6f5ee91 100644
--- a/src/backend/storage/ipc/standby.c
+++ b/src/backend/storage/ipc/standby.c
@@ -1402,7 +1402,7 @@ LogStandbyInvalidations(int nmsgs, SharedInvalidationMessage *msgs,
 	xl_invalidations xlrec;
 
 	/* prepare record */
-	memset(&xlrec, 0, sizeof(xlrec));
+	memset(&xlrec, 0, sizeof(xl_invalidations));
 	xlrec.dbId = MyDatabaseId;
 	xlrec.tsId = MyDatabaseTableSpace;
 	xlrec.relcacheInitFileInval = relcacheInitFileInval;
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 5f5803f681..62f670f5d0 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -603,7 +603,7 @@ LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode)
 	/*
 	 * See if there is a LOCALLOCK entry for this lock and lockmode
 	 */
-	MemSet(&localtag, 0, sizeof(localtag)); /* must clear padding */
+	MemSet(&localtag, 0, sizeof(LOCALLOCKTAG)); /* must clear padding */
 	localtag.lock = *locktag;
 	localtag.mode = lockmode;
 
@@ -658,7 +658,7 @@ LockHasWaiters(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
 	/*
 	 * Find the LOCALLOCK entry for this lock and lockmode
 	 */
-	MemSet(&localtag, 0, sizeof(localtag)); /* must clear padding */
+	MemSet(&localtag, 0, sizeof(LOCALLOCKTAG)); /* must clear padding */
 	localtag.lock = *locktag;
 	localtag.mode = lockmode;
 
@@ -820,7 +820,7 @@ LockAcquireExtended(const LOCKTAG *locktag,
 	/*
 	 * Find or create a LOCALLOCK entry for this lock and lockmode
 	 */
-	MemSet(&localtag, 0, sizeof(localtag)); /* must clear padding */
+	MemSet(&localtag, 0, sizeof(LOCALLOCKTAG)); /* must clear padding */
 	localtag.lock = *locktag;
 	localtag.mode = lockmode;
 
@@ -1999,7 +1999,7 @@ LockRelease(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
 	/*
 	 * Find the LOCALLOCK entry for this lock and lockmode
 	 */
-	MemSet(&localtag, 0, sizeof(localtag)); /* must clear padding */
+	MemSet(&localtag, 0, sizeof(LOCALLOCKTAG)); /* must clear padding */
 	localtag.lock = *locktag;
 	localtag.mode = lockmode;
 
diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c
index 8aef909037..6b56fc345d 100644
--- a/src/backend/storage/lmgr/lwlock.c
+++ b/src/backend/storage/lmgr/lwlock.c
@@ -397,7 +397,7 @@ get_lwlock_stats_entry(LWLock *lock)
 		return &lwlock_stats_dummy;
 
 	/* Fetch or create the entry. */
-	MemSet(&key, 0, sizeof(key));
+	MemSet(&key, 0, sizeof(lwlock_stats_key));
 	key.tranche = lock->tranche;
 	key.instance = lock;
 	lwstats = hash_search(lwlock_stats_htab, &key, HASH_ENTER, &found);
diff --git a/src/backend/utils/activity/backend_status.c b/src/backend/utils/activity/backend_status.c
index c7ed1e6d7a..f49ee51384 100644
--- a/src/backend/utils/activity/backend_status.c
+++ b/src/backend/utils/activity/backend_status.c
@@ -320,10 +320,10 @@ pgstat_bestart(void)
 
 	/* These structs can just start from zeroes each time, though */
 #ifdef USE_SSL
-	memset(&lsslstatus, 0, sizeof(lsslstatus));
+	memset(&lsslstatus, 0, sizeof(PgBackendSSLStatus));
 #endif
 #ifdef ENABLE_GSS
-	memset(&lgssstatus, 0, sizeof(lgssstatus));
+	memset(&lgssstatus, 0, sizeof(PgBackendGSSStatus));
 #endif
 
 	/*
@@ -353,9 +353,9 @@ pgstat_bestart(void)
 	 */
 	if (MyProcPort)
 		memcpy(&lbeentry.st_clientaddr, &MyProcPort->raddr,
-			   sizeof(lbeentry.st_clientaddr));
+			   sizeof(SockAddr));
 	else
-		MemSet(&lbeentry.st_clientaddr, 0, sizeof(lbeentry.st_clientaddr));
+		MemSet(&lbeentry.st_clientaddr, 0, sizeof(SockAddr));
 
 #ifdef USE_SSL
 	if (MyProcPort && MyProcPort->ssl_in_use)
diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c
index b77c05ab5f..59794eb378 100644
--- a/src/backend/utils/activity/pgstat_replslot.c
+++ b/src/backend/utils/activity/pgstat_replslot.c
@@ -123,7 +123,7 @@ pgstat_create_replslot(ReplicationSlot *slot)
 	 * NB: need to accept that there might be stats from an older slot, e.g.
 	 * if we previously crashed after dropping a slot.
 	 */
-	memset(&shstatent->stats, 0, sizeof(shstatent->stats));
+	memset(&shstatent->stats, 0, sizeof(PgStat_StatReplSlotEntry));
 	namestrcpy(&shstatent->stats.slotname, NameStr(slot->data.name));
 
 	pgstat_unlock_entry(entry_ref);
diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c
index 5a878bd115..993aedf460 100644
--- a/src/backend/utils/activity/pgstat_wal.c
+++ b/src/backend/utils/activity/pgstat_wal.c
@@ -154,7 +154,7 @@ pgstat_wal_reset_all_cb(TimestampTz ts)
 	PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal;
 
 	LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE);
-	memset(&stats_shmem->stats, 0, sizeof(stats_shmem->stats));
+	memset(&stats_shmem->stats, 0, sizeof(PgStat_WalStats));
 	stats_shmem->stats.stat_reset_timestamp = ts;
 	LWLockRelease(&stats_shmem->lock);
 }
diff --git a/src/backend/utils/adt/array_selfuncs.c b/src/backend/utils/adt/array_selfuncs.c
index 8cbee1406b..b916d41c20 100644
--- a/src/backend/utils/adt/array_selfuncs.c
+++ b/src/backend/utils/adt/array_selfuncs.c
@@ -151,7 +151,7 @@ scalararraysel_containment(PlannerInfo *root,
 				!get_attstatsslot(&hslot, vardata.statsTuple,
 								  STATISTIC_KIND_DECHIST, InvalidOid,
 								  ATTSTATSSLOT_NUMBERS))
-				memset(&hslot, 0, sizeof(hslot));
+				memset(&hslot, 0, sizeof(AttStatsSlot));
 
 			/*
 			 * For = ANY, estimate as var @> ARRAY[const].
@@ -377,7 +377,7 @@ calc_arraycontsel(VariableStatData *vardata, Datum constval,
 				!get_attstatsslot(&hslot, vardata->statsTuple,
 								  STATISTIC_KIND_DECHIST, InvalidOid,
 								  ATTSTATSSLOT_NUMBERS))
-				memset(&hslot, 0, sizeof(hslot));
+				memset(&hslot, 0, sizeof(AttStatsSlot));
 
 			/* Use the most-common-elements slot for the array Var. */
 			selec = mcelem_array_selec(array, typentry,
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 553cc25eb9..529c2352b6 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -966,7 +966,7 @@ json_unique_check_init(JsonUniqueCheckState *cxt)
 {
 	HASHCTL		ctl;
 
-	memset(&ctl, 0, sizeof(ctl));
+	memset(&ctl, 0, sizeof(HASHCTL));
 	ctl.keysize = sizeof(JsonUniqueHashEntry);
 	ctl.entrysize = sizeof(JsonUniqueHashEntry);
 	ctl.hcxt = CurrentMemoryContext;
@@ -1058,7 +1058,7 @@ json_object_agg_transfn_worker(FunctionCallInfo fcinfo,
 		if (unique_keys)
 			json_unique_builder_init(&state->unique_check);
 		else
-			memset(&state->unique_check, 0, sizeof(state->unique_check));
+			memset(&state->unique_check, 0, sizeof(JsonUniqueBuilderState));
 		MemoryContextSwitchTo(oldcontext);
 
 		arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c
index 39355e242d..a09c632c86 100644
--- a/src/backend/utils/adt/jsonb.c
+++ b/src/backend/utils/adt/jsonb.c
@@ -246,8 +246,8 @@ jsonb_from_cstring(char *json, int len, bool unique_keys)
 	JsonbInState state;
 	JsonSemAction sem;
 
-	memset(&state, 0, sizeof(state));
-	memset(&sem, 0, sizeof(sem));
+	memset(&state, 0, sizeof(JsonbInState));
+	memset(&sem, 0, sizeof(JsonSemAction));
 	lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
 
 	state.unique_keys = unique_keys;
@@ -839,7 +839,7 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
 
 					lex = makeJsonLexContext(json, true);
 
-					memset(&sem, 0, sizeof(sem));
+					memset(&sem, 0, sizeof(JsonSemAction));
 
 					sem.semstate = (void *) result;
 
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index d427bdfbe0..87c6431b33 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -2625,7 +2625,7 @@ populate_array_json(PopulateArrayContext *ctx, char *json, int len)
 	state.lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
 	state.ctx = ctx;
 
-	memset(&sem, 0, sizeof(sem));
+	memset(&sem, 0, sizeof(JsonSemAction));
 	sem.semstate = (void *) &state;
 	sem.object_start = populate_array_object_start;
 	sem.array_end = populate_array_array_end;
diff --git a/src/backend/utils/adt/mcxtfuncs.c b/src/backend/utils/adt/mcxtfuncs.c
index bb7cc94024..b7f832ccb5 100644
--- a/src/backend/utils/adt/mcxtfuncs.c
+++ b/src/backend/utils/adt/mcxtfuncs.c
@@ -62,7 +62,7 @@ PutMemoryContextsStatsTupleStore(Tuplestorestate *tupstore,
 	}
 
 	/* Examine the context itself */
-	memset(&stat, 0, sizeof(stat));
+	memset(&stat, 0, sizeof(MemoryContextCounters));
 	(*context->methods->stats) (context, NULL, (void *) &level, &stat, true);
 
 	memset(values, 0, sizeof(values));
diff --git a/src/backend/utils/adt/multirangetypes_selfuncs.c b/src/backend/utils/adt/multirangetypes_selfuncs.c
index 919c8889d4..9a74c542ba 100644
--- a/src/backend/utils/adt/multirangetypes_selfuncs.c
+++ b/src/backend/utils/adt/multirangetypes_selfuncs.c
@@ -535,7 +535,7 @@ calc_hist_selectivity(TypeCacheEntry *typcache, VariableStatData *vardata,
 		}
 	}
 	else
-		memset(&lslot, 0, sizeof(lslot));
+		memset(&lslot, 0, sizeof(AttStatsSlot));
 
 	/* Extract the bounds of the constant value. */
 	Assert(constval->rangeCount > 0);
diff --git a/src/backend/utils/adt/network_selfuncs.c b/src/backend/utils/adt/network_selfuncs.c
index 49196376a8..a34e74d97e 100644
--- a/src/backend/utils/adt/network_selfuncs.c
+++ b/src/backend/utils/adt/network_selfuncs.c
@@ -299,8 +299,8 @@ networkjoinsel_inner(Oid operator,
 	}
 	else
 	{
-		memset(&mcv1_slot, 0, sizeof(mcv1_slot));
-		memset(&hist1_slot, 0, sizeof(hist1_slot));
+		memset(&mcv1_slot, 0, sizeof(AttStatsSlot));
+		memset(&hist1_slot, 0, sizeof(AttStatsSlot));
 	}
 
 	if (HeapTupleIsValid(vardata2->statsTuple))
@@ -321,8 +321,8 @@ networkjoinsel_inner(Oid operator,
 	}
 	else
 	{
-		memset(&mcv2_slot, 0, sizeof(mcv2_slot));
-		memset(&hist2_slot, 0, sizeof(hist2_slot));
+		memset(&mcv2_slot, 0, sizeof(AttStatsSlot));
+		memset(&hist2_slot, 0, sizeof(AttStatsSlot));
 	}
 
 	opr_codenum = inet_opr_codenum(operator);
@@ -429,8 +429,8 @@ networkjoinsel_semi(Oid operator,
 	}
 	else
 	{
-		memset(&mcv1_slot, 0, sizeof(mcv1_slot));
-		memset(&hist1_slot, 0, sizeof(hist1_slot));
+		memset(&mcv1_slot, 0, sizeof(AttStatsSlot));
+		memset(&hist1_slot, 0, sizeof(AttStatsSlot));
 	}
 
 	if (HeapTupleIsValid(vardata2->statsTuple))
@@ -451,8 +451,8 @@ networkjoinsel_semi(Oid operator,
 	}
 	else
 	{
-		memset(&mcv2_slot, 0, sizeof(mcv2_slot));
-		memset(&hist2_slot, 0, sizeof(hist2_slot));
+		memset(&mcv2_slot, 0, sizeof(AttStatsSlot));
+		memset(&hist2_slot, 0, sizeof(AttStatsSlot));
 	}
 
 	opr_codenum = inet_opr_codenum(operator);
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index a0490a7522..5262b47902 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -497,7 +497,7 @@ PGLC_localeconv(void)
 	 * allocated with strdup, to avoid premature elog(ERROR) and to allow
 	 * using a single cleanup routine.
 	 */
-	memset(&worklconv, 0, sizeof(worklconv));
+	memset(&worklconv, 0, sizeof(struct lconv));
 
 	/* Save prevailing values of monetary and numeric locales */
 	save_lc_monetary = setlocale(LC_MONETARY, NULL);
@@ -1548,7 +1548,7 @@ pg_newlocale_from_collation(Oid collid)
 		collform = (Form_pg_collation) GETSTRUCT(tp);
 
 		/* We'll fill in the result struct locally before allocating memory */
-		memset(&result, 0, sizeof(result));
+		memset(&result, 0, sizeof(struct pg_locale_struct));
 		result.provider = collform->collprovider;
 		result.deterministic = collform->collisdeterministic;
 
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 893690dad5..1828c2e0fe 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -731,7 +731,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
 				nulls[11] = true;
 
 			/* A zeroed client addr means we don't know */
-			memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
+			memset(&zero_clientaddr, 0, sizeof(SockAddr));
 			if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
 					   sizeof(zero_clientaddr)) == 0)
 			{
@@ -1103,7 +1103,7 @@ pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
 		PG_RETURN_NULL();
 
 	/* A zeroed client addr means we don't know */
-	memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
+	memset(&zero_clientaddr, 0, sizeof(SockAddr));
 	if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
 			   sizeof(zero_clientaddr)) == 0)
 		PG_RETURN_NULL();
@@ -1150,7 +1150,7 @@ pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
 		PG_RETURN_NULL();
 
 	/* A zeroed client addr means we don't know */
-	memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
+	memset(&zero_clientaddr, 0, sizeof(SockAddr));
 	if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
 			   sizeof(zero_clientaddr)) == 0)
 		PG_RETURN_NULL();
diff --git a/src/backend/utils/adt/rangetypes_selfuncs.c b/src/backend/utils/adt/rangetypes_selfuncs.c
index c2795f4593..9222381181 100644
--- a/src/backend/utils/adt/rangetypes_selfuncs.c
+++ b/src/backend/utils/adt/rangetypes_selfuncs.c
@@ -446,7 +446,7 @@ calc_hist_selectivity(TypeCacheEntry *typcache, VariableStatData *vardata,
 		}
 	}
 	else
-		memset(&lslot, 0, sizeof(lslot));
+		memset(&lslot, 0, sizeof(AttStatsSlot));
 
 	/* Extract the bounds of the constant value. */
 	range_deserialize(typcache, constval, &const_lower, &const_upper, &empty);
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 49c4201dde..50fb6542ec 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -1057,7 +1057,7 @@ pg_get_triggerdef_worker(Oid trigid, bool pretty)
 		newrte->inFromCl = true;
 
 		/* Build two-element rtable */
-		memset(&dpns, 0, sizeof(dpns));
+		memset(&dpns, 0, sizeof(deparse_namespace));
 		dpns.rtable = list_make2(oldrte, newrte);
 		dpns.subplans = NIL;
 		dpns.ctes = NIL;
@@ -3804,7 +3804,7 @@ select_rtable_names_for_explain(List *rtable, Bitmapset *rels_used)
 {
 	deparse_namespace dpns;
 
-	memset(&dpns, 0, sizeof(dpns));
+	memset(&dpns, 0, sizeof(deparse_namespace));
 	dpns.rtable = rtable;
 	dpns.subplans = NIL;
 	dpns.ctes = NIL;
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index fa1f589fad..0dec93f440 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -2271,8 +2271,8 @@ eqjoinsel(PG_FUNCTION_ARGS)
 
 	opfuncoid = get_opcode(operator);
 
-	memset(&sslot1, 0, sizeof(sslot1));
-	memset(&sslot2, 0, sizeof(sslot2));
+	memset(&sslot1, 0, sizeof(AttStatsSlot));
+	memset(&sslot2, 0, sizeof(AttStatsSlot));
 
 	if (HeapTupleIsValid(vardata1.statsTuple))
 	{
@@ -6797,7 +6797,7 @@ btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 	/*
 	 * Now do generic index cost estimation.
 	 */
-	MemSet(&costs, 0, sizeof(costs));
+	MemSet(&costs, 0, sizeof(GenericCosts));
 	costs.numIndexTuples = numIndexTuples;
 
 	genericcostestimate(root, path, loop_count, &costs);
@@ -6842,7 +6842,7 @@ btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 	 * ordering, but don't negate it entirely.  Before 8.0 we divided the
 	 * correlation by the number of columns, but that seems too strong.)
 	 */
-	MemSet(&vardata, 0, sizeof(vardata));
+	MemSet(&vardata, 0, sizeof(VariableStatData));
 
 	if (index->indexkeys[0] != 0)
 	{
@@ -6949,7 +6949,7 @@ hashcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 {
 	GenericCosts costs;
 
-	MemSet(&costs, 0, sizeof(costs));
+	MemSet(&costs, 0, sizeof(GenericCosts));
 
 	genericcostestimate(root, path, loop_count, &costs);
 
@@ -6995,7 +6995,7 @@ gistcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 	GenericCosts costs;
 	Cost		descentCost;
 
-	MemSet(&costs, 0, sizeof(costs));
+	MemSet(&costs, 0, sizeof(GenericCosts));
 
 	genericcostestimate(root, path, loop_count, &costs);
 
@@ -7052,7 +7052,7 @@ spgcostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 	GenericCosts costs;
 	Cost		descentCost;
 
-	MemSet(&costs, 0, sizeof(costs));
+	MemSet(&costs, 0, sizeof(GenericCosts));
 
 	genericcostestimate(root, path, loop_count, &costs);
 
@@ -7339,7 +7339,7 @@ gincost_scalararrayopexpr(PlannerInfo *root,
 					  elmlen, elmbyval, elmalign,
 					  &elemValues, &elemNulls, &numElems);
 
-	memset(&arraycounts, 0, sizeof(arraycounts));
+	memset(&arraycounts, 0, sizeof(GinQualCounts));
 
 	for (i = 0; i < numElems; i++)
 	{
@@ -7350,7 +7350,7 @@ gincost_scalararrayopexpr(PlannerInfo *root,
 			continue;
 
 		/* Otherwise, apply extractQuery and get the actual term counts */
-		memset(&elemcounts, 0, sizeof(elemcounts));
+		memset(&elemcounts, 0, sizeof(GinQualCounts));
 
 		if (gincost_pattern(index, indexcol, clause_op, elemValues[i],
 							&elemcounts))
@@ -7443,7 +7443,7 @@ gincostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 	}
 	else
 	{
-		memset(&ginStats, 0, sizeof(ginStats));
+		memset(&ginStats, 0, sizeof(GinStatsData));
 	}
 
 	/*
@@ -7532,7 +7532,7 @@ gincostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 	/*
 	 * Examine quals to estimate number of search entries & partial matches
 	 */
-	memset(&counts, 0, sizeof(counts));
+	memset(&counts, 0, sizeof(GinQualCounts));
 	counts.arrayScans = 1;
 	matchPossible = true;
 
diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c
index addc349151..9394a02ba2 100644
--- a/src/backend/utils/adt/tsvector_op.c
+++ b/src/backend/utils/adt/tsvector_op.c
@@ -1671,8 +1671,8 @@ TS_phrase_execute(QueryItem *curitem, void *arg, uint32 flags,
 
 		case OP_PHRASE:
 		case OP_AND:
-			memset(&Ldata, 0, sizeof(Ldata));
-			memset(&Rdata, 0, sizeof(Rdata));
+			memset(&Ldata, 0, sizeof(ExecPhraseData));
+			memset(&Rdata, 0, sizeof(ExecPhraseData));
 
 			lmatch = TS_phrase_execute(curitem + curitem->qoperator.left,
 									   arg, flags, chkcond, &Ldata);
@@ -1753,8 +1753,8 @@ TS_phrase_execute(QueryItem *curitem, void *arg, uint32 flags,
 			}
 
 		case OP_OR:
-			memset(&Ldata, 0, sizeof(Ldata));
-			memset(&Rdata, 0, sizeof(Rdata));
+			memset(&Ldata, 0, sizeof(ExecPhraseData));
+			memset(&Rdata, 0, sizeof(ExecPhraseData));
 
 			lmatch = TS_phrase_execute(curitem + curitem->qoperator.left,
 									   arg, flags, chkcond, &Ldata);
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index 919138eaf3..40d4bbb48a 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -4775,7 +4775,7 @@ text_to_array(PG_FUNCTION_ARGS)
 	SplitTextOutputData tstate;
 
 	/* For array output, tstate should start as all zeroes */
-	memset(&tstate, 0, sizeof(tstate));
+	memset(&tstate, 0, sizeof(SplitTextOutputData));
 
 	if (!split_text(fcinfo, &tstate))
 		PG_RETURN_NULL();
diff --git a/src/backend/utils/cache/attoptcache.c b/src/backend/utils/cache/attoptcache.c
index 9e252a0891..ce4c66962f 100644
--- a/src/backend/utils/cache/attoptcache.c
+++ b/src/backend/utils/cache/attoptcache.c
@@ -110,7 +110,7 @@ get_attribute_options(Oid attrelid, int attnum)
 	/* Find existing cache entry, if any. */
 	if (!AttoptCacheHash)
 		InitializeAttoptCache();
-	memset(&key, 0, sizeof(key));	/* make sure any padding bits are unset */
+	memset(&key, 0, sizeof(AttoptCacheKey));	/* make sure any padding bits are unset */
 	key.attrelid = attrelid;
 	key.attnum = attnum;
 	attopt =
diff --git a/src/backend/utils/cache/relfilenodemap.c b/src/backend/utils/cache/relfilenodemap.c
index 70c323c720..266d9aef5e 100644
--- a/src/backend/utils/cache/relfilenodemap.c
+++ b/src/backend/utils/cache/relfilenodemap.c
@@ -153,7 +153,7 @@ RelidByRelfilenode(Oid reltablespace, Oid relfilenode)
 	if (reltablespace == MyDatabaseTableSpace)
 		reltablespace = 0;
 
-	MemSet(&key, 0, sizeof(key));
+	MemSet(&key, 0, sizeof(RelfilenodeMapKey));
 	key.reltablespace = reltablespace;
 	key.relfilenode = relfilenode;
 
diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c
index 9197b0f1e2..6c49d4f948 100644
--- a/src/backend/utils/fmgr/funcapi.c
+++ b/src/backend/utils/fmgr/funcapi.c
@@ -776,8 +776,8 @@ resolve_polymorphic_tupdesc(TupleDesc tupdesc, oidvector *declared_args,
 	if (!call_expr)
 		return false;			/* no hope */
 
-	memset(&poly_actuals, 0, sizeof(poly_actuals));
-	memset(&anyc_actuals, 0, sizeof(anyc_actuals));
+	memset(&poly_actuals, 0, sizeof(polymorphic_actuals));
+	memset(&anyc_actuals, 0, sizeof(polymorphic_actuals));
 
 	for (i = 0; i < nargs; i++)
 	{
@@ -1041,8 +1041,8 @@ resolve_polymorphic_argtypes(int numargs, Oid *argtypes, char *argmodes,
 	 * resolve_polymorphic_tupdesc, we rely on the parser to have enforced
 	 * type consistency and coerced ANYCOMPATIBLE args to a common supertype.
 	 */
-	memset(&poly_actuals, 0, sizeof(poly_actuals));
-	memset(&anyc_actuals, 0, sizeof(anyc_actuals));
+	memset(&poly_actuals, 0, sizeof(polymorphic_actuals));
+	memset(&anyc_actuals, 0, sizeof(polymorphic_actuals));
 	inargno = 0;
 	for (i = 0; i < numargs; i++)
 	{
diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c
index e12be1b9bd..76ec50e5dc 100644
--- a/src/backend/utils/mmgr/mcxt.c
+++ b/src/backend/utils/mmgr/mcxt.c
@@ -522,7 +522,7 @@ MemoryContextStatsDetail(MemoryContext context, int max_children,
 {
 	MemoryContextCounters grand_totals;
 
-	memset(&grand_totals, 0, sizeof(grand_totals));
+	memset(&grand_totals, 0, sizeof(MemoryContextCounters));
 
 	MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals, print_to_stderr);
 
@@ -582,7 +582,7 @@ MemoryContextStatsInternal(MemoryContext context, int level,
 	 * Examine children.  If there are more than max_children of them, we do
 	 * not print the rest explicitly, but just summarize them.
 	 */
-	memset(&local_totals, 0, sizeof(local_totals));
+	memset(&local_totals, 0, sizeof(MemoryContextCounters));
 
 	for (child = context->firstchild, ichild = 0;
 		 child != NULL;
diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
index 5bc2a15160..84aecf64ec 100644
--- a/src/backend/utils/time/snapmgr.c
+++ b/src/backend/utils/time/snapmgr.c
@@ -1462,7 +1462,7 @@ ImportSnapshot(const char *idstr)
 	/*
 	 * Construct a snapshot struct by parsing the file content.
 	 */
-	memset(&snapshot, 0, sizeof(snapshot));
+	memset(&snapshot, 0, sizeof(SnapshotData));
 
 	parseVxidFromText("vxid:", &filebuf, path, &src_vxid);
 	src_pid = parseIntFromText("pid:", &filebuf, path);
diff --git a/src/bin/initdb/findtimezone.c b/src/bin/initdb/findtimezone.c
index ddb65e6489..7ff01ffef6 100644
--- a/src/bin/initdb/findtimezone.c
+++ b/src/bin/initdb/findtimezone.c
@@ -191,7 +191,7 @@ build_time_t(int year, int month, int day)
 {
 	struct tm	tm;
 
-	memset(&tm, 0, sizeof(tm));
+	memset(&tm, 0, sizeof(struct tm));
 	tm.tm_mday = day;
 	tm.tm_mon = month - 1;
 	tm.tm_year = year - 1900;
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index ed6de7ca94..547efef1df 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1959,7 +1959,7 @@ locale_date_order(const char *locale)
 
 	setlocale(LC_TIME, locale);
 
-	memset(&testtime, 0, sizeof(testtime));
+	memset(&testtime, 0, sizeof(struct tm));
 	testtime.tm_mday = 22;
 	testtime.tm_mon = 10;		/* November, should come out as "11" */
 	testtime.tm_year = 133;		/* 2033 */
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index 4adb170d46..56aed21433 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -457,7 +457,7 @@ reached_end_position(XLogRecPtr segendpos, uint32 timeline,
 		FD_ZERO(&fds);
 		FD_SET(bgpipe[0], &fds);
 
-		MemSet(&tv, 0, sizeof(tv));
+		MemSet(&tv, 0, sizeof(struct timeval));
 
 		r = select(bgpipe[0] + 1, &fds, NULL, NULL, &tv);
 		if (r == 1)
@@ -532,7 +532,7 @@ LogStreamerMain(logstreamer_param *param)
 
 	in_log_streamer = true;
 
-	MemSet(&stream, 0, sizeof(stream));
+	MemSet(&stream, 0, sizeof(StreamCtl));
 	stream.startpos = param->startptr;
 	stream.timeline = param->timeline;
 	stream.sysidentifier = param->sysidentifier;
@@ -1293,7 +1293,7 @@ ReceiveArchiveStream(PGconn *conn, pg_compress_specification *compress)
 	ArchiveStreamState state;
 
 	/* Set up initial state. */
-	memset(&state, 0, sizeof(state));
+	memset(&state, 0, sizeof(ArchiveStreamState));
 	state.tablespacenum = -1;
 	state.compress = compress;
 
@@ -1612,7 +1612,7 @@ ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation,
 	bool		expect_unterminated_tarfile;
 
 	/* Pass all COPY data through to the backup streamer. */
-	memset(&state, 0, sizeof(state));
+	memset(&state, 0, sizeof(WriteTarState));
 	is_recovery_guc_supported =
 		PQserverVersion(conn) >= MINIMUM_VERSION_FOR_RECOVERY_GUC;
 	expect_unterminated_tarfile =
diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c
index ea3902c971..7c19e2ee24 100644
--- a/src/bin/pg_basebackup/pg_receivewal.c
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -439,7 +439,7 @@ FindStreamingStart(uint32 *tli)
 			LZ4F_decompressOptions_t dec_opt;
 			LZ4F_errorCode_t status;
 
-			memset(&dec_opt, 0, sizeof(dec_opt));
+			memset(&dec_opt, 0, sizeof(LZ4F_decompressOptions_t));
 			snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
 
 			fd = open(fullpath, O_RDONLY | PG_BINARY, 0);
@@ -567,7 +567,7 @@ StreamLog(void)
 	StreamCtl	stream;
 	char	   *sysidentifier;
 
-	MemSet(&stream, 0, sizeof(stream));
+	MemSet(&stream, 0, sizeof(StreamCtl));
 
 	/*
 	 * Connect in replication mode to the server
diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c
index cc292718da..6c119a6757 100644
--- a/src/bin/pg_basebackup/walmethods.c
+++ b/src/bin/pg_basebackup/walmethods.c
@@ -179,7 +179,7 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_
 		lz4buf = pg_malloc0(lz4bufsize);
 
 		/* assign the compression level, default is 0 */
-		memset(&prefs, 0, sizeof(prefs));
+		memset(&prefs, 0, sizeof(LZ4F_preferences_t));
 		prefs.compressionLevel = dir_data->compression_level;
 
 		/* add the header */
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index dd78e5bc66..6e31fabb8d 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -1632,7 +1632,7 @@ pgwin32_ServiceMain(DWORD argc, LPTSTR *argv)
 	status.dwServiceSpecificExitCode = 0;
 	status.dwCurrentState = SERVICE_START_PENDING;
 
-	memset(&pi, 0, sizeof(pi));
+	memset(&pi, 0, sizeof(PROCESS_INFORMATION));
 
 	read_post_opts();
 
diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c
index bd18b4491d..9bb61ba6a2 100644
--- a/src/bin/pg_verifybackup/pg_verifybackup.c
+++ b/src/bin/pg_verifybackup/pg_verifybackup.c
@@ -182,7 +182,7 @@ main(int argc, char **argv)
 	set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_verifybackup"));
 	progname = get_progname(argv[0]);
 
-	memset(&context, 0, sizeof(context));
+	memset(&context, 0, sizeof(verifier_context));
 
 	if (argc > 1)
 	{
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index b51d28780b..00a44e3589 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -5172,7 +5172,7 @@ do_watch(PQExpBuffer query_buf, double sleep)
 
 #ifdef HAVE_POSIX_DECL_SIGWAIT
 	/* Disable the interval timer. */
-	memset(&interval, 0, sizeof(interval));
+	memset(&interval, 0, sizeof(struct itimerval));
 	setitimer(ITIMER_REAL, &interval, NULL);
 	/* Unblock SIGINT, SIGCHLD and SIGALRM. */
 	sigprocmask(SIG_UNBLOCK, &sigalrm_sigchld_sigint, NULL);
diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c
index 92f1ffe147..b444256482 100644
--- a/src/bin/scripts/vacuumdb.c
+++ b/src/bin/scripts/vacuumdb.c
@@ -127,7 +127,7 @@ main(int argc, char *argv[])
 	int			tbl_count = 0;
 
 	/* initialize options */
-	memset(&vacopts, 0, sizeof(vacopts));
+	memset(&vacopts, 0, sizeof(vacuumingOptions));
 	vacopts.parallel_workers = -1;
 	vacopts.no_index_cleanup = false;
 	vacopts.force_index_cleanup = false;
diff --git a/src/common/ip.c b/src/common/ip.c
index cd73d49679..771d752a8a 100644
--- a/src/common/ip.c
+++ b/src/common/ip.c
@@ -171,7 +171,7 @@ getaddrinfo_unix(const char *path, const struct addrinfo *hintsp,
 
 	*result = NULL;
 
-	MemSet(&hints, 0, sizeof(hints));
+	MemSet(&hints, 0, sizeof(struct addrinfo));
 
 	if (strlen(path) >= sizeof(unp->sun_path))
 		return EAI_FAIL;
@@ -182,7 +182,7 @@ getaddrinfo_unix(const char *path, const struct addrinfo *hintsp,
 		hints.ai_socktype = SOCK_STREAM;
 	}
 	else
-		memcpy(&hints, hintsp, sizeof(hints));
+		memcpy(&hints, hintsp, sizeof(struct addrinfo));
 
 	if (hints.ai_socktype == 0)
 		hints.ai_socktype = SOCK_STREAM;
diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c
index 0a072a36dc..9c96c94d4a 100644
--- a/src/interfaces/libpq/fe-auth.c
+++ b/src/interfaces/libpq/fe-auth.c
@@ -737,12 +737,12 @@ pg_local_sendauth(PGconn *conn)
 	iov.iov_base = &buf;
 	iov.iov_len = 1;
 
-	memset(&msg, 0, sizeof(msg));
+	memset(&msg, 0, sizeof(struct msghdr));
 	msg.msg_iov = &iov;
 	msg.msg_iovlen = 1;
 
 	/* We must set up a message that will be filled in by kernel */
-	memset(&cmsgbuf, 0, sizeof(cmsgbuf));
+	memset(&cmsgbuf, 0, sizeof(struct cmsghdr));
 	msg.msg_control = &cmsgbuf.buf;
 	msg.msg_controllen = sizeof(cmsgbuf.buf);
 	cmsg = CMSG_FIRSTHDR(&msg);
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 6e936bbff3..bb70a90d5e 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -2378,7 +2378,7 @@ keep_going:						/* We will come back to here until there is
 		ch = &conn->connhost[conn->whichhost];
 
 		/* Initialize hint structure */
-		MemSet(&hint, 0, sizeof(hint));
+		MemSet(&hint, 0, sizeof(struct addrinfo));
 		hint.ai_socktype = SOCK_STREAM;
 		conn->addrlist_family = hint.ai_family = AF_UNSPEC;
 
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index edb93ec1c4..c7c7930951 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -1844,7 +1844,7 @@ plperl_call_handler(PG_FUNCTION_ARGS)
 	plperl_call_data this_call_data;
 
 	/* Initialize current-call status record */
-	MemSet(&this_call_data, 0, sizeof(this_call_data));
+	MemSet(&this_call_data, 0, sizeof(plperl_call_data));
 	this_call_data.fcinfo = fcinfo;
 
 	PG_TRY();
@@ -1890,7 +1890,7 @@ plperl_inline_handler(PG_FUNCTION_ARGS)
 	ErrorContextCallback pl_error_context;
 
 	/* Initialize current-call status record */
-	MemSet(&this_call_data, 0, sizeof(this_call_data));
+	MemSet(&this_call_data, 0, sizeof(plperl_call_data));
 
 	/* Set up a callback for error reporting */
 	pl_error_context.callback = plperl_inline_callback;
@@ -1904,8 +1904,8 @@ plperl_inline_handler(PG_FUNCTION_ARGS)
 	 * with no arguments passed, and a result type of VOID.
 	 */
 	MemSet(fake_fcinfo, 0, SizeForFunctionCallInfo(0));
-	MemSet(&flinfo, 0, sizeof(flinfo));
-	MemSet(&desc, 0, sizeof(desc));
+	MemSet(&flinfo, 0, sizeof(FmgrInfo));
+	MemSet(&desc, 0, sizeof(plperl_proc_desc));
 	fake_fcinfo->flinfo = &flinfo;
 	flinfo.fn_oid = InvalidOid;
 	flinfo.fn_mcxt = CurrentMemoryContext;
diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c
index 190d286f1c..2b58c3202c 100644
--- a/src/pl/plpgsql/src/pl_handler.c
+++ b/src/pl/plpgsql/src/pl_handler.c
@@ -341,7 +341,7 @@ plpgsql_inline_handler(PG_FUNCTION_ARGS)
 	 * with no arguments passed.
 	 */
 	MemSet(fake_fcinfo, 0, SizeForFunctionCallInfo(0));
-	MemSet(&flinfo, 0, sizeof(flinfo));
+	MemSet(&flinfo, 0, sizeof(FmgrInfo));
 	fake_fcinfo->flinfo = &flinfo;
 	flinfo.fn_oid = InvalidOid;
 	flinfo.fn_mcxt = CurrentMemoryContext;
@@ -518,19 +518,19 @@ plpgsql_validator(PG_FUNCTION_ARGS)
 		 * plpgsql_compile().
 		 */
 		MemSet(fake_fcinfo, 0, SizeForFunctionCallInfo(0));
-		MemSet(&flinfo, 0, sizeof(flinfo));
+		MemSet(&flinfo, 0, sizeof(FmgrInfo));
 		fake_fcinfo->flinfo = &flinfo;
 		flinfo.fn_oid = funcoid;
 		flinfo.fn_mcxt = CurrentMemoryContext;
 		if (is_dml_trigger)
 		{
-			MemSet(&trigdata, 0, sizeof(trigdata));
+			MemSet(&trigdata, 0, sizeof(TriggerData));
 			trigdata.type = T_TriggerData;
 			fake_fcinfo->context = (Node *) &trigdata;
 		}
 		else if (is_event_trigger)
 		{
-			MemSet(&etrigdata, 0, sizeof(etrigdata));
+			MemSet(&etrigdata, 0, sizeof(EventTriggerData));
 			etrigdata.type = T_EventTriggerData;
 			fake_fcinfo->context = (Node *) &etrigdata;
 		}
diff --git a/src/pl/plpython/plpy_main.c b/src/pl/plpython/plpy_main.c
index 0bce106495..0d84d66684 100644
--- a/src/pl/plpython/plpy_main.c
+++ b/src/pl/plpython/plpy_main.c
@@ -278,7 +278,7 @@ plpython3_inline_handler(PG_FUNCTION_ARGS)
 		elog(ERROR, "SPI_connect failed");
 
 	MemSet(fcinfo, 0, SizeForFunctionCallInfo(0));
-	MemSet(&flinfo, 0, sizeof(flinfo));
+	MemSet(&flinfo, 0, sizeof(FmgrInfo));
 	fake_fcinfo->flinfo = &flinfo;
 	flinfo.fn_oid = InvalidOid;
 	flinfo.fn_mcxt = CurrentMemoryContext;
diff --git a/src/port/getaddrinfo.c b/src/port/getaddrinfo.c
index 3284c6eb52..818fc6151d 100644
--- a/src/port/getaddrinfo.c
+++ b/src/port/getaddrinfo.c
@@ -146,12 +146,12 @@ getaddrinfo(const char *node, const char *service,
 
 	if (hintp == NULL)
 	{
-		memset(&hints, 0, sizeof(hints));
+		memset(&hints, 0, sizeof(struct addrinfo));
 		hints.ai_family = AF_INET;
 		hints.ai_socktype = SOCK_STREAM;
 	}
 	else
-		memcpy(&hints, hintp, sizeof(hints));
+		memcpy(&hints, hintp, sizeof(struct addrinfo));
 
 	if (hints.ai_family != AF_INET && hints.ai_family != AF_UNSPEC)
 		return EAI_FAMILY;
@@ -162,7 +162,7 @@ getaddrinfo(const char *node, const char *service,
 	if (!node && !service)
 		return EAI_NONAME;
 
-	memset(&sin, 0, sizeof(sin));
+	memset(&sin, 0, sizeof(struct sockaddr_in));
 
 	sin.sin_family = AF_INET;
 
diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index 12179f2514..c409694539 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -1121,7 +1121,7 @@ printResultSet(PGresult *res)
 {
 	PQprintOpt	popt;
 
-	memset(&popt, 0, sizeof(popt));
+	memset(&popt, 0, sizeof(PQprintOpt));
 	popt.header = true;
 	popt.align = true;
 	popt.fieldSep = "|";
diff --git a/src/test/modules/test_shm_mq/setup.c b/src/test/modules/test_shm_mq/setup.c
index 6f1f4cf9c6..6a0e40db8e 100644
--- a/src/test/modules/test_shm_mq/setup.c
+++ b/src/test/modules/test_shm_mq/setup.c
@@ -212,7 +212,7 @@ setup_background_workers(int nworkers, dsm_segment *seg)
 				  PointerGetDatum(wstate));
 
 	/* Configure a worker. */
-	memset(&worker, 0, sizeof(worker));
+	memset(&worker, 0, sizeof(BackgroundWorker));
 	worker.bgw_flags = BGWORKER_SHMEM_ACCESS;
 	worker.bgw_start_time = BgWorkerStart_ConsistentState;
 	worker.bgw_restart_time = BGW_NEVER_RESTART;
diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c
index 5b541ec47f..13c6afa694 100644
--- a/src/test/modules/worker_spi/worker_spi.c
+++ b/src/test/modules/worker_spi/worker_spi.c
@@ -325,7 +325,7 @@ _PG_init(void)
 	MarkGUCPrefixReserved("worker_spi");
 
 	/* set up common data for all our workers */
-	memset(&worker, 0, sizeof(worker));
+	memset(&worker, 0, sizeof(BackgroundWorker));
 	worker.bgw_flags = BGWORKER_SHMEM_ACCESS |
 		BGWORKER_BACKEND_DATABASE_CONNECTION;
 	worker.bgw_start_time = BgWorkerStart_RecoveryFinished;
@@ -359,7 +359,7 @@ worker_spi_launch(PG_FUNCTION_ARGS)
 	BgwHandleStatus status;
 	pid_t		pid;
 
-	memset(&worker, 0, sizeof(worker));
+	memset(&worker, 0, sizeof(BackgroundWorker));
 	worker.bgw_flags = BGWORKER_SHMEM_ACCESS |
 		BGWORKER_BACKEND_DATABASE_CONNECTION;
 	worker.bgw_start_time = BgWorkerStart_RecoveryFinished;
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 982801e029..66e8eae77c 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -1125,7 +1125,7 @@ spawn_process(const char *cmdline)
 	if (comspec == NULL)
 		comspec = "CMD";
 
-	memset(&pi, 0, sizeof(pi));
+	memset(&pi, 0, sizeof(PROCESS_INFORMATION));
 	cmdline2 = psprintf("\"%s\" /c \"%s\"", comspec, cmdline);
 
 	if ((restrictedToken =
diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm
index f24d9e5348..5e2a300127 100644
--- a/src/tools/msvc/MSBuildProject.pm
+++ b/src/tools/msvc/MSBuildProject.pm
@@ -331,7 +331,7 @@ sub WriteItemDefinitionGroup
       <ObjectFileName>.\\$cfgname\\$self->{name}\\</ObjectFileName>
       <ProgramDataBaseFileName>.\\$cfgname\\$self->{name}\\</ProgramDataBaseFileName>
       <BrowseInformation>false</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
+      <WarningLevel>Level4</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
