diff options
Diffstat (limited to 'kernel/scripts/coccinelle')
-rw-r--r-- | kernel/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci | 84 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/api/platform_no_drv_owner.cocci | 73 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/api/pm_runtime.cocci | 2 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/api/simple_open.cocci | 4 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/api/vma_pages.cocci | 60 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/free/ifnullfree.cocci | 26 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/iterators/device_node_continue.cocci | 100 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/misc/compare_const_fl.cocci | 171 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/misc/ifaddr.cocci | 3 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/misc/irqf_oneshot.cocci | 7 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/misc/of_table.cocci | 33 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/misc/returnvar.cocci | 2 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/misc/semicolon.cocci | 2 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/misc/simple_return.cocci | 180 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/null/deref_null.cocci | 4 | ||||
-rw-r--r-- | kernel/scripts/coccinelle/tests/odd_ptr_err.cocci | 120 |
16 files changed, 630 insertions, 241 deletions
diff --git a/kernel/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci b/kernel/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci new file mode 100644 index 000000000..9b7eb321a --- /dev/null +++ b/kernel/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci @@ -0,0 +1,84 @@ +/// +/// Use *_pool_zalloc rather than *_pool_alloc followed by memset with 0 +/// +// Copyright: (C) 2015 Intel Corp. GPLv2. +// Options: --no-includes --include-headers +// +// Keywords: dma_pool_zalloc, pci_pool_zalloc +// + +virtual context +virtual patch +virtual org +virtual report + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@depends on context@ +expression x; +statement S; +@@ + +* x = \(dma_pool_alloc\|pci_pool_alloc\)(...); + if ((x==NULL) || ...) S +* memset(x,0, ...); + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@depends on patch@ +expression x; +expression a,b,c; +statement S; +@@ + +- x = dma_pool_alloc(a,b,c); ++ x = dma_pool_zalloc(a,b,c); + if ((x==NULL) || ...) S +- memset(x,0,...); + +@depends on patch@ +expression x; +expression a,b,c; +statement S; +@@ + +- x = pci_pool_alloc(a,b,c); ++ x = pci_pool_zalloc(a,b,c); + if ((x==NULL) || ...) S +- memset(x,0,...); + +//---------------------------------------------------------- +// For org and report mode +//---------------------------------------------------------- + +@r depends on org || report@ +expression x; +expression a,b,c; +statement S; +position p; +@@ + + x = @p\(dma_pool_alloc\|pci_pool_alloc\)(a,b,c); + if ((x==NULL) || ...) S + memset(x,0, ...); + +@script:python depends on org@ +p << r.p; +x << r.x; +@@ + +msg="%s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) + +@script:python depends on report@ +p << r.p; +x << r.x; +@@ + +msg="WARNING: *_pool_zalloc should be used for %s, instead of *_pool_alloc/memset" % (x) +coccilib.report.print_report(p[0], msg) diff --git a/kernel/scripts/coccinelle/api/platform_no_drv_owner.cocci b/kernel/scripts/coccinelle/api/platform_no_drv_owner.cocci index e065b9e71..c5e3f73f2 100644 --- a/kernel/scripts/coccinelle/api/platform_no_drv_owner.cocci +++ b/kernel/scripts/coccinelle/api/platform_no_drv_owner.cocci @@ -9,11 +9,14 @@ virtual org virtual report @match1@ +declarer name module_i2c_driver; declarer name module_platform_driver; declarer name module_platform_driver_probe; identifier __driver; @@ ( + module_i2c_driver(__driver); +| module_platform_driver(__driver); | module_platform_driver_probe(__driver, ...); @@ -28,6 +31,15 @@ identifier match1.__driver; } }; +@fix1_i2c depends on match1 && patch && !context && !org && !report@ +identifier match1.__driver; +@@ + static struct i2c_driver __driver = { + .driver = { +- .owner = THIS_MODULE, + } + }; + @match2@ identifier __driver; @@ @@ -37,6 +49,8 @@ identifier __driver; platform_driver_probe(&__driver, ...) | platform_create_bundle(&__driver, ...) +| + i2c_add_driver(&__driver) ) @fix2 depends on match2 && patch && !context && !org && !report@ @@ -48,6 +62,15 @@ identifier match2.__driver; } }; +@fix2_i2c depends on match2 && patch && !context && !org && !report@ +identifier match2.__driver; +@@ + static struct i2c_driver __driver = { + .driver = { +- .owner = THIS_MODULE, + } + }; + // ---------------------------------------------------------------------------- @fix1_context depends on match1 && !patch && (context || org || report)@ @@ -61,6 +84,17 @@ position j0; } }; +@fix1_i2c_context depends on match1 && !patch && (context || org || report)@ +identifier match1.__driver; +position j0; +@@ + + static struct i2c_driver __driver = { + .driver = { +* .owner@j0 = THIS_MODULE, + } + }; + @fix2_context depends on match2 && !patch && (context || org || report)@ identifier match2.__driver; position j0; @@ -72,6 +106,17 @@ position j0; } }; +@fix2_i2c_context depends on match2 && !patch && (context || org || report)@ +identifier match2.__driver; +position j0; +@@ + + static struct i2c_driver __driver = { + .driver = { +* .owner@j0 = THIS_MODULE, + } + }; + // ---------------------------------------------------------------------------- @script:python fix1_org depends on org@ @@ -81,6 +126,13 @@ j0 << fix1_context.j0; msg = "No need to set .owner here. The core will do it." coccilib.org.print_todo(j0[0], msg) +@script:python fix1_i2c_org depends on org@ +j0 << fix1_i2c_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.org.print_todo(j0[0], msg) + @script:python fix2_org depends on org@ j0 << fix2_context.j0; @@ @@ -88,6 +140,13 @@ j0 << fix2_context.j0; msg = "No need to set .owner here. The core will do it." coccilib.org.print_todo(j0[0], msg) +@script:python fix2_i2c_org depends on org@ +j0 << fix2_i2c_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.org.print_todo(j0[0], msg) + // ---------------------------------------------------------------------------- @script:python fix1_report depends on report@ @@ -97,6 +156,13 @@ j0 << fix1_context.j0; msg = "No need to set .owner here. The core will do it." coccilib.report.print_report(j0[0], msg) +@script:python fix1_i2c_report depends on report@ +j0 << fix1_i2c_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.report.print_report(j0[0], msg) + @script:python fix2_report depends on report@ j0 << fix2_context.j0; @@ @@ -104,3 +170,10 @@ j0 << fix2_context.j0; msg = "No need to set .owner here. The core will do it." coccilib.report.print_report(j0[0], msg) +@script:python fix2_i2c_report depends on report@ +j0 << fix2_i2c_context.j0; +@@ + +msg = "No need to set .owner here. The core will do it." +coccilib.report.print_report(j0[0], msg) + diff --git a/kernel/scripts/coccinelle/api/pm_runtime.cocci b/kernel/scripts/coccinelle/api/pm_runtime.cocci index f01789e96..b7042d074 100644 --- a/kernel/scripts/coccinelle/api/pm_runtime.cocci +++ b/kernel/scripts/coccinelle/api/pm_runtime.cocci @@ -1,5 +1,5 @@ /// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE -// +/// // Keywords: pm_runtime // Confidence: Medium // Copyright (C) 2013 Texas Instruments Incorporated - GPLv2. diff --git a/kernel/scripts/coccinelle/api/simple_open.cocci b/kernel/scripts/coccinelle/api/simple_open.cocci index b67e174f3..bd1a2a4ee 100644 --- a/kernel/scripts/coccinelle/api/simple_open.cocci +++ b/kernel/scripts/coccinelle/api/simple_open.cocci @@ -1,5 +1,5 @@ -/// This removes an open coded simple_open() function -/// and replaces file operations references to the function +/// Remove an open coded simple_open() function +/// and replace file operations references to the function /// with simple_open() instead. /// // Confidence: High diff --git a/kernel/scripts/coccinelle/api/vma_pages.cocci b/kernel/scripts/coccinelle/api/vma_pages.cocci new file mode 100644 index 000000000..3e52e11ea --- /dev/null +++ b/kernel/scripts/coccinelle/api/vma_pages.cocci @@ -0,0 +1,60 @@ +/// +/// Use vma_pages function on vma object instead of explicit computation. +/// +// Confidence: High +// Keywords: vma_pages vma +// Comment: Based on resource_size.cocci + +virtual context +virtual patch +virtual org +virtual report + +//---------------------------------------------------------- +// For context mode +//---------------------------------------------------------- + +@r_context depends on context && !patch && !org && !report@ +struct vm_area_struct *vma; +@@ + +* (vma->vm_end - vma->vm_start) >> PAGE_SHIFT + +//---------------------------------------------------------- +// For patch mode +//---------------------------------------------------------- + +@r_patch depends on !context && patch && !org && !report@ +struct vm_area_struct *vma; +@@ + +- ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) ++ vma_pages(vma) + +//---------------------------------------------------------- +// For org mode +//---------------------------------------------------------- + +@r_org depends on !context && !patch && (org || report)@ +struct vm_area_struct *vma; +position p; +@@ + + (vma->vm_end@p - vma->vm_start) >> PAGE_SHIFT + +@script:python depends on report@ +p << r_org.p; +x << r_org.vma; +@@ + +msg="WARNING: Consider using vma_pages helper on %s" % (x) +coccilib.report.print_report(p[0], msg) + +@script:python depends on org@ +p << r_org.p; +x << r_org.vma; +@@ + +msg="WARNING: Consider using vma_pages helper on %s" % (x) +msg_safe=msg.replace("[","@(").replace("]",")") +coccilib.org.print_todo(p[0], msg_safe) diff --git a/kernel/scripts/coccinelle/free/ifnullfree.cocci b/kernel/scripts/coccinelle/free/ifnullfree.cocci index a42d70bf8..52bd23528 100644 --- a/kernel/scripts/coccinelle/free/ifnullfree.cocci +++ b/kernel/scripts/coccinelle/free/ifnullfree.cocci @@ -16,19 +16,21 @@ virtual context @r2 depends on patch@ expression E; @@ -- if (E) +- if (E != NULL) ( -- kfree(E); -+ kfree(E); + kfree(E); | -- debugfs_remove(E); -+ debugfs_remove(E); + debugfs_remove(E); | -- debugfs_remove_recursive(E); -+ debugfs_remove_recursive(E); + debugfs_remove_recursive(E); | -- usb_free_urb(E); -+ usb_free_urb(E); + usb_free_urb(E); +| + kmem_cache_destroy(E); +| + mempool_destroy(E); +| + dma_pool_destroy(E); ) @r depends on context || report || org @ @@ -36,8 +38,10 @@ expression E; position p; @@ -* if (E) -* \(kfree@p\|debugfs_remove@p\|debugfs_remove_recursive@p\|usb_free_urb\)(E); +* if (E != NULL) +* \(kfree@p\|debugfs_remove@p\|debugfs_remove_recursive@p\| +* usb_free_urb@p\|kmem_cache_destroy@p\|mempool_destroy@p\| +* dma_pool_destroy@p\)(E); @script:python depends on org@ p << r.p; diff --git a/kernel/scripts/coccinelle/iterators/device_node_continue.cocci b/kernel/scripts/coccinelle/iterators/device_node_continue.cocci new file mode 100644 index 000000000..38ab744a4 --- /dev/null +++ b/kernel/scripts/coccinelle/iterators/device_node_continue.cocci @@ -0,0 +1,100 @@ +/// Device node iterators put the previous value of the index variable, so an +/// explicit put causes a double put. +/// +// Confidence: High +// Copyright: (C) 2015 Julia Lawall, Inria. GPLv2. +// URL: http://coccinelle.lip6.fr/ +// Options: --no-includes --include-headers +// Keywords: for_each_child_of_node, etc. + +virtual patch +virtual context +virtual org +virtual report + +@r exists@ +expression e1,e2; +local idexpression n; +iterator name for_each_node_by_name, for_each_node_by_type, +for_each_compatible_node, for_each_matching_node, +for_each_matching_node_and_match, for_each_child_of_node, +for_each_available_child_of_node, for_each_node_with_property; +iterator i; +position p1,p2; +statement S; +@@ + +( +( +for_each_node_by_name(n,e1) S +| +for_each_node_by_type(n,e1) S +| +for_each_compatible_node(n,e1,e2) S +| +for_each_matching_node(n,e1) S +| +for_each_matching_node_and_match(n,e1,e2) S +| +for_each_child_of_node(e1,n) S +| +for_each_available_child_of_node(e1,n) S +| +for_each_node_with_property(n,e1) S +) +& +i@p1(...) { + ... when != of_node_get(n) + when any + of_node_put@p2(n); + ... when any +} +) + +@s exists@ +local idexpression r.n; +statement S; +position r.p1,r.p2; +iterator i; +@@ + + of_node_put@p2(n); + ... when any + i@p1(..., n, ...) + S + +@t depends on s && patch && !context && !org && !report@ +local idexpression n; +position r.p2; +@@ + +- of_node_put@p2(n); + +// ---------------------------------------------------------------------------- + +@t_context depends on s && !patch && (context || org || report)@ +local idexpression n; +position r.p2; +position j0; +@@ + +* of_node_put@j0@p2(n); + +// ---------------------------------------------------------------------------- + +@script:python t_org depends on org@ +j0 << t_context.j0; +@@ + +msg = "ERROR: probable double put." +coccilib.org.print_todo(j0[0], msg) + +// ---------------------------------------------------------------------------- + +@script:python t_report depends on report@ +j0 << t_context.j0; +@@ + +msg = "ERROR: probable double put." +coccilib.report.print_report(j0[0], msg) + diff --git a/kernel/scripts/coccinelle/misc/compare_const_fl.cocci b/kernel/scripts/coccinelle/misc/compare_const_fl.cocci new file mode 100644 index 000000000..b5d4bab60 --- /dev/null +++ b/kernel/scripts/coccinelle/misc/compare_const_fl.cocci @@ -0,0 +1,171 @@ +/// Move constants to the right of binary operators. +//# Depends on personal taste in some cases. +/// +// Confidence: Moderate +// Copyright: (C) 2015 Copyright: (C) 2015 Julia Lawall, Inria. GPLv2. +// URL: http://coccinelle.lip6.fr/ +// Options: --no-includes --include-headers + +virtual patch +virtual context +virtual org +virtual report + +@r1 depends on patch && !context && !org && !report + disable bitor_comm, neg_if_exp@ +constant c,c1; +local idexpression i; +expression e,e1,e2; +binary operator b = {==,!=,&,|}; +type t; +@@ + +( +c b (c1) +| +sizeof(t) b e1 +| +sizeof e b e1 +| +i b e1 +| +c | e1 | e2 | ... +| +c | (e ? e1 : e2) +| +- c ++ e +b +- e ++ c +) + +@r2 depends on patch && !context && !org && !report + disable gtr_lss, gtr_lss_eq, not_int2@ +constant c,c1; +expression e,e1,e2; +binary operator b; +binary operator b1 = {<,<=},b2 = {<,<=}; +binary operator b3 = {>,>=},b4 = {>,>=}; +local idexpression i; +type t; +@@ + +( +c b c1 +| +sizeof(t) b e1 +| +sizeof e b e1 +| + (e1 b1 e) && (e b2 e2) +| + (e1 b3 e) && (e b4 e2) +| +i b e +| +- c < e ++ e > c +| +- c <= e ++ e >= c +| +- c > e ++ e < c +| +- c >= e ++ e <= c +) + +// ---------------------------------------------------------------------------- + +@r1_context depends on !patch && (context || org || report) + disable bitor_comm, neg_if_exp exists@ +type t; +binary operator b = {==,!=,&,|}; +constant c, c1; +expression e, e1, e2; +local idexpression i; +position j0; +@@ + +( +c b (c1) +| +sizeof(t) b e1 +| +sizeof e b e1 +| +i b e1 +| +c | e1 | e2 | ... +| +c | (e ? e1 : e2) +| +* c@j0 b e +) + +@r2_context depends on !patch && (context || org || report) + disable gtr_lss, gtr_lss_eq, not_int2 exists@ +type t; +binary operator b, b1 = {<,<=}, b2 = {<,<=}, b3 = {>,>=}, b4 = {>,>=}; +constant c, c1; +expression e, e1, e2; +local idexpression i; +position j0; +@@ + +( +c b c1 +| +sizeof(t) b e1 +| +sizeof e b e1 +| + (e1 b1 e) && (e b2 e2) +| + (e1 b3 e) && (e b4 e2) +| +i b e +| +* c@j0 < e +| +* c@j0 <= e +| +* c@j0 > e +| +* c@j0 >= e +) + +// ---------------------------------------------------------------------------- + +@script:python r1_org depends on org@ +j0 << r1_context.j0; +@@ + +msg = "Move constant to right." +coccilib.org.print_todo(j0[0], msg) + +@script:python r2_org depends on org@ +j0 << r2_context.j0; +@@ + +msg = "Move constant to right." +coccilib.org.print_todo(j0[0], msg) + +// ---------------------------------------------------------------------------- + +@script:python r1_report depends on report@ +j0 << r1_context.j0; +@@ + +msg = "Move constant to right." +coccilib.report.print_report(j0[0], msg) + +@script:python r2_report depends on report@ +j0 << r2_context.j0; +@@ + +msg = "Move constant to right." +coccilib.report.print_report(j0[0], msg) + diff --git a/kernel/scripts/coccinelle/misc/ifaddr.cocci b/kernel/scripts/coccinelle/misc/ifaddr.cocci index 8aebd1875..c2663c677 100644 --- a/kernel/scripts/coccinelle/misc/ifaddr.cocci +++ b/kernel/scripts/coccinelle/misc/ifaddr.cocci @@ -1,5 +1,4 @@ -/// the address of a variable or field is non-zero is likely always to bo -/// non-zero +/// The address of a variable or field is likely always to be non-zero. /// // Confidence: High // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. diff --git a/kernel/scripts/coccinelle/misc/irqf_oneshot.cocci b/kernel/scripts/coccinelle/misc/irqf_oneshot.cocci index a24a754ae..b421150a2 100644 --- a/kernel/scripts/coccinelle/misc/irqf_oneshot.cocci +++ b/kernel/scripts/coccinelle/misc/irqf_oneshot.cocci @@ -1,5 +1,8 @@ -/// Make sure threaded IRQs without a primary handler are always request with -/// IRQF_ONESHOT +/// Since commit 1c6c69525b40 ("genirq: Reject bogus threaded irq requests") +/// threaded IRQs without a primary handler need to be requested with +/// IRQF_ONESHOT, otherwise the request will fail. +/// +/// So pass the IRQF_ONESHOT flag in this case. /// // // Confidence: Good diff --git a/kernel/scripts/coccinelle/misc/of_table.cocci b/kernel/scripts/coccinelle/misc/of_table.cocci index 3c934046a..2294915a1 100644 --- a/kernel/scripts/coccinelle/misc/of_table.cocci +++ b/kernel/scripts/coccinelle/misc/of_table.cocci @@ -1,6 +1,6 @@ -/// Make sure of_device_id tables are NULL terminated +/// Make sure (of/i2c/platform)_device_id tables are NULL terminated // -// Keywords: of_table +// Keywords: of_table i2c_table platform_table // Confidence: Medium // Options: --include-headers @@ -13,18 +13,26 @@ virtual report identifier var, arr; expression E; @@ -struct of_device_id arr[] = { +( +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { ..., { .var = E, * } }; +| +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., +* { ..., E, ... }, +}; +) @depends on patch@ identifier var, arr; expression E; @@ -struct of_device_id arr[] = { +( +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { ..., { .var = E, @@ -32,19 +40,34 @@ struct of_device_id arr[] = { + }, + { } }; +| +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., + { ..., E, ... }, ++ { }, +}; +) @r depends on org || report@ position p1; identifier var, arr; expression E; @@ -struct of_device_id arr[] = { +( +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { ..., { .var = E, } @p1 }; +| +struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = { + ..., + { ..., E, ... } + @p1 +}; +) @script:python depends on org@ p1 << r.p1; diff --git a/kernel/scripts/coccinelle/misc/returnvar.cocci b/kernel/scripts/coccinelle/misc/returnvar.cocci index 605955a91..d8286ef53 100644 --- a/kernel/scripts/coccinelle/misc/returnvar.cocci +++ b/kernel/scripts/coccinelle/misc/returnvar.cocci @@ -1,5 +1,5 @@ /// -/// Removes unneeded variable used to store return value. +/// Remove unneeded variable used to store return value. /// // Confidence: Moderate // Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. GPLv2. diff --git a/kernel/scripts/coccinelle/misc/semicolon.cocci b/kernel/scripts/coccinelle/misc/semicolon.cocci index a47eba2ed..6740c659a 100644 --- a/kernel/scripts/coccinelle/misc/semicolon.cocci +++ b/kernel/scripts/coccinelle/misc/semicolon.cocci @@ -1,5 +1,5 @@ /// -/// Removes unneeded semicolon. +/// Remove unneeded semicolon. /// // Confidence: Moderate // Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. GPLv2. diff --git a/kernel/scripts/coccinelle/misc/simple_return.cocci b/kernel/scripts/coccinelle/misc/simple_return.cocci deleted file mode 100644 index 47f7084b6..000000000 --- a/kernel/scripts/coccinelle/misc/simple_return.cocci +++ /dev/null @@ -1,180 +0,0 @@ -/// Simplify a trivial if-return sequence. Possibly combine with a -/// preceding function call. -// -// Confidence: High -// Copyright: (C) 2014 Julia Lawall, INRIA/LIP6. GPLv2. -// Copyright: (C) 2014 Gilles Muller, INRIA/LiP6. GPLv2. -// URL: http://coccinelle.lip6.fr/ -// Comments: -// Options: --no-includes --include-headers - -virtual patch -virtual context -virtual org -virtual report - -@r depends on patch@ -local idexpression e; -identifier i,f,fn; -@@ - -fn(...) { <... -- e@i = -+ return - f(...); --if (i != 0) return i; --return 0; -...> } - -@depends on patch@ -identifier r.i; -type t; -@@ - --t i; - ... when != i - -@depends on patch@ -expression e; -@@ - --if (e != 0) - return e; --return 0; - -// ----------------------------------------------------------------------- - -@s1 depends on context || org || report@ -local idexpression e; -identifier i,f,fn; -position p,p1,p2; -@@ - -fn(...) { <... -* e@i@p = f(...); - if (\(i@p1 != 0\|i@p2 < 0\)) - return i; - return 0; -...> } - -@s2 depends on context || org || report forall@ -identifier s1.i; -type t; -position q,s1.p; -expression e,f; -@@ - -* t i@q; - ... when != i - e@p = f(...); - -@s3 depends on context || org || report@ -expression e; -position p1!=s1.p1; -position p2!=s1.p2; -@@ - -*if (\(e@p1 != 0\|e@p2 < 0\)) - return e; - return 0; - -// ----------------------------------------------------------------------- - -@script:python depends on org@ -p << s1.p; -p1 << s1.p1; -q << s2.q; -@@ - -cocci.print_main("decl",q) -cocci.print_secs("use",p) -cocci.include_match(False) - -@script:python depends on org@ -p << s1.p; -p2 << s1.p2; -q << s2.q; -@@ - -cocci.print_main("decl",q) -cocci.print_secs("use with questionable test",p) -cocci.include_match(False) - -@script:python depends on org@ -p << s1.p; -p1 << s1.p1; -@@ - -cocci.print_main("use",p) - -@script:python depends on org@ -p << s1.p; -p2 << s1.p2; -@@ - -cocci.print_main("use with questionable test",p) - -@script:python depends on org@ -p << s3.p1; -@@ - -cocci.print_main("test",p) - -@script:python depends on org@ -p << s3.p2; -@@ - -cocci.print_main("questionable test",p) - -// ----------------------------------------------------------------------- - -@script:python depends on report@ -p << s1.p; -p1 << s1.p1; -q << s2.q; -@@ - -msg = "WARNING: end returns can be simpified and declaration on line %s can be dropped" % (q[0].line) -coccilib.report.print_report(p[0],msg) -cocci.include_match(False) - -@script:python depends on report@ -p << s1.p; -p1 << s1.p1; -q << s2.q -; -@@ - -msg = "WARNING: end returns may be simpified if negative or 0 value and declaration on line %s can be dropped" % (q[0].line) -coccilib.report.print_report(p[0],msg) -cocci.include_match(False) - -@script:python depends on report@ -p << s1.p; -p1 << s1.p1; -@@ - -msg = "WARNING: end returns can be simpified" -coccilib.report.print_report(p[0],msg) - -@script:python depends on report@ -p << s1.p; -p2 << s1.p2; -@@ - -msg = "WARNING: end returns can be simpified if negative or 0 value" -coccilib.report.print_report(p[0],msg) - -@script:python depends on report@ -p << s3.p1; -@@ - -msg = "WARNING: end returns can be simpified" -coccilib.report.print_report(p[0],msg) - -@script:python depends on report@ -p << s3.p2; -@@ - -msg = "WARNING: end returns can be simpified if tested value is negative or 0" -coccilib.report.print_report(p[0],msg) diff --git a/kernel/scripts/coccinelle/null/deref_null.cocci b/kernel/scripts/coccinelle/null/deref_null.cocci index cdac6cfcc..f192d6035 100644 --- a/kernel/scripts/coccinelle/null/deref_null.cocci +++ b/kernel/scripts/coccinelle/null/deref_null.cocci @@ -1,6 +1,6 @@ /// -/// A variable is dereference under a NULL test. -/// Even though it is know to be NULL. +/// A variable is dereferenced under a NULL test. +/// Even though it is known to be NULL. /// // Confidence: Moderate // Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. diff --git a/kernel/scripts/coccinelle/tests/odd_ptr_err.cocci b/kernel/scripts/coccinelle/tests/odd_ptr_err.cocci index cfe0a35cf..dfc6b40c2 100644 --- a/kernel/scripts/coccinelle/tests/odd_ptr_err.cocci +++ b/kernel/scripts/coccinelle/tests/odd_ptr_err.cocci @@ -1,12 +1,11 @@ /// PTR_ERR should access the value just tested by IS_ERR -//# There can be false positives in the patch case, where it is the call +//# There can be false positives in the patch case, where it is the call to //# IS_ERR that is wrong. /// // Confidence: High -// Copyright: (C) 2012 Julia Lawall, INRIA. GPLv2. -// Copyright: (C) 2012 Gilles Muller, INRIA. GPLv2. +// Copyright: (C) 2012, 2015 Julia Lawall, INRIA. GPLv2. +// Copyright: (C) 2012, 2015 Gilles Muller, INRIA. GPLv2. // URL: http://coccinelle.lip6.fr/ -// Comments: // Options: --no-includes --include-headers virtual patch @@ -14,52 +13,105 @@ virtual context virtual org virtual report -@depends on patch@ -expression e,e1; +@ok1 exists@ +expression x,e; +position p; @@ +if (IS_ERR(x=e) || ...) { + <... + PTR_ERR@p(x) + ...> +} + +@ok2 exists@ +expression x,e1,e2; +position p; +@@ + +if (IS_ERR(x) || ...) { + <... ( -if (IS_ERR(e)) { ... PTR_ERR(e) ... } + PTR_ERR@p(\(e1 ? e2 : x\|e1 ? x : e2\)) | -if (IS_ERR(e=e1)) { ... PTR_ERR(e) ... } + PTR_ERR@p(x) +) + ...> +} + +@r1 depends on patch && !context && !org && !report exists@ +expression x,y; +position p != {ok1.p,ok2.p}; +@@ + +if (IS_ERR(x) || ...) { + ... when any + when != IS_ERR(...) +( + PTR_ERR(x) | -if (IS_ERR(e)) - { ... - PTR_ERR( -- e1 -+ e + PTR_ERR@p( +- y ++ x ) - ... } ) + ... when any +} + +// ---------------------------------------------------------------------------- -@r depends on !patch@ -expression e,e1; -position p1,p2; +@r1_context depends on !patch && (context || org || report) exists@ +position p != {ok1.p,ok2.p}; +expression x, y; +position j0, j1; @@ +if (IS_ERR@j0(x) || ...) { + ... when any + when != IS_ERR(...) ( -if (IS_ERR(e)) { ... PTR_ERR(e) ... } + PTR_ERR(x) | -if (IS_ERR(e=e1)) { ... PTR_ERR(e) ... } -| -*if (IS_ERR@p1(e)) - { ... -* PTR_ERR@p2(e1) - ... } + PTR_ERR@j1@p( + y + ) ) + ... when any +} -@script:python depends on org@ -p1 << r.p1; -p2 << r.p2; +@r1_disj depends on !patch && (context || org || report) exists@ +position p != {ok1.p,ok2.p}; +expression x, y; +position r1_context.j0, r1_context.j1; @@ -cocci.print_main("inconsistent IS_ERR and PTR_ERR",p1) -cocci.print_secs("PTR_ERR",p2) +* if (IS_ERR@j0(x) || ...) { + ... when any + when != IS_ERR(...) +* PTR_ERR@j1@p( + y + ) + ... when any +} -@script:python depends on report@ -p1 << r.p1; -p2 << r.p2; +// ---------------------------------------------------------------------------- + +@script:python r1_org depends on org@ +j0 << r1_context.j0; +j1 << r1_context.j1; @@ -msg = "inconsistent IS_ERR and PTR_ERR, PTR_ERR on line %s" % (p2[0].line) -coccilib.report.print_report(p1[0],msg) +msg = "inconsistent IS_ERR and PTR_ERR" +coccilib.org.print_todo(j0[0], msg) +coccilib.org.print_link(j1[0], "") + +// ---------------------------------------------------------------------------- + +@script:python r1_report depends on report@ +j0 << r1_context.j0; +j1 << r1_context.j1; +@@ + +msg = "inconsistent IS_ERR and PTR_ERR on line %s." % (j1[0].line) +coccilib.report.print_report(j0[0], msg) + |