Re: [cocci] Can Coccinelle parse files where macros are used as binary operations?

Julia Lawall <[email protected]> Tue, 17 Mar 2026 12:31:48 +0100 (CET)
Newsgroups fr.inria.cocci
Message-ID <[email protected]>

On Mon, 16 Mar 2026, Alice Lee wrote:

>
> Hi Julia, 
>
>
> Is there an alternative to --defined that allows me to actually define a macro as in the "#define LS <<" example? If I modify the code to use a simpler switch than the equality check from the original as
> follows: 
>
>
> #ifdef SYMB
> #define LS >>
> #define RS <<
> #else
> #define LS <<
> #define RS >>
> #endif
>
> I still get a parse error when I run "spatch --cocci-file rule_test.cocci --defined SYMB musl-1.2.5/src/string/memcpy.c --debug"'; is this actually best done by a preprocessor and out of scope for
> Coccinelle?

Coccinelle seeing the macro definition doesn't force it to use the macro
definition.  Try putting the #defines you want in a file and then putting
--macro-file-builtins file.

Alternatively, are these definition actually in the file where you expect
the expansion to happen?  Normally, if there is a parse error, which a use
of eg LS should trigger, it will start trying to expand macros.  But I
wonder if it only tries for the ones that look like functions?  If these
definitions are in a header file, you may want an argument like
--all-includes or --recursive-includes.  Or you can put --include file.h
on the command line explicitly.  Or if you don't want to type it all the
time, you can put at the beginning of your .cocci file:

#spatch --include file.h

Or any other command line arguments you want.

julia


>
> Thanks,
> Alice
>
> _______________________________________________________________________________________________________________________________________________________________________________________________________________
> From: Julia Lawall <[email protected]>
> Sent: Friday, March 13, 2026 3:12:34 PM
> To: Alice Lee
> Cc: [email protected]
> Subject: Re: [cocci] Can Coccinelle parse files where macros are used as binary operations?  
> [EXTERNAL EMAIL - USE CAUTION when clicking links or attachments]
>
>
>
>
> On Thu, 12 Mar 2026, Alice Lee wrote:
>
> >
> > Hello,
> >
> > I am trying to use Coccinelle to search C codebases (I split up my questions
> > to make the threads more clear) and I am struggling to understand the scope
> > of the --macro-file argument.
> >
> > Can macros used with #if in the source code be defined in a file passed with
> > --macro-file, and then the right sections of source code are ignored? I was
> > unable to get a small example to work, so I assume that I can define the
> > macro but then there is no preprocessing to drop code. If I'm not
> > overlooking something, how would you recommend I parse a file
> > including these lines and then uses LS/RS as binary operators: 
> > #if __BYTE_ORDER == __LITTLE_ENDIAN
> > #define LS >>
> > #define RS <<
> > #else
> > #define LS <<
> > #define RS >>
> > #endif
> >
> > I'm especially confused by this example because Coccinelle also cannot parse
> > a version in which I remove the code above and put one of the pairs of
> > defines in the macro definition file.
>
> I think you want the following command line options:
>
>   --defined                     <symbol> treat cpp symbol as defined in #ifdef
>   --undefined                   <symbol> treat cpp symbol as undefined in #ifdef
>
> --macro-file is for providing dummy definitions for macros used in the
> code that you are trying to parse.
>
> julia
>
> >
> > Thank you,
> > Alice Lee
> >
> >
>
>