From 709170b790c11b4012004a6baf11a0fc6ec950de Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sun, 20 Oct 2013 21:04:52 -0400 Subject: [PATCH] Consistently use unsigned arithmetic for alignment calculations. This avoids an assumption about the signed number representation. It is anticipated to have no functional changes on supported configurations; many two's complement assumptions remain elsewhere. Per a suggestion from Andres Freund. --- src/backend/access/hash/hashfunc.c | 2 +- src/include/access/tupmacs.h | 8 ++++---- src/include/c.h | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/backend/access/hash/hashfunc.c b/src/backend/access/hash/hashfunc.c index d599282193..cb3b7e9278 100644 --- a/src/backend/access/hash/hashfunc.c +++ b/src/backend/access/hash/hashfunc.c @@ -314,7 +314,7 @@ hash_any(register const unsigned char *k, register int keylen) a = b = c = 0x9e3779b9 + len + 3923095; /* If the source pointer is word-aligned, we use word-wide fetches */ - if (((intptr_t) k & UINT32_ALIGN_MASK) == 0) + if (((uintptr_t) k & UINT32_ALIGN_MASK) == 0) { /* Code path for aligned source data */ register const uint32 *ka = (const uint32 *) k; diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h index 2886cedc1c..42a50e4604 100644 --- a/src/include/access/tupmacs.h +++ b/src/include/access/tupmacs.h @@ -101,7 +101,7 @@ #define att_align_datum(cur_offset, attalign, attlen, attdatum) \ ( \ ((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \ - (intptr_t) (cur_offset) : \ + (uintptr_t) (cur_offset) : \ att_align_nominal(cur_offset, attalign) \ ) @@ -116,13 +116,13 @@ * aligned 4-byte length word; in either case we need not align.) * * Note: some callers pass a "char *" pointer for cur_offset. This is - * a bit of a hack but should work all right as long as intptr_t is the + * a bit of a hack but should work all right as long as uintptr_t is the * correct width. */ #define att_align_pointer(cur_offset, attalign, attlen, attptr) \ ( \ ((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \ - (intptr_t) (cur_offset) : \ + (uintptr_t) (cur_offset) : \ att_align_nominal(cur_offset, attalign) \ ) @@ -144,7 +144,7 @@ #define att_align_nominal(cur_offset, attalign) \ ( \ ((attalign) == 'i') ? INTALIGN(cur_offset) : \ - (((attalign) == 'c') ? (intptr_t) (cur_offset) : \ + (((attalign) == 'c') ? (uintptr_t) (cur_offset) : \ (((attalign) == 'd') ? DOUBLEALIGN(cur_offset) : \ ( \ AssertMacro((attalign) == 's'), \ diff --git a/src/include/c.h b/src/include/c.h index 8916310b5b..6e19c6df87 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -486,7 +486,7 @@ typedef NameData *Name; * True iff pointer is properly aligned to point to the given type. */ #define PointerIsAligned(pointer, type) \ - (((intptr_t)(pointer) % (sizeof (type))) == 0) + (((uintptr_t)(pointer) % (sizeof (type))) == 0) #define OidIsValid(objectId) ((bool) ((objectId) != InvalidOid)) @@ -532,7 +532,7 @@ typedef NameData *Name; */ #define TYPEALIGN(ALIGNVAL,LEN) \ - (((intptr_t) (LEN) + ((ALIGNVAL) - 1)) & ~((intptr_t) ((ALIGNVAL) - 1))) + (((uintptr_t) (LEN) + ((ALIGNVAL) - 1)) & ~((uintptr_t) ((ALIGNVAL) - 1))) #define SHORTALIGN(LEN) TYPEALIGN(ALIGNOF_SHORT, (LEN)) #define INTALIGN(LEN) TYPEALIGN(ALIGNOF_INT, (LEN)) @@ -543,7 +543,7 @@ typedef NameData *Name; #define BUFFERALIGN(LEN) TYPEALIGN(ALIGNOF_BUFFER, (LEN)) #define TYPEALIGN_DOWN(ALIGNVAL,LEN) \ - (((intptr_t) (LEN)) & ~((intptr_t) ((ALIGNVAL) - 1))) + (((uintptr_t) (LEN)) & ~((uintptr_t) ((ALIGNVAL) - 1))) #define SHORTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_SHORT, (LEN)) #define INTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_INT, (LEN)) @@ -552,7 +552,7 @@ typedef NameData *Name; #define MAXALIGN_DOWN(LEN) TYPEALIGN_DOWN(MAXIMUM_ALIGNOF, (LEN)) /* - * The above macros will not work with types wider than intptr_t, like with + * The above macros will not work with types wider than uintptr_t, like with * uint64 on 32-bit platforms. That's not problem for the usual use where a * pointer or a length is aligned, but for the odd case that you need to * align something (potentially) wider, use TYPEALIGN64. @@ -763,7 +763,7 @@ typedef NameData *Name; int _val = (val); \ Size _len = (len); \ \ - if ((((intptr_t) _vstart) & LONG_ALIGN_MASK) == 0 && \ + if ((((uintptr_t) _vstart) & LONG_ALIGN_MASK) == 0 && \ (_len & LONG_ALIGN_MASK) == 0 && \ _val == 0 && \ _len <= MEMSET_LOOP_LIMIT && \ -- 2.40.0