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)

Reply via email to