File 0869-erts-Suppress-various-NULL-pointer-warnings.patch of Package erlang
From 8d8fa1907ecaa98776b3fd2141fbd8b4cf8078cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Tue, 11 Feb 2025 09:40:57 +0100
Subject: [PATCH 2/2] erts: Suppress various NULL-pointer warnings
---
erts/emulator/beam/dist.c | 11 +++++++++--
erts/emulator/beam/io.c | 12 +++++++++++-
erts/emulator/beam/sys.h | 2 ++
3 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c
index d30fe57980..cfa857e0df 100644
--- a/erts/emulator/beam/dist.c
+++ b/erts/emulator/beam/dist.c
@@ -3194,11 +3194,11 @@ void erts_schedule_dist_command(Port *prt, DistEntry *dist_entry)
& ERTS_PORT_SFLGS_DEAD) == 0);
dep = (DistEntry*) erts_prtsd_get(prt, ERTS_PRTSD_DIST_ENTRY);
- ASSERT(dep);
+ ERTS_ASSUME(dep);
id = prt->common.id;
}
else {
- ASSERT(dist_entry);
+ ERTS_ASSUME(dist_entry);
ERTS_LC_ASSERT(erts_lc_rwmtx_is_rlocked(&dist_entry->rwmtx)
|| erts_lc_rwmtx_is_rwlocked(&dist_entry->rwmtx));
ASSERT(is_internal_port(dist_entry->cid));
@@ -3773,6 +3773,9 @@ dist_port_commandv(Port *prt, ErtsDistOutputBuf *obuf)
#ifdef USE_VM_PROBES
if (DTRACE_ENABLED(dist_outputv)) {
DistEntry *dep = (DistEntry*) erts_prtsd_get(prt, ERTS_PRTSD_DIST_ENTRY);
+
+ ERTS_ASSUME(dep);
+
DTRACE_CHARBUF(port_str, 64);
DTRACE_CHARBUF(remote_str, 64);
@@ -3878,6 +3881,7 @@ erts_dist_command(Port *prt, int initial_reds)
ERTS_LC_ASSERT(erts_lc_is_port_locked(prt));
+ ERTS_ASSUME(dep);
erts_atomic_set_mb(&dep->dist_cmd_scheduled, 0);
erts_de_rlock(dep);
@@ -4625,6 +4629,9 @@ erts_dist_port_not_busy(Port *prt)
#ifdef USE_VM_PROBES
if (DTRACE_ENABLED(dist_port_not_busy)) {
DistEntry *dep = (DistEntry*) erts_prtsd_get(prt, ERTS_PRTSD_DIST_ENTRY);
+
+ ERTS_ASSUME(dep);
+
DTRACE_CHARBUF(port_str, 64);
DTRACE_CHARBUF(remote_str, 64);
diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c
index 41c1b94ccb..186e592c31 100644
--- a/erts/emulator/beam/io.c
+++ b/erts/emulator/beam/io.c
@@ -3903,7 +3903,9 @@ erts_deliver_port_exit(Port *prt, Eterm from, Eterm reason, int send_closed,
if (state & ERTS_PORT_SFLG_DISTRIBUTION) {
DistEntry *dep = (DistEntry*) erts_prtsd_get(prt, ERTS_PRTSD_DIST_ENTRY);
- ASSERT(dep);
+
+ ERTS_ASSUME(dep);
+
erts_do_net_exits(dep, modified_reason);
erts_deref_dist_entry(dep);
erts_prtsd_set(prt, ERTS_PRTSD_DIST_ENTRY, NULL);
@@ -6345,7 +6347,11 @@ int driver_output_binary(ErlDrvPort ix, char* hbuf, ErlDrvSizeT hlen,
if (state & ERTS_PORT_SFLG_DISTRIBUTION) {
DistEntry* dep = (DistEntry*) erts_prtsd_get(prt, ERTS_PRTSD_DIST_ENTRY);
Uint32 conn_id = (Uint32)(UWord) erts_prtsd_get(prt, ERTS_PRTSD_CONN_ID);
+
+ ERTS_ASSUME(dep);
+
erts_atomic64_inc_nob(&dep->in);
+
return erts_net_message(prt,
dep,
conn_id,
@@ -6390,7 +6396,11 @@ int driver_output2(ErlDrvPort ix, char* hbuf, ErlDrvSizeT hlen,
if (state & ERTS_PORT_SFLG_DISTRIBUTION) {
DistEntry *dep = (DistEntry*) erts_prtsd_get(prt, ERTS_PRTSD_DIST_ENTRY);
Uint32 conn_id = (Uint32)(UWord) erts_prtsd_get(prt, ERTS_PRTSD_CONN_ID);
+
+ ERTS_ASSUME(dep);
+
erts_atomic64_inc_nob(&dep->in);
+
if (len == 0)
return erts_net_message(prt,
dep,
diff --git a/erts/emulator/beam/sys.h b/erts/emulator/beam/sys.h
index b066f708d3..064c265f2e 100644
--- a/erts/emulator/beam/sys.h
+++ b/erts/emulator/beam/sys.h
@@ -186,6 +186,8 @@ typedef ERTS_SYS_FD_TYPE ErtsSysFdType;
# define ERTS_UNREACHABLE ((void)0)
#endif
+/* Tells the compiler to assume that a certain fact always holds, suppressing
+ * bogus warnings and/or enabling better optimizations. */
#if !defined(DEBUG)
# define ERTS_ASSUME(Expr) ((Expr) ? \
(void)0 : \
--
2.43.0