summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoti Cohen <moti.cohen@redis.com>2022-08-03 19:38:08 +0300
committerGitHub <noreply@github.com>2022-08-03 19:38:08 +0300
commit1aa6c4ab9294af4eef50fbd82079051f4c06dd42 (patch)
treedf96cdc70b889964ae8d0410b6ee9b2affb5f701
parentdcafee55a580430b17ca237799a4eff245919c3b (diff)
downloadredis-1aa6c4ab9294af4eef50fbd82079051f4c06dd42.tar.gz
Adding parentheses and do-while(0) to macros (#11080)
Fixing few macros that doesn't follows most basic safety conventions which is wrapping any usage of passed variable with parentheses and if written more than one command, then wrap it with do-while(0) (or parentheses).
-rw-r--r--src/atomicvar.h2
-rw-r--r--src/dict.h13
-rw-r--r--src/hyperloglog.c6
-rw-r--r--src/module.c2
-rw-r--r--src/rax.c2
-rw-r--r--src/rdb.c2
-rw-r--r--src/rdb.h2
-rw-r--r--src/redis-cli.c8
-rw-r--r--src/server.h6
9 files changed, 22 insertions, 21 deletions
diff --git a/src/atomicvar.h b/src/atomicvar.h
index 222b82699..2c2969c33 100644
--- a/src/atomicvar.h
+++ b/src/atomicvar.h
@@ -141,7 +141,7 @@
while(!__sync_bool_compare_and_swap(&var,var,value)); \
} while(0)
/* Actually the builtin issues a full memory barrier by default. */
-#define atomicGetWithSync(var,dstvar) { \
+#define atomicGetWithSync(var,dstvar) do { \
dstvar = __sync_sub_and_fetch(&var,0,__sync_synchronize); \
ANNOTATE_HAPPENS_AFTER(&var); \
} while(0)
diff --git a/src/dict.h b/src/dict.h
index e65fbb583..8f45b057e 100644
--- a/src/dict.h
+++ b/src/dict.h
@@ -110,9 +110,10 @@ typedef void (dictScanBucketFunction)(dict *d, dictEntry **bucketref);
#define DICT_HT_INITIAL_SIZE (1<<(DICT_HT_INITIAL_EXP))
/* ------------------------------- Macros ------------------------------------*/
-#define dictFreeVal(d, entry) \
- if ((d)->type->valDestructor) \
- (d)->type->valDestructor((d), (entry)->v.val)
+#define dictFreeVal(d, entry) do { \
+ if ((d)->type->valDestructor) \
+ (d)->type->valDestructor((d), (entry)->v.val); \
+ } while(0)
#define dictSetVal(d, entry, _val_) do { \
if ((d)->type->valDup) \
@@ -150,7 +151,7 @@ typedef void (dictScanBucketFunction)(dict *d, dictEntry **bucketref);
#define dictMetadataSize(d) ((d)->type->dictEntryMetadataBytes \
? (d)->type->dictEntryMetadataBytes(d) : 0)
-#define dictHashKey(d, key) (d)->type->hashFunction(key)
+#define dictHashKey(d, key) ((d)->type->hashFunction(key))
#define dictGetKey(he) ((he)->key)
#define dictGetVal(he) ((he)->v.val)
#define dictGetSignedIntegerVal(he) ((he)->v.s64)
@@ -159,8 +160,8 @@ typedef void (dictScanBucketFunction)(dict *d, dictEntry **bucketref);
#define dictSlots(d) (DICTHT_SIZE((d)->ht_size_exp[0])+DICTHT_SIZE((d)->ht_size_exp[1]))
#define dictSize(d) ((d)->ht_used[0]+(d)->ht_used[1])
#define dictIsRehashing(d) ((d)->rehashidx != -1)
-#define dictPauseRehashing(d) (d)->pauserehash++
-#define dictResumeRehashing(d) (d)->pauserehash--
+#define dictPauseRehashing(d) ((d)->pauserehash++)
+#define dictResumeRehashing(d) ((d)->pauserehash--)
/* If our unsigned long type can store a 64 bit number, use a 64 bit PRNG. */
#if ULONG_MAX >= 0xffffffffffffffff
diff --git a/src/hyperloglog.c b/src/hyperloglog.c
index 84fd6b680..a2d5ff2d7 100644
--- a/src/hyperloglog.c
+++ b/src/hyperloglog.c
@@ -350,10 +350,10 @@ static char *invalid_hll_err = "-INVALIDOBJ Corrupted HLL object detected";
* 'p' is an array of unsigned bytes. */
#define HLL_DENSE_SET_REGISTER(p,regnum,val) do { \
uint8_t *_p = (uint8_t*) p; \
- unsigned long _byte = regnum*HLL_BITS/8; \
- unsigned long _fb = regnum*HLL_BITS&7; \
+ unsigned long _byte = (regnum)*HLL_BITS/8; \
+ unsigned long _fb = (regnum)*HLL_BITS&7; \
unsigned long _fb8 = 8 - _fb; \
- unsigned long _v = val; \
+ unsigned long _v = (val); \
_p[_byte] &= ~(HLL_REGISTER_MAX << _fb); \
_p[_byte] |= _v << _fb; \
_p[_byte+1] &= ~(HLL_REGISTER_MAX >> _fb8); \
diff --git a/src/module.c b/src/module.c
index 78e47b1eb..0891ef9ca 100644
--- a/src/module.c
+++ b/src/module.c
@@ -363,7 +363,7 @@ typedef struct RedisModuleServerInfoData {
* we assume default behavior, that is, Redis signals.
* (see RM_GetThreadSafeContext) */
#define SHOULD_SIGNAL_MODIFIED_KEYS(ctx) \
- ctx->module? !(ctx->module->options & REDISMODULE_OPTION_NO_IMPLICIT_SIGNAL_MODIFIED) : 1
+ ((ctx)->module? !((ctx)->module->options & REDISMODULE_OPTION_NO_IMPLICIT_SIGNAL_MODIFIED) : 1)
/* Server events hooks data structures and defines: this modules API
* allow modules to subscribe to certain events in Redis, such as
diff --git a/src/rax.c b/src/rax.c
index dd89ad929..bef13a440 100644
--- a/src/rax.c
+++ b/src/rax.c
@@ -154,7 +154,7 @@ static inline void raxStackFree(raxStack *ts) {
* 'nodesize'. The padding is needed to store the child pointers to aligned
* addresses. Note that we add 4 to the node size because the node has a four
* bytes header. */
-#define raxPadding(nodesize) ((sizeof(void*)-((nodesize+4) % sizeof(void*))) & (sizeof(void*)-1))
+#define raxPadding(nodesize) ((sizeof(void*)-(((nodesize)+4) % sizeof(void*))) & (sizeof(void*)-1))
/* Return the pointer to the last child pointer in a node. For the compressed
* nodes this is the only child pointer. */
diff --git a/src/rdb.c b/src/rdb.c
index 5b9d1abe6..fea5f4121 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -51,7 +51,7 @@
/* This macro tells if we are in the context of a RESTORE command, and not loading an RDB or AOF. */
#define isRestoreContext() \
- (server.current_client == NULL || server.current_client->id == CLIENT_ID_AOF) ? 0 : 1
+ ((server.current_client == NULL || server.current_client->id == CLIENT_ID_AOF) ? 0 : 1)
char* rdbFileBeingLoaded = NULL; /* used for rdb checking on read error */
extern int rdbCheckMode;
diff --git a/src/rdb.h b/src/rdb.h
index 4f057a252..d85300eab 100644
--- a/src/rdb.h
+++ b/src/rdb.h
@@ -98,7 +98,7 @@
/* NOTE: WHEN ADDING NEW RDB TYPE, UPDATE rdbIsObjectType() BELOW */
/* Test if a type is an object type. */
-#define rdbIsObjectType(t) ((t >= 0 && t <= 7) || (t >= 9 && t <= 19))
+#define rdbIsObjectType(t) (((t) >= 0 && (t) <= 7) || ((t) >= 9 && (t) <= 19))
/* Special RDB opcodes (saved/loaded with rdbSaveType/rdbLoadType). */
#define RDB_OPCODE_FUNCTION2 245 /* function library data */
diff --git a/src/redis-cli.c b/src/redis-cli.c
index 5f3bc78d4..bc85c21d4 100644
--- a/src/redis-cli.c
+++ b/src/redis-cli.c
@@ -91,15 +91,15 @@
"address (ie. 120.0.0.1:7000) or space separated IP " \
"and port (ie. 120.0.0.1 7000)\n"
#define CLUSTER_MANAGER_MODE() (config.cluster_manager_command.name != NULL)
-#define CLUSTER_MANAGER_MASTERS_COUNT(nodes, replicas) (nodes/(replicas + 1))
+#define CLUSTER_MANAGER_MASTERS_COUNT(nodes, replicas) ((nodes)/((replicas) + 1))
#define CLUSTER_MANAGER_COMMAND(n,...) \
- (redisCommand(n->context, __VA_ARGS__))
+ (redisCommand((n)->context, __VA_ARGS__))
-#define CLUSTER_MANAGER_NODE_ARRAY_FREE(array) zfree(array->alloc)
+#define CLUSTER_MANAGER_NODE_ARRAY_FREE(array) zfree((array)->alloc)
#define CLUSTER_MANAGER_PRINT_REPLY_ERROR(n, err) \
clusterManagerLogErr("Node %s:%d replied with error:\n%s\n", \
- n->ip, n->port, err);
+ (n)->ip, (n)->port, (err));
#define clusterManagerLogInfo(...) \
clusterManagerLog(CLUSTER_MANAGER_LOG_LVL_INFO,__VA_ARGS__)
diff --git a/src/server.h b/src/server.h
index 9e27e85f8..fb96987f4 100644
--- a/src/server.h
+++ b/src/server.h
@@ -618,7 +618,7 @@ typedef enum {
/* Using the following macro you can run code inside serverCron() with the
* specified period, specified in milliseconds.
* The actual resolution depends on server.hz. */
-#define run_with_period(_ms_) if ((_ms_ <= 1000/server.hz) || !(server.cronloops%((_ms_)/(1000/server.hz))))
+#define run_with_period(_ms_) if (((_ms_) <= 1000/server.hz) || !(server.cronloops%((_ms_)/(1000/server.hz))))
/* We can print the stacktrace, so our assert is defined this way: */
#define serverAssertWithInfo(_c,_o,_e) ((_e)?(void)0 : (_serverAssertWithInfo(_c,_o,#_e,__FILE__,__LINE__),redis_unreachable()))
@@ -667,8 +667,8 @@ typedef enum {
/* Extract encver / signature from a module type ID. */
#define REDISMODULE_TYPE_ENCVER_BITS 10
#define REDISMODULE_TYPE_ENCVER_MASK ((1<<REDISMODULE_TYPE_ENCVER_BITS)-1)
-#define REDISMODULE_TYPE_ENCVER(id) (id & REDISMODULE_TYPE_ENCVER_MASK)
-#define REDISMODULE_TYPE_SIGN(id) ((id & ~((uint64_t)REDISMODULE_TYPE_ENCVER_MASK)) >>REDISMODULE_TYPE_ENCVER_BITS)
+#define REDISMODULE_TYPE_ENCVER(id) ((id) & REDISMODULE_TYPE_ENCVER_MASK)
+#define REDISMODULE_TYPE_SIGN(id) (((id) & ~((uint64_t)REDISMODULE_TYPE_ENCVER_MASK)) >>REDISMODULE_TYPE_ENCVER_BITS)
/* Bit flags for moduleTypeAuxSaveFunc */
#define REDISMODULE_AUX_BEFORE_RDB (1<<0)