diff options
author | Moti Cohen <moti.cohen@redis.com> | 2022-08-03 19:38:08 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-03 19:38:08 +0300 |
commit | 1aa6c4ab9294af4eef50fbd82079051f4c06dd42 (patch) | |
tree | df96cdc70b889964ae8d0410b6ee9b2affb5f701 | |
parent | dcafee55a580430b17ca237799a4eff245919c3b (diff) | |
download | redis-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.h | 2 | ||||
-rw-r--r-- | src/dict.h | 13 | ||||
-rw-r--r-- | src/hyperloglog.c | 6 | ||||
-rw-r--r-- | src/module.c | 2 | ||||
-rw-r--r-- | src/rax.c | 2 | ||||
-rw-r--r-- | src/rdb.c | 2 | ||||
-rw-r--r-- | src/rdb.h | 2 | ||||
-rw-r--r-- | src/redis-cli.c | 8 | ||||
-rw-r--r-- | src/server.h | 6 |
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 @@ -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. */ @@ -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; @@ -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) |