diff --git a/src/common/compat.h b/src/common/compat.h index 62612b72c6..fe07d3254b 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -120,6 +120,21 @@ extern INLINE double U64_TO_DBL(uint64_t x) { #define PREDICT_UNLIKELY(exp) (exp) #endif +/* Ways to declare macros. */ +#define STMT_NIL (void)0 +#ifdef __GNUC__ +#define STMT_BEGIN (void) ({ +#define STMT_END }) +#else +#if defined(sun) || defined(__sun__) +#define STMT_BEGIN if (1) { +#define STMT_END } else STMT_NIL +#else +#define STMT_BEGIN do { +#define STMT_END } while(0) +#endif +#endif + /* ===== String compatibility */ #ifdef MS_WINDOWS /* Windows names string functions differently from most other platforms. */ @@ -339,9 +354,9 @@ void tor_mutex_free(tor_mutex_t *m); unsigned long tor_get_thread_id(void); #else #define tor_mutex_new() ((tor_mutex_t*)tor_malloc(sizeof(int))) -#define tor_mutex_acquire(m) do { } while (0) -#define tor_mutex_release(m) do { } while (0) -#define tor_mutex_free(m) do { tor_free(m); } while (0) +#define tor_mutex_acquire(m) STMT_NIL +#define tor_mutex_release(m) STMT_NIL +#define tor_mutex_free(m) STMT_BEGIN tor_free(m); STMT_END #define tor_get_thread_id() (1UL) #endif diff --git a/src/common/container.c b/src/common/container.c index f903a28300..4cac686147 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -665,8 +665,8 @@ smartlist_uniq_digests(smartlist_t *sl) HT_HEAD(prefix ## impl, prefix ## entry_t) head; \ } -DEFINE_MAP_STRUCTS(strmap_t, char *key, strmap_) -DEFINE_MAP_STRUCTS(digestmap_t, char key[DIGEST_LEN], digestmap_) +DEFINE_MAP_STRUCTS(strmap_t, char *key, strmap_); +DEFINE_MAP_STRUCTS(digestmap_t, char key[DIGEST_LEN], digestmap_); /** Helper: compare strmap_entry_t objects by key value. */ static INLINE int diff --git a/src/common/container.h b/src/common/container.h index 44ea81fa65..973bc38640 100644 --- a/src/common/container.h +++ b/src/common/container.h @@ -159,24 +159,24 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, * */ #define SMARTLIST_FOREACH(sl, type, var, cmd) \ - do { \ + STMT_BEGIN \ int var ## _sl_idx, var ## _sl_len=(sl)->num_used; \ type var; \ for (var ## _sl_idx = 0; var ## _sl_idx < var ## _sl_len; \ ++var ## _sl_idx) { \ var = (sl)->list[var ## _sl_idx]; \ cmd; \ - } } while (0) + } STMT_END /** Helper: While in a SMARTLIST_FOREACH loop over the list sl indexed * with the variable var, remove the current element in a way that * won't confuse the loop. */ #define SMARTLIST_DEL_CURRENT(sl, var) \ - do { \ + STMT_BEGIN \ smartlist_del(sl, var ## _sl_idx); \ --var ## _sl_idx; \ --var ## _sl_len; \ - } while (0); + STMT_END #define DECLARE_MAP_FNS(maptype, keytype, prefix) \ typedef struct maptype maptype; \ diff --git a/src/common/ht.h b/src/common/ht.h index 63629c3ac6..72fe5e2cb0 100644 --- a/src/common/ht.h +++ b/src/common/ht.h @@ -79,9 +79,7 @@ ht_string_hash(const char *s) } #define _HT_SET_HASH(elm, field, hashfn) \ - do { \ - (elm)->field.hte_hash = hashfn(elm); \ - } while (0) + (elm)->field.hte_hash = hashfn(elm) #define HT_FOREACH(x, name, head) \ for ((x) = HT_START(name, head); \ diff --git a/src/common/log.h b/src/common/log.h index f451599d00..01ab82de7e 100644 --- a/src/common/log.h +++ b/src/common/log.h @@ -131,10 +131,10 @@ void _log_fn(int severity, uint32_t domain, #define log_fn(severity, domain, args...) \ _log_fn(severity, domain, __PRETTY_FUNCTION__, args) #define log_debug(domain, args...) \ - do { \ + STMT_BEGIN \ if (PREDICT_UNLIKELY(_log_global_min_severity == LOG_DEBUG)) \ _log_fn(LOG_DEBUG, domain, __PRETTY_FUNCTION__, args); \ - } while (0) + STMT_END #define log_info(domain, args...) \ _log_fn(LOG_INFO, domain, __PRETTY_FUNCTION__, args) #define log_notice(domain, args...) \ diff --git a/src/common/test.h b/src/common/test.h index 134c9a3f2a..6919376d26 100644 --- a/src/common/test.h +++ b/src/common/test.h @@ -16,9 +16,6 @@ #include #include "compat.h" -#define STMT_BEGIN do { -#define STMT_END } while (0) - #ifdef __GNUC__ #define PRETTY_FUNCTION __PRETTY_FUNCTION__ #else diff --git a/src/common/util.h b/src/common/util.h index 0f0902452f..0da98625c0 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -47,14 +47,14 @@ /** Like assert(3), but send assertion failures to the log as well as to * stderr. */ -#define tor_assert(expr) do { \ +#define tor_assert(expr) STMT_BEGIN \ if (PREDICT_UNLIKELY(IS_FALSE_AS_INT(expr))) { \ log(LOG_ERR, LD_BUG, "%s:%d: %s: Assertion %s failed; aborting.", \ _SHORT_FILE_, __LINE__, __func__, #expr); \ fprintf(stderr,"%s:%d %s: Assertion %s failed; aborting.\n", \ _SHORT_FILE_, __LINE__, __func__, #expr); \ abort(); \ - } } while (0) + } STMT_END #endif #ifdef USE_DMALLOC @@ -83,19 +83,19 @@ void _tor_free(void *mem); #ifdef USE_DMALLOC extern int dmalloc_free(const char *file, const int line, void *pnt, const int func_id); -#define tor_free(p) do { \ +#define tor_free(p) STMT_BEGIN \ if (PREDICT_LIKELY((p)!=NULL)) { \ dmalloc_free(_SHORT_FILE_, __LINE__, (p), 0); \ (p)=NULL; \ } \ - } while (0) + STMT_END #else -#define tor_free(p) do { \ +#define tor_free(p) STMT_BEGIN \ if (PREDICT_LIKELY((p)!=NULL)) { \ free(p); \ (p)=NULL; \ } \ - } while (0) + STMT_END #endif #define tor_malloc(size) _tor_malloc(size DMALLOC_ARGS) diff --git a/src/or/buffers.c b/src/or/buffers.c index eca603c263..9ddd014529 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -40,18 +40,21 @@ const char buffers_c_id[] = /** Initialize the sentinel values on m (a value of buf->mem), which * has ln useful bytes. */ #define SET_GUARDS(m, ln) \ - do { set_uint32((m)-4,START_MAGIC); set_uint32((m)+ln,END_MAGIC); } while (0) + STMT_BEGIN \ + set_uint32((m)-4,START_MAGIC); \ + set_uint32((m)+ln,END_MAGIC); \ + STMT_END #else #define RAW_MEM(m) (m) #define GUARDED_MEM(m) (m) #define ALLOC_LEN(ln) (ln) -#define SET_GUARDS(m,ln) do {} while (0) +#define SET_GUARDS(m,ln) STMT_NIL #endif #ifdef PARANOIA -#define check() do { assert_buf_ok(buf); } while (0) +#define check() STMT_BEGIN assert_buf_ok(buf); STMT_END #else -#define check() do { } while (0) +#define check() STMT_NIL #endif #ifdef NOINLINE diff --git a/src/or/config.c b/src/or/config.c index 844e802b97..05c682cc40 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -552,11 +552,11 @@ typedef struct { /** Macro: assert that cfg has the right magic field for format * fmt. */ -#define CHECK(fmt, cfg) do { \ +#define CHECK(fmt, cfg) STMT_BEGIN \ tor_assert(fmt && cfg); \ tor_assert((fmt)->magic == \ *(uint32_t*)STRUCT_VAR_P(cfg,fmt->magic_offset)); \ - } while (0) + STMT_END static void config_line_append(config_line_t **lst, const char *key, const char *val); @@ -2419,8 +2419,8 @@ options_validate(or_options_t *old_options, or_options_t *options, const char *uname = get_uname(); char buf[1024]; #define REJECT(arg) \ - do { *msg = tor_strdup(arg); return -1; } while (0) -#define COMPLAIN(arg) do { log(LOG_WARN, LD_CONFIG, arg); } while (0) + STMT_BEGIN *msg = tor_strdup(arg); return -1; STMT_END +#define COMPLAIN(arg) STMT_BEGIN log(LOG_WARN, LD_CONFIG, arg); STMT_END tor_assert(msg); *msg = NULL; diff --git a/src/or/dns.c b/src/or/dns.c index 764ce843b9..26daf39fb2 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -103,7 +103,7 @@ static int dns_resolve_impl(edge_connection_t *exitconn, int is_resolve, static void _assert_cache_ok(void); #define assert_cache_ok() _assert_cache_ok() #else -#define assert_cache_ok() do {} while (0) +#define assert_cache_ok() STMT_NIL #endif static void assert_resolve_ok(cached_resolve_t *resolve); diff --git a/src/or/main.c b/src/or/main.c index 9d75f91381..913f299fcd 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1965,7 +1965,7 @@ nt_service_loadlibrary(void) goto err; } -#define LOAD(f) do { \ +#define LOAD(f) STMT_BEGIN \ if (!(fn = GetProcAddress(library, #f))) { \ log_err(LD_BUG, \ "Couldn't find %s in advapi32.dll! We probably got the " \ @@ -1974,7 +1974,7 @@ nt_service_loadlibrary(void) } else { \ service_fns.f ## _fn = fn; \ } \ - } while (0) + STMT_END LOAD(ChangeServiceConfig2A); LOAD(CloseServiceHandle); diff --git a/src/or/or.h b/src/or/or.h index d92493a8ee..5d5352d76a 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2576,14 +2576,14 @@ void control_adjust_event_log_severity(void); * Stmt must not contain any return or goto statements. */ #define CONN_LOG_PROTECT(conn, stmt) \ - do { \ + STMT_BEGIN \ int _log_conn_is_control = (conn && conn->type == CONN_TYPE_CONTROL); \ if (_log_conn_is_control) \ disable_control_logging(); \ - do {stmt;} while (0); \ + STMT_BEGIN stmt; STMT_END; \ if (_log_conn_is_control) \ enable_control_logging(); \ - } while (0) + STMT_END /** Log information about the connection conn, protecting it as with * CONN_LOG_PROTECT. Example: diff --git a/src/or/policies.c b/src/or/policies.c index dfe3370591..5c10040256 100644 --- a/src/or/policies.c +++ b/src/or/policies.c @@ -220,7 +220,7 @@ authdir_policy_badexit_address(uint32_t addr, uint16_t port) } #define REJECT(arg) \ - do { *msg = tor_strdup(arg); goto err; } while (0) + STMT_BEGIN *msg = tor_strdup(arg); goto err; STMT_END /** Config helper: If there's any problem with the policy configuration * options in options, return -1 and set msg to a newly diff --git a/src/or/routerparse.c b/src/or/routerparse.c index 7604cb6f63..83487d4374 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -2282,12 +2282,13 @@ token_free(directory_token_t *tok) } #define RET_ERR(msg) \ - do { \ + STMT_BEGIN \ if (tok) token_free(tok); \ tok = tor_malloc_zero(sizeof(directory_token_t)); \ tok->tp = _ERR; \ tok->error = tor_strdup(msg); \ - goto done_tokenizing; } while (0) + goto done_tokenizing; \ + STMT_END static INLINE directory_token_t * token_check_object(const char *kwd, @@ -2346,12 +2347,13 @@ get_next_token(const char **s, token_rule_t *table) const char *kwd = ""; #define RET_ERR(msg) \ - do { \ + STMT_BEGIN \ if (tok) token_free(tok); \ tok = tor_malloc_zero(sizeof(directory_token_t)); \ tok->tp = _ERR; \ tok->error = tor_strdup(msg); \ - goto done_tokenizing; } while (0) + goto done_tokenizing; \ + STMT_END tok = tor_malloc_zero(sizeof(directory_token_t)); tok->tp = _ERR; diff --git a/src/or/test.c b/src/or/test.c index 776cc2aff0..985ff18aac 100644 --- a/src/or/test.c +++ b/src/or/test.c @@ -1007,25 +1007,25 @@ _test_eq_ip6(struct in6_addr *a, struct in6_addr *b, const char *e1, } #define test_eq_ip6(a,b) _test_eq_ip6((a),(b),#a,#b,__LINE__) -#define test_pton6_same(a,b) do { \ +#define test_pton6_same(a,b) STMT_BEGIN \ r = tor_inet_pton(AF_INET6, a, &a1); \ test_assert(r==1); \ r = tor_inet_pton(AF_INET6, b, &a2); \ test_assert(r==1); \ test_eq_ip6(&a1,&a2); \ - } while (0) + STMT_END #define test_pton6_bad(a) \ test_eq(0, tor_inet_pton(AF_INET6, a, &a1)) -#define test_ntop6_reduces(a,b) do { \ +#define test_ntop6_reduces(a,b) STMT_BEGIN \ r = tor_inet_pton(AF_INET6, a, &a1); \ test_assert(r==1); \ test_streq(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), b); \ r = tor_inet_pton(AF_INET6, b, &a2); \ test_assert(r==1); \ test_eq_ip6(&a1, &a2); \ - } while (0) + STMT_END static void test_ip6_helpers(void) diff --git a/src/tools/tor-resolve.c b/src/tools/tor-resolve.c index 6fabd5d337..c23a463ed7 100644 --- a/src/tools/tor-resolve.c +++ b/src/tools/tor-resolve.c @@ -41,8 +41,8 @@ #define RESPONSE_LEN_4 8 #define log_sock_error(act, _s) \ - do { log_fn(LOG_ERR, LD_NET, "Error while %s: %s", act, \ - tor_socket_strerror(tor_socket_errno(_s))); } while (0) + STMT_BEGIN log_fn(LOG_ERR, LD_NET, "Error while %s: %s", act, \ + tor_socket_strerror(tor_socket_errno(_s))); STMT_END static void usage(void) ATTR_NORETURN;