aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2023-03-16 14:08:44 -0700
committerAndres Freund <andres@anarazel.de>2023-03-16 14:48:46 -0700
commita7a92738ffce35b480d20965ad95317729ae96a2 (patch)
treec842a434fdc213fabc33d4f968ab1e3c2dc913a9
parent00fc4b3a31010033e8b1a964c90a7a30b8d6a7d7 (diff)
downloadpostgresql-a7a92738ffce35b480d20965ad95317729ae96a2.tar.gz
postgresql-a7a92738ffce35b480d20965ad95317729ae96a2.zip
Work around spurious compiler warning in inet operators
gcc 12+ has complaints like the following: ../../../../../pgsql/src/backend/utils/adt/network.c: In function 'inetnot': ../../../../../pgsql/src/backend/utils/adt/network.c:1893:34: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 1893 | pdst[nb] = ~pip[nb]; | ~~~~~~~~~^~~~~~~~~~ ../../../../../pgsql/src/include/utils/inet.h:27:23: note: at offset -1 into destination object 'ipaddr' of size 16 27 | unsigned char ipaddr[16]; /* up to 128 bits of address */ | ^~~~~~ ../../../../../pgsql/src/include/utils/inet.h:27:23: note: at offset -1 into destination object 'ipaddr' of size 16 This is due to a compiler bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104986 It has been a year since the bug has been reported without getting fixed. As the warnings are verbose and use of gcc 12 is becoming more common, it seems worth working around the bug. Particularly because a simple reformulation of the loop condition fixes the issue and isn't any less readable. Author: Tom Lane <tgl@sss.pgh.pa.us> Author: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/144536.1648326206@sss.pgh.pa.us Backpatch: 11-
-rw-r--r--src/backend/utils/adt/network.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c
index 0ab54316f8e..60c2b761751 100644
--- a/src/backend/utils/adt/network.c
+++ b/src/backend/utils/adt/network.c
@@ -1889,7 +1889,7 @@ inetnot(PG_FUNCTION_ARGS)
unsigned char *pip = ip_addr(ip);
unsigned char *pdst = ip_addr(dst);
- while (nb-- > 0)
+ while (--nb >= 0)
pdst[nb] = ~pip[nb];
}
ip_bits(dst) = ip_bits(ip);
@@ -1921,7 +1921,7 @@ inetand(PG_FUNCTION_ARGS)
unsigned char *pip2 = ip_addr(ip2);
unsigned char *pdst = ip_addr(dst);
- while (nb-- > 0)
+ while (--nb >= 0)
pdst[nb] = pip[nb] & pip2[nb];
}
ip_bits(dst) = Max(ip_bits(ip), ip_bits(ip2));
@@ -1953,7 +1953,7 @@ inetor(PG_FUNCTION_ARGS)
unsigned char *pip2 = ip_addr(ip2);
unsigned char *pdst = ip_addr(dst);
- while (nb-- > 0)
+ while (--nb >= 0)
pdst[nb] = pip[nb] | pip2[nb];
}
ip_bits(dst) = Max(ip_bits(ip), ip_bits(ip2));
@@ -1978,7 +1978,7 @@ internal_inetpl(inet *ip, int64 addend)
unsigned char *pdst = ip_addr(dst);
int carry = 0;
- while (nb-- > 0)
+ while (--nb >= 0)
{
carry = pip[nb] + (int) (addend & 0xFF) + carry;
pdst[nb] = (unsigned char) (carry & 0xFF);
@@ -2062,7 +2062,7 @@ inetmi(PG_FUNCTION_ARGS)
unsigned char *pip2 = ip_addr(ip2);
int carry = 1;
- while (nb-- > 0)
+ while (--nb >= 0)
{
int lobyte;