Commit 5dfe5b2c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild

Pull misc kbuild updates from Michal Marek:
 "This is the non-critical part of kbuild:

   - several coccinelle updates
   - make deb-pkg creates an armhf package if CONFIG_VFP=y
   - make tags understands some more powerpc macros"

* 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  coccinelle: Improve checking for missing NULL terminators
  coccinelle: ifnullfree: handle various destroy functions
  coccinelle: ifnullfree: various cleanups
  cocinelle: iterators: semantic patch to delete unneeded of_node_put
  deb-pkg: Add automatic support for armhf architecture
  scripts/coccinelle: fix typos
  coccinelle: misc: remove "complex return code" warnings
  Coccinelle: fix incorrect -include option transformation
  coccinelle: tests: improve odd_ptr_err.cocci
  coccinelle: misc: move constants to the right
  scripts/tags.sh: Teach tags about some powerpc macros
parents 152813e6 67afc211
...@@ -30,7 +30,7 @@ FLAGS="$SPFLAGS --very-quiet" ...@@ -30,7 +30,7 @@ FLAGS="$SPFLAGS --very-quiet"
# spatch only allows include directories with the syntax "-I include" # spatch only allows include directories with the syntax "-I include"
# while gcc also allows "-Iinclude" and "-include include" # while gcc also allows "-Iinclude" and "-include include"
COCCIINCLUDE=${LINUXINCLUDE//-I/-I } COCCIINCLUDE=${LINUXINCLUDE//-I/-I }
COCCIINCLUDE=${COCCIINCLUDE//-include/-I} COCCIINCLUDE=${COCCIINCLUDE// -include/ --include}
if [ "$C" = "1" -o "$C" = "2" ]; then if [ "$C" = "1" -o "$C" = "2" ]; then
ONLINE=1 ONLINE=1
......
...@@ -16,19 +16,21 @@ virtual context ...@@ -16,19 +16,21 @@ virtual context
@r2 depends on patch@ @r2 depends on patch@
expression E; 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 @ @r depends on context || report || org @
...@@ -36,8 +38,10 @@ expression E; ...@@ -36,8 +38,10 @@ expression E;
position p; position p;
@@ @@
* if (E) * if (E != NULL)
* \(kfree@p\|debugfs_remove@p\|debugfs_remove_recursive@p\|usb_free_urb\)(E); * \(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@ @script:python depends on org@
p << r.p; p << r.p;
......
/// 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)
/// 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)
/// 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 // Confidence: Medium
// Options: --include-headers // Options: --include-headers
...@@ -13,18 +13,26 @@ virtual report ...@@ -13,18 +13,26 @@ virtual report
identifier var, arr; identifier var, arr;
expression E; expression E;
@@ @@
struct of_device_id arr[] = { (
struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = {
..., ...,
{ {
.var = E, .var = E,
* } * }
}; };
|
struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = {
...,
* { ..., E, ... },
};
)
@depends on patch@ @depends on patch@
identifier var, arr; identifier var, arr;
expression E; expression E;
@@ @@
struct of_device_id arr[] = { (
struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = {
..., ...,
{ {
.var = E, .var = E,
...@@ -32,19 +40,34 @@ struct of_device_id arr[] = { ...@@ -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@ @r depends on org || report@
position p1; position p1;
identifier var, arr; identifier var, arr;
expression E; expression E;
@@ @@
struct of_device_id arr[] = { (
struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = {
..., ...,
{ {
.var = E, .var = E,
} }
@p1 @p1
}; };
|
struct \(of_device_id \| i2c_device_id \| platform_device_id\) arr[] = {
...,
{ ..., E, ... }
@p1
};
)
@script:python depends on org@ @script:python depends on org@
p1 << r.p1; p1 << r.p1;
......
/// 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)
/// ///
/// A variable is dereference under a NULL test. /// A variable is dereferenced under a NULL test.
/// Even though it is know to be NULL. /// Even though it is known to be NULL.
/// ///
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. // Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
......
/// PTR_ERR should access the value just tested by IS_ERR /// 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. //# IS_ERR that is wrong.
/// ///
// Confidence: High // Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA. GPLv2. // Copyright: (C) 2012, 2015 Julia Lawall, INRIA. GPLv2.
// Copyright: (C) 2012 Gilles Muller, INRIA. GPLv2. // Copyright: (C) 2012, 2015 Gilles Muller, INRIA. GPLv2.
// URL: http://coccinelle.lip6.fr/ // URL: http://coccinelle.lip6.fr/
// Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers
virtual patch virtual patch
...@@ -14,52 +13,105 @@ virtual context ...@@ -14,52 +13,105 @@ virtual context
virtual org virtual org
virtual report virtual report
@depends on patch@ @ok1 exists@
expression e,e1; 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@p(
{ ... - y
PTR_ERR( + x
- e1
+ e
) )
... }
) )
... when any
}
// ----------------------------------------------------------------------------
@r depends on !patch@ @r1_context depends on !patch && (context || org || report) exists@
expression e,e1; position p != {ok1.p,ok2.p};
position p1,p2; 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) ... } PTR_ERR@j1@p(
| y
*if (IS_ERR@p1(e)) )
{ ...
* PTR_ERR@p2(e1)
... }
) )
... when any
}
@script:python depends on org@ @r1_disj depends on !patch && (context || org || report) exists@
p1 << r.p1; position p != {ok1.p,ok2.p};
p2 << r.p2; expression x, y;
position r1_context.j0, r1_context.j1;
@@ @@
cocci.print_main("inconsistent IS_ERR and PTR_ERR",p1) * if (IS_ERR@j0(x) || ...) {
cocci.print_secs("PTR_ERR",p2) ... 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) msg = "inconsistent IS_ERR and PTR_ERR"
coccilib.report.print_report(p1[0],msg) 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)
...@@ -52,7 +52,16 @@ set_debarch() { ...@@ -52,7 +52,16 @@ set_debarch() {
arm64) arm64)
debarch=arm64 ;; debarch=arm64 ;;
arm*) arm*)
debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;; if grep -q CONFIG_AEABI=y $KCONFIG_CONFIG; then
if grep -q CONFIG_VFP=y $KCONFIG_CONFIG; then
debarch=armhf
else
debarch=armel
fi
else
debarch=arm
fi
;;
*) *)
debarch=$(dpkg --print-architecture) debarch=$(dpkg --print-architecture)
echo "" >&2 echo "" >&2
......
...@@ -198,6 +198,8 @@ exuberant() ...@@ -198,6 +198,8 @@ exuberant()
--regex-c++='/TASK_PFA_TEST\([^,]*,\s*([^)]*)\)/task_\1/' \ --regex-c++='/TASK_PFA_TEST\([^,]*,\s*([^)]*)\)/task_\1/' \
--regex-c++='/TASK_PFA_SET\([^,]*,\s*([^)]*)\)/task_set_\1/' \ --regex-c++='/TASK_PFA_SET\([^,]*,\s*([^)]*)\)/task_set_\1/' \
--regex-c++='/TASK_PFA_CLEAR\([^,]*,\s*([^)]*)\)/task_clear_\1/'\ --regex-c++='/TASK_PFA_CLEAR\([^,]*,\s*([^)]*)\)/task_clear_\1/'\
--regex-c++='/DEF_MMIO_(IN|OUT)_(X|D)\(([^,]*),\s*[^)]*\)/\3/' \
--regex-c++='/DEBUGGER_BOILERPLATE\(([^,]*)\)/\1/' \
--regex-c='/PCI_OP_READ\((\w*).*[1-4]\)/pci_bus_read_config_\1/' \ --regex-c='/PCI_OP_READ\((\w*).*[1-4]\)/pci_bus_read_config_\1/' \
--regex-c='/PCI_OP_WRITE\((\w*).*[1-4]\)/pci_bus_write_config_\1/' \ --regex-c='/PCI_OP_WRITE\((\w*).*[1-4]\)/pci_bus_write_config_\1/' \
--regex-c='/DEFINE_(MUTEX|SEMAPHORE|SPINLOCK)\((\w*)/\2/v/' \ --regex-c='/DEFINE_(MUTEX|SEMAPHORE|SPINLOCK)\((\w*)/\2/v/' \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment