12.8. Disguising Boolean Values
Problem
Variables representing boolean values are difficult to disguise because they usually compile to comparisons with 0 or 1.
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.
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; SPC_SET_BOOL_TRUE(b); if (SPC_TEST_BOOL(b)) printf("true!\n"); else printf("false!\n");
See Also
Get Secure Programming Cookbook for C and C++ now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.