diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2022-03-26 14:29:29 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2022-03-26 14:30:09 -0400 |
commit | e07d4ddc55fdcf82082950b3eb0cd8f728284c9d (patch) | |
tree | 079bd567552b89ca5cf061f822aee8714ce1ec09 /src | |
parent | 41b00f8e601fcf82aab2fc5ad0214a67f4829431 (diff) | |
download | postgresql-e07d4ddc55fdcf82082950b3eb0cd8f728284c9d.tar.gz postgresql-e07d4ddc55fdcf82082950b3eb0cd8f728284c9d.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.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/include/utils/relptr.h b/src/include/utils/relptr.h index fdc2124d2c7..cc80a7200de 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) \ |