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:45 -0700
commitfb1132e50fb856df1561ab5e43abfe07b03847ef (patch)
tree1f570965007071ae16f72be792b430662e49a061
parent75e7378f6e15271385d50543a031b1a3bee6be13 (diff)
downloadpostgresql-fb1132e50fb856df1561ab5e43abfe07b03847ef.tar.gz
postgresql-fb1132e50fb856df1561ab5e43abfe07b03847ef.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 ea1c7390d0d..ae11de0ba50 100644
--- a/src/backend/utils/adt/network.c
+++ b/src/backend/utils/adt/network.c
@@ -1874,7 +1874,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);
@@ -1906,7 +1906,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));
@@ -1938,7 +1938,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));
@@ -1963,7 +1963,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);
@@ -2047,7 +2047,7 @@ inetmi(PG_FUNCTION_ARGS)
unsigned char *pip2 = ip_addr(ip2);
int carry = 1;
- while (nb-- > 0)
+ while (--nb >= 0)
{
int lobyte;