Revise our assertion and bug macros to work with -Wparentheses
commitbb465be085ff8d1640f1d1c0bbb65605d85b5528
authorNick Mathewson <nickm@torproject.org>
Fri, 14 Sep 2018 15:39:37 +0000 (14 11:39 -0400)
committerNick Mathewson <nickm@torproject.org>
Fri, 14 Sep 2018 15:39:37 +0000 (14 11:39 -0400)
tree4b60240bf6f6139af370d28e917be5808f53e619
parentc02f2d9eb45786c552dcc33c102e9964d95f66c1
Revise our assertion and bug macros to work with -Wparentheses

On GCC and Clang, there's a feature to warn you about bad
conditionals like "if (a = b)", which should be "if (a == b)".
However, they don't warn you if there are extra parentheses around
"a = b".

Unfortunately, the tor_assert() macro and all of its kin have been
passing their inputs through stuff like PREDICT_UNLIKELY(expr) or
PREDICT_UNLIKELY(!(expr)), both of which expand to stuff with more
parentheses around "expr", thus suppressing these warnings.

To fix this, this patch introduces new macros that do not wrap
expr.  They're only used when GCC or Clang is enabled (both define
__GNUC__), since they require GCC's "({statement expression})"
syntax extension.  They're only used when we're building the
unit-test variant of the object files, since they suppress the
branch-prediction hints.

I've confirmed that tor_assert(), tor_assert_nonfatal(),
tor_assert_nonfatal_once(), BUG(), and IF_BUG_ONCE() all now give
compiler warnings when their argument is an assignment expression.

Fixes bug 27709.

Bugfix on 0.0.6, where we first introduced the "tor_assert()" macro.
changes/bug27709 [new file with mode: 0644]
src/common/util_bug.h