• Nick Mathewson's avatar
    Revise our assertion and bug macros to work with -Wparentheses · bb465be0
    Nick Mathewson authored
    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.
    bb465be0