12.8 Disguising Boolean Values

12.8.1 Problem

Variables representing boolean values are difficult to disguise because they usually compile to comparisons with 0 or 1.

12.8.2 Solution

Disguising boolean values can be tackled effectively at the assembly-language level by replacing simple test-and-branch code with more complex branching (see Recipe 12.3). Alternatively, the default boolean test can be replaced with an addition.

12.8.3 Discussion

By replacing the default boolean test?usually a sub or an and instruction?with an addition, the purpose of the variable becomes unclear. Rather than implying a yes or no decision, the variable appears to represent two related values:

typedef struct {
  char x;
  char y;
} spc_bool_t;
#define SPC_TEST_BOOL(b)      ((b).x + (b).y)
#define SPC_SET_BOOL_TRUE(b)  do { (b).x = 1;  (b).y = 0; } while (0)
#define SPC_SET_BOOL_FALSE(b) do { (b).x = -10;  (b).y = 10; } while (0)

The SPC_TEST_BOOL macro can be used in conditional expressions:

spc_bool_t b;
if (SPC_TEST_BOOL(b)) printf("true!\n");
else printf("false!\n");

12.8.4 See Also

Recipe 12.3