Skip to content

Instantly share code, notes, and snippets.

@rwmjones
Created October 10, 2025 10:49
Show Gist options
  • Select an option

  • Save rwmjones/24c51e49adea38fbb2368080072f01d3 to your computer and use it in GitHub Desktop.

Select an option

Save rwmjones/24c51e49adea38fbb2368080072f01d3 to your computer and use it in GitHub Desktop.
struct canary {} canary;
#define check_expr_0(t, canary, ...)
#define check_expr_1(t, arg, canary, ...)
#define check_expr_2(t, arg0, arg1, canary, ...)
#define check_expr_3(t, arg0, arg1, arg2, canary, ...)
#define expr(t, ...) \
__extension__({ \
if (__builtin_constant_p (t)) { \
switch (t) { \
case EXPR_NULL: \
check_expr_0 (t,## __VA_ARGS__, canary); \
break; \
case EXPR_LIST: \
case EXPR_BYTE: \
case EXPR_ABS_OFFSET: \
case EXPR_ALIGN_OFFSET: \
case EXPR_REL_OFFSET: \
case EXPR_FILE: \
case EXPR_SCRIPT: \
case EXPR_STRING: \
case EXPR_NAME: \
check_expr_1 (t,## __VA_ARGS__, canary, 0); \
break; \
case EXPR_FILL: \
case EXPR_ASSIGN: \
case EXPR_REPEAT: \
check_expr_2 (t,## __VA_ARGS__, canary, 0, 0); \
break; \
case EXPR_SLICE: \
check_expr_3 (t,## __VA_ARGS__, canary, 0, 0, 0); \
break; \
} \
} \
expr (t, ##__VA_ARGS__); \
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment