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

Reply via email to