aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-03-26 14:29:29 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2022-03-26 14:29:52 -0400
commitcb8586d0514bc685152e34b3af3b9a803e4eb9f4 (patch)
treeb458eb6381aba3bcbd8e56783a01994d980d60d9 /src
parentd09f765b9dcbd336fe5d6b4e039fc0309deb502d (diff)
downloadpostgresql-cb8586d0514bc685152e34b3af3b9a803e4eb9f4.tar.gz
postgresql-cb8586d0514bc685152e34b3af3b9a803e4eb9f4.zip
Suppress compiler warning in relptr_store().
clang 13 with -Wextra warns that "performing pointer subtraction with a null pointer has undefined behavior" in the places where freepage.c tries to set a relptr variable to constant NULL. This appears to be a compiler bug, but it's unlikely to get fixed instantly. Fortunately, we can work around it by introducing an inline support function, which seems like a good change anyway because it removes the macro's existing double-evaluation hazard. Backpatch to v10 where this code was introduced. Patch by me, based on an idea of Andres Freund's. Discussion: https://postgr.es/m/48826.1648310694@sss.pgh.pa.us
Diffstat (limited to 'src')
-rw-r--r--src/include/utils/relptr.h17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/include/utils/relptr.h b/src/include/utils/relptr.h
index 9ebcca5295e..75ca169226c 100644
--- a/src/include/utils/relptr.h
+++ b/src/include/utils/relptr.h
@@ -56,11 +56,24 @@
#define relptr_is_null(rp) \
((rp).relptr_off == 0)
+/* We use this inline to avoid double eval of "val" in relptr_store */
+static inline Size
+relptr_store_eval(char *base, char *val)
+{
+ if (val == NULL)
+ return 0;
+ else
+ {
+ Assert(val > base);
+ return val - base;
+ }
+}
+
#ifdef HAVE__BUILTIN_TYPES_COMPATIBLE_P
#define relptr_store(base, rp, val) \
(AssertVariableIsOfTypeMacro(base, char *), \
AssertVariableIsOfTypeMacro(val, __typeof__((rp).relptr_type)), \
- (rp).relptr_off = ((val) == NULL ? 0 : ((char *) (val)) - (base)))
+ (rp).relptr_off = relptr_store_eval(base, (char *) (val)))
#else
/*
* If we don't have __builtin_types_compatible_p, assume we might not have
@@ -68,7 +81,7 @@
*/
#define relptr_store(base, rp, val) \
(AssertVariableIsOfTypeMacro(base, char *), \
- (rp).relptr_off = ((val) == NULL ? 0 : ((char *) (val)) - (base)))
+ (rp).relptr_off = relptr_store_eval(base, (char *) (val)))
#endif
#define relptr_copy(rp1, rp2) \