A quick fix is to add disable decl_init,const_decl_init in your first
rule r. The problem is that it applies these isomorphisms, which relate
to the possibility that the declared variable is initialized, even though
within a structure declaration, no initializations are possible.
Having multiple possibilities for the structure field causes the set of
possible metavariable bindings to explode.
I have also done a few things that should improve the performance that
will be in the next release (sometime this week), but it should be
possible to get a result just with this fix.
Thanks for the feedback.
julia
On Mon, 4 Jan 2010, Németh Márton wrote:
> Julia Lawall wrote:
> > On Mon, 4 Jan 2010, Németh Márton wrote:
> >
> >> Hi,
> >>
> >> I'm running the following SmPL using spatch 0.1.10 against Linux
> >> kernel 2.6.32-rc2, and it seems that the process stucks at a certain
>
> Sorry, the real version I used is really 2.6.33-rc2.
>
> >> file. My command line was the following:
> >>
> >> localhost:/usr/src/linux$ spatch -sp_file const_field2.spatch
> >> -all_includes drivers/video/sis/initextlfb.c
> >>
> >> The spatch which causes the infinite loop is:
> >>
> >> // <smpl>
> >> @r@
> >> identifier I1, I2, x;
> >> @@
> >> struct I1 {
> >> ...
> >> const struct I2 *x;
> >> ...
> >> };
> >> @s@
> >> identifier r.I1, y;
> >> identifier r.x, E;
> >> @@
> >> struct I1 y = {
> >> .x = E,
> >> };
> >> @c@
> >> identifier r.I2;
> >> identifier s.E;
> >> @@
> >> const struct I2 E[] = ... ;
> >> @depends on !c@
> >> identifier r.I2;
> >> identifier s.E;
> >> @@
> >> + const
> >> struct I2 E[] = ...;
> >> // </smpl>
> >>
> >> Should I enable some debug messages to find out more?
> >
> > You could try the options -debug and -show_trying.
>
> localhost:/usr/src/linux$ spatch -debug -show_trying -sp_file
> /usr/src/spatch/const_field2.spatch -all_includes
> drivers/video/sis/initextlfb.c
> init_defs_builtins: /usr/share/coccinelle/standard.h
> -----------------------------------------------------------------------
> processing semantic patch file: /usr/src/spatch/const_field2.spatch
> with isos from: /usr/share/coccinelle/standard.iso
> -----------------------------------------------------------------------
> // <smpl>
> @r@
> identifier I1, I2, x;
> @@
> struct I1 {
> ...
> const struct I2 *x;
> ...
> };
> @s@
> identifier r.I1, y;
> identifier r.x, E;
> @@
> struct I1 y = {
> .x = E,
> };
> @c@
> identifier r.I2;
> identifier s.E;
> @@
> const struct I2 E[] = ... ;
> @depends on !c@
> identifier r.I2;
> identifier s.E;
> @@
> + const
> struct I2 E[] = ...;
> // </smpl>
>
> HANDLING: drivers/video/sis/initextlfb.c
> -----------------------------------------------------------------------
> let's go
> -----------------------------------------------------------------------
> parse error
> = error in include/linux/types.h; set verbose_parsing for more info
> badcount: 3
> bad: #ifdef __KERNEL__
> bad:
> bad: #define DECLARE_BITMAP(name,bits) \
> BAD:!!!!! unsigned long name[BITS_TO_LONGS(bits)]
> CFG: orphelin nodes, maybe something weird happened
> CFG: orphelin nodes, maybe something weird happened
> -----------------------------------------------------------------------
> r =
> -----------------------------------------------------------------------
> dependencies for rule r satisfied:
> binding in = []
> binding relevant in = []
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying variable SISIOADDRESS
> trying something else
> trying something else
> trying variable IOADDRESS
> trying variable SISIOADDRESS
> trying variable SISIOADDRESS
> trying variable SIS_CHIP_TYPE
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> (ONCE) PB: More that one variable in decl. Have to split
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
> trying something else
>
> And here no more lines are printed but the processing does not finish.
>
> > From your semantic patch, I don't see what should cause an infinite loop.
> > But it may be hitting a file that is very hard to parse, and so it is
> > getting stuck there. There are some firmware files, I think, that pose
> > problems for parsing. It should be printing out HANDLING messages that
> > let you know what file is posing problems. You may also want to unlimit
> > your stack size.
>
> Interesting thing is when I specify the -show_SP option an error message
> is printed and the processing stops:
>
> $ spatch -show_SP -sp_file /usr/src/spatch/const_field2.spatch -all_includes
> drivers/video/sis/initextlfb.c
> init_defs_builtins: /usr/share/coccinelle/standard.h
> @@
> r
> @@
>
>
> (
> struct r:I1 {...
> const struct r:I2 *r:x;
> ...};
> |
> struct r:I1 {...
> const struct r:I2 *r:x = r:_C_0;
> ...};
> |
> struct r:I1 {...
> const struct r:I2 *r:x = ...;
> ...};
> )
> @@
> s
> @@
>
> struct r:I1 s:y = {.r:x = s:E,
> };
> @@
> c
> @@
>
> Fatal error: exception Failure("complex array types not supported")
>
> Regards,
>
> Márton Németh
>
> _______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)