[Cocci] Problem when using a macro for mangling function names
julia at diku.dk
Fri Mar 20 18:52:56 CET 2009
On Fri, 20 Mar 2009, Yoann Padioleau wrote:
> Julia Lawall <julia at diku.dk> writes:
> > The problem is that it is not allowed to bind a metavariable to the result
> > of expanding a macro. The error message is indeed not very graceful. The
> > problem though is that the metavariable is bound to foo, not METH(foo),
> > and would thus match the wrong thing in your later rules, so just getting
> > rid of the assert would not really solve the problem.
> > I will try to find a way to solve the problem.
> I think his example is quite common. Maybe we could extend
> the parser and engine to allow such "elaborated" ident. Another place where
> we have subtelities is in the definition of the macro itself, like
> in his #define METH(x) x##foo. For the moment the lexer
> agglomerate x##foo in a single token. We could do better as some
> analysis may want to know that this is not a regular ident.
> In ast_c.ml we could have
> | Ident of ident
> and ident =
> | RegularIdent of string
> | MacroConstructingIdent of string * string list
> | MacroConcatenation of string * string
> In the short term we could easily add then a new heuristic_hook in
> standard.h like
> #define METH(x) MACRO_CONSTRUCTING_IDENT
> to help the parser spot those idents.
> (just like we have right now in standard.h some
> #define DEBUG0(x) MACROSTATEMENT
> Later we can add some heuristics in parsing_hacks to infer
> them automatically, or as you suggest trying to leverage
> the information in actual definitions, when available.
It seems fine to me.
More information about the Cocci