On Mon, 10 Oct 2016, Nikolaus Rath wrote:
> On Oct 10 2016, Julia Lawall <[email protected]> wrote:
> >> I claimed success too early. There are still the following cases left:
> >>
> >>
> >> static void do_destroy(fuse_req_t req, fuse_ino_t nodeid, const void
> >> *inarg)
> >> {
> >> struct fuse_session *f = req->se;
> >> [....]
> >>
> >> I tried to adapt the rules myself as follows:
> >>
> >> @@
> >> symbol f, se;
> >> @@
> >> struct fuse_session *
> >> -f
> >> +se
> >> ;
> >> <...
> >> -f
> >> +se
> >> ...>
> >>
> >> @@
> >> symbol f, se;
> >> expression expr;
> >> @@
> >> struct fuse_session *
> >> -f
> >> +se
> >> = expr;
> >> <...
> >> -f
> >> +se
> >> ...>
> >>
> >>
> >> @@
> >> identifier fn;
> >> @@
> >> fn(...,struct fuse_session *
> >> -f
> >> +se
> >> ,...) { <...
> >> -f
> >> +se
> >> ...> }
> >>
> >>
> >> But this gives an error:
> >>
> >>
> >> Fatal error: exception Failure("meta: parse error:
> >> = File "se-rename.cocci", line 14, column 7, charpos = 79
> >> around = 'f', whole content = symbol f, se;
> >> ")
> >>
> >>
> >> What am I doing wrong?
> >
> > What version of Coccinelle are you using? Before 1.0.6, it was not
> > possible to declare something to be a symbol more than once. In any case,
> > once it is declared as a symbol, it is always a symbol.
>
> Ok, we're getting there. I've removed the second 'symbol' line, and
> (permanently) updated to 1.0.6. However, now it seems to simply run
> forever:
>
> $ ../coccinelle-1.0.6/spatch.opt --sp-file
> ~/in-progress/libfuse/se-rename.cocci --in-place lib/ include/ test/ example/
> util/
> init_defs_builtins: /home/nikratio/tmp/coccinelle-1.0.6/standard.h
> warning: patch output can only be created when only one
> directory is specified or when the -patch flag is used
> HANDLING: lib/fuse.c
> (ONCE) Expected tokens fuse_session f
> Skipping:lib/fuse_opt.c
> HANDLING: lib/helper.c
> Skipping:lib/mount_bsd.c
> Skipping:lib/fuse_loop_mt.c
> Skipping:lib/fuse_loop.c
> HANDLING: lib/cuse_lowlevel.c
> diff =
> [...]
> HANDLING: lib/fuse_lowlevel.c
>
> At this point it has been hanging for about 15 minutes now, steady
> eating CPU time.
>
> Is it supposed to take that long? The fuse_lowlevel.c file is 74k with
> 2465 lines of code.
You can use --show-trying to see what function it is getting stuck on. If
the function has a lot of ifs and loops, it may indeed take a long
time. ... follows possible paths in the execution graph and a sequence of
ifs makes the number of paths grow exponentially.
A solution is to add a timeout, eg --timeout 120 (120 seconds). You will
need to check a file on which there is a timeout manually.
Tracing paths around loops is not really relevant in your case, so you can
also safely use the option --no-loops, which will avoid taking the back
edges.
julia
>
> Best,
> -Nikolaus
>
> --
> GPG encrypted emails preferred. Key id: 0xD113FCAC3C4E599F
> Fingerprint: ED31 791B 2C5C 1613 AF38 8B8A D113 FCAC 3C4E 599F
>
> »Time flies like an arrow, fruit flies like a Banana.«
> _______________________________________________
> Cocci mailing list
> [email protected]
> https://systeme.lip6.fr/mailman/listinfo/cocci
>_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci