On Wed, Sep 09, 2015 at 07:24:42AM +0200, Julia Lawall wrote:
>
> Including header files with C files is only useful for acquiring type
> information. You don't care about that for your rules, so you would be
> better off with --no-includes. On the oter hand if your patterns occur in
> header files you want them to be processed. For that, add the command
> line --include-headers.
Ack. --include-headers does the trick for me.
> The point is that including header files can drastically increase the code
> size, and header files can be difficult to parse, due to
> #ifdefs etc, so overall including more than necessary can increase the
> running time a lot.
On that note, it might make sense to add multithreading or
multiprocessing. My kernel tree has roughly 35000 files, so splitting
the work shouldn't be much of a problem. And given the processing
times, it appears as if a 6-fold speed up should be possible on my aging
notebook - more on bigger machines.
real 0m35.226s
user 0m19.320s
sys 0m2.736s
I have done similar stuff to grep. tgrep is a python wrapper around
regular grep and can give a 48x speedup on a beefy machine we have.
Of course if ocaml has multithreading support, that is likely a nicer
solution than a python wrapper.
> > arch/mips/mm/fault.c seems to have a problem with one of the
> > conditionals. I could reduce things to the following testcase:
> >
> > void foo(unsigned long address)
> > {
> > down_read(&mm->mmap_sem);
> > vma = find_vma(current->mm, address);
> > if (!vma)
> > goto bad_area;
> > if (vma->vm_start <= address)
> > goto good_area;
> > if (!(vma->vm_flags & VM_GROWSDOWN))
> > goto bad_area;
> > if (expand_stack(vma, address))
> > goto bad_area;
> > bad_area:
> > up_read(&mm->mmap_sem);
> > }
> >
> > Remove the "!(vma->vm_flags & VM_GROWSDOWN)" condition and it works.
> > Leave the condition and spatch fails silently.
>
> There is probably a parsing problem. By default Coccinelle doesn't report
> these, because there are likely many of them, and most of them are likely
> not relevant to the code you want to process. You can see the parsing
> problems by running spatch --parse-c file.c. There may be quite a lot of
> output. At the end you will see a summary of how successful the parsing
> was. If it was somewhat not successful, you can look up fpr the line
> beginning with BAD to see where the problem is. The lines beginning with
> bad show the lines that were skipped due to the problem.
I tried that and didn't see anything helpful. Full output below.
init_defs_builtins: /usr/share/coccinelle/standard.h
init_defs: coccinelle.h
PARSING: arch/mips/mm/fault.c
(ONCE) CPP-commenting a #if 0 or #if LINUX_VERSION or __cplusplus
(ONCE) CPP-MACRO: found known macro = asmlinkage
(ONCE) CPP-MACRO: found known macro = __kprobes
(ONCE) CPP-MACRO: found known macro = __user
(ONCE) CPP-MACRO: found known macro = KERN_ALERT
passed:asmlinkage __kprobes
passed:#if 0
passed:printk ( "Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n" , raw_smp_processor_id ( ) ,
passed:current -> comm , current -> pid , field , address , write ,
passed:field , regs -> cp0_epc ) ;
passed:#endif
passed:#if 0
passed:pr_notice ( "Cpu%d[%s:%d:%0*lx:%ld:%0*lx] XI violation\n" ,
passed:raw_smp_processor_id ( ) ,
passed:current -> comm , current -> pid ,
passed:field , address , write ,
passed:field , regs -> cp0_epc ) ;
passed:#endif
passed:#if 0
passed:pr_notice ( "Cpu%d[%s:%d:%0*lx:%ld:%0*lx] RI violation\n" ,
passed:raw_smp_processor_id ( ) ,
passed:current -> comm , current -> pid ,
passed:field , address , write ,
passed:field , regs -> cp0_epc ) ;
passed:#endif
passed:#if 0
passed:printk ( "do_page_fault() #2: sending SIGSEGV to %s for "
passed:"invalid %s\n%0*lx (epc == %0*lx, ra == %0*lx)\n" ,
passed:tsk -> comm ,
passed:write ? "write access to" : "read access from" ,
passed:field , address ,
passed:field , ( unsigned long ) regs -> cp0_epc ,
passed:field , ( unsigned long ) regs -> regs [ 31 ] ) ;
passed:#endif
passed:__user
passed:#if 0
passed:printk ( "do_page_fault() #3: sending SIGBUS to %s for "
passed:"invalid %s\n%0*lx (epc == %0*lx, ra == %0*lx)\n" ,
passed:tsk -> comm ,
passed:write ? "write access to" : "read access from" ,
passed:field , address ,
passed:field , ( unsigned long ) regs -> cp0_epc ,
passed:field , ( unsigned long ) regs -> regs [ 31 ] ) ;
passed:#endif
passed:__user
-----------------------------------------------------------------------
maybe 10 most problematic tokens
-----------------------------------------------------------------------
-----------------------------------------------------------------------
NB total files = 1; perfect = 1; pbs = 0; timeout = 0; =========> 100%
nb good = 313, nb passed = 40 =========> 11.33% passed
nb good = 313, nb bad = 0 =========> 100.00% good or passed
Jörn
--
When people work hard for you for a pat on the back, you've got
to give them that pat.
-- Robert Heinlein
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci