It could be argued that in many cases X-macros increase safety, because it makes easier to make sure that generated arrays are the same length for example.
However, Misra C (from 2004 reference) rules seem to have a lot of preprocessor rules that restrict the usage:
Rule 19.1 (advisory) #include statements in a file should only be preceded by other preprocessor directives or comments.
Troublesome if source table is in other file which is included to generate array for example. But this is advisory rule so it can be worked around.
Rule 19.4 (required) C macros shall only expand to a braced initializer, a constant, a string literal, a parenthesized expression, a type qualifier, a storage class specifier, or a do-while-zero construct.
Should not be issue since most X-macros are used to generate array initializers or constants.
Rule 19.6 (required) #undef shall not be used.
Makes some X-macro usage patterns impossible. Unfortunate, but doesn't outright prevent X-macros.
Rule 19.7 (advisory) A function should be used in preference to a function-like macro.
Advisory rule only.
Rule 19.12 (required) There shall be at most one occurrence of the # or ## preprocessor operators in a single macro definition.
Can be worked around using nested macros.
Rule 19.13 (advisory) The # and ## preprocessor operators should not be used.
Troublesome when generating enums for example, but again this is only advisory rule.
Rule 19.15 (required) Precautions shall be taken in order to prevent the contents of a header file being included twice.
Troublesome in some scenarios, but can be worked around.
Looking at the above, it seems that it is possible to use X-macros with Misra C code, if you are careful.
Is my conclusion correct, or is there some rule I am missing?