I think we should insert a number of static assertions in the OpenLDAP code: Asserts that fail or succeed at compile time. E.g. for the comment in config.c:bindkey[] (ITS#6419).
Like this - in include/ac/assert.h? Or ldap_cdefs.h in case we want to use it in installed headers?
/* Declaration which tries to force a compile error if !cond */ #define ber_static_assert(cond) \ LBER_V(LDAP_CONST char) ber_assertion[ber_assertz(cond) + 1]
/* Return 0, or if !cond try to force a compile error */ #define ber_assertz(cond) (sizeof(struct { \ int ber_assert1[(cond) ? 9 : -9], ber_assert2:(cond) ? 9 : -9; }) && 0)
/* Usage: */ ber_static_assert(~0U >= 0xFFFFFFFFUL); /* int = 32 bits or wider */ int foo(int i) { return i + ber_assertz(LDAP_SUCCESS == 0); }
liblber will need a dummy variable 'const char ber_assertion[1];'. We can drop that if anyone dislikes it: ber_static_assert() can take an assertion_name parameter and declare a typedef based on that name. Or it can generate a name from __LINE__. Then we can have only one static assert per line, which matters for macros but little else.