mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
Merge branch 'for-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/jlawall/linux
Pull coccinelle updates from Julia Lawall: "There are two new semantic patches: - minmax: To use min and max instead of ? : - swap: To use swap when possible Some other semantic patches have been updated to better conform to Linux kernel developer expectations or to make the explanation message more clear. Finally, there is a fix for the coccicheck script" * 'for-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/jlawall/linux: coccinelle: api: remove kobj_to_dev.cocci script scripts: coccicheck: fix troubles on non-English builds coccinelle: misc: minmax: suppress patch generation for err returns drop unneeded *s coccinelle: irqf_oneshot: reduce the severity due to false positives coccinelle: misc: add swap script coccinelle: misc: update uninitialized_var.cocci documentation coccinelle: misc: restrict patch mode in flexible_array.cocci coccinelle: misc: add minmax script
This commit is contained in:
@@ -87,7 +87,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Use only one thread per core by default if hyperthreading is enabled
|
# Use only one thread per core by default if hyperthreading is enabled
|
||||||
THREADS_PER_CORE=$(lscpu | grep "Thread(s) per core: " | tr -cd "[:digit:]")
|
THREADS_PER_CORE=$(LANG=C lscpu | grep "Thread(s) per core: " | tr -cd "[:digit:]")
|
||||||
if [ -z "$J" ]; then
|
if [ -z "$J" ]; then
|
||||||
NPROC=$(getconf _NPROCESSORS_ONLN)
|
NPROC=$(getconf _NPROCESSORS_ONLN)
|
||||||
if [ $THREADS_PER_CORE -gt 1 -a $NPROC -gt 4 ] ; then
|
if [ $THREADS_PER_CORE -gt 1 -a $NPROC -gt 4 ] ; then
|
||||||
|
@@ -1,45 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
|
||||||
///
|
|
||||||
/// Use kobj_to_dev() instead of container_of()
|
|
||||||
///
|
|
||||||
// Confidence: High
|
|
||||||
// Copyright: (C) 2020 Denis Efremov ISPRAS
|
|
||||||
// Options: --no-includes --include-headers
|
|
||||||
//
|
|
||||||
// Keywords: kobj_to_dev, container_of
|
|
||||||
//
|
|
||||||
|
|
||||||
virtual context
|
|
||||||
virtual report
|
|
||||||
virtual org
|
|
||||||
virtual patch
|
|
||||||
|
|
||||||
|
|
||||||
@r depends on !patch@
|
|
||||||
expression ptr;
|
|
||||||
symbol kobj;
|
|
||||||
position p;
|
|
||||||
@@
|
|
||||||
|
|
||||||
* container_of(ptr, struct device, kobj)@p
|
|
||||||
|
|
||||||
|
|
||||||
@depends on patch@
|
|
||||||
expression ptr;
|
|
||||||
@@
|
|
||||||
|
|
||||||
- container_of(ptr, struct device, kobj)
|
|
||||||
+ kobj_to_dev(ptr)
|
|
||||||
|
|
||||||
|
|
||||||
@script:python depends on report@
|
|
||||||
p << r.p;
|
|
||||||
@@
|
|
||||||
|
|
||||||
coccilib.report.print_report(p[0], "WARNING opportunity for kobj_to_dev()")
|
|
||||||
|
|
||||||
@script:python depends on org@
|
|
||||||
p << r.p;
|
|
||||||
@@
|
|
||||||
|
|
||||||
coccilib.org.print_todo(p[0], "WARNING opportunity for kobj_to_dev()")
|
|
@@ -22,9 +22,9 @@ position p1;
|
|||||||
@@
|
@@
|
||||||
|
|
||||||
(
|
(
|
||||||
* kfree@p1(E)
|
kfree@p1(E)
|
||||||
|
|
|
|
||||||
* kfree_sensitive@p1(E)
|
kfree_sensitive@p1(E)
|
||||||
)
|
)
|
||||||
|
|
||||||
@print expression@
|
@print expression@
|
||||||
@@ -66,9 +66,9 @@ position ok;
|
|||||||
|
|
||||||
while (1) { ...
|
while (1) { ...
|
||||||
(
|
(
|
||||||
* kfree@ok(E)
|
kfree@ok(E)
|
||||||
|
|
|
|
||||||
* kfree_sensitive@ok(E)
|
kfree_sensitive@ok(E)
|
||||||
)
|
)
|
||||||
... when != break;
|
... when != break;
|
||||||
when != goto l;
|
when != goto l;
|
||||||
@@ -84,9 +84,9 @@ position free.p1!=loop.ok,p2!={print.p,sz.p};
|
|||||||
@@
|
@@
|
||||||
|
|
||||||
(
|
(
|
||||||
* kfree@p1(E,...)
|
kfree@p1(E,...)
|
||||||
|
|
|
|
||||||
* kfree_sensitive@p1(E,...)
|
kfree_sensitive@p1(E,...)
|
||||||
)
|
)
|
||||||
...
|
...
|
||||||
(
|
(
|
||||||
|
@@ -51,21 +51,40 @@ position p : script:python() { relevant(p) };
|
|||||||
};
|
};
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@only_field depends on patch@
|
||||||
|
identifier name, array;
|
||||||
|
type T;
|
||||||
|
position q;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(
|
||||||
|
struct name {@q
|
||||||
|
T array[0];
|
||||||
|
};
|
||||||
|
|
|
||||||
|
struct {@q
|
||||||
|
T array[0];
|
||||||
|
};
|
||||||
|
)
|
||||||
|
|
||||||
@depends on patch@
|
@depends on patch@
|
||||||
identifier name, array;
|
identifier name, array;
|
||||||
type T;
|
type T;
|
||||||
position p : script:python() { relevant(p) };
|
position p : script:python() { relevant(p) };
|
||||||
|
// position @q with rule "only_field" simplifies
|
||||||
|
// handling of bitfields, arrays, etc.
|
||||||
|
position q != only_field.q;
|
||||||
@@
|
@@
|
||||||
|
|
||||||
(
|
(
|
||||||
struct name {
|
struct name {@q
|
||||||
...
|
...
|
||||||
T array@p[
|
T array@p[
|
||||||
- 0
|
- 0
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
|
||||||
struct {
|
struct {@q
|
||||||
...
|
...
|
||||||
T array@p[
|
T array@p[
|
||||||
- 0
|
- 0
|
||||||
|
@@ -103,11 +103,11 @@ devm_request_threaded_irq@p(dev, irq, NULL, ...)
|
|||||||
@script:python depends on org@
|
@script:python depends on org@
|
||||||
p << match.p;
|
p << match.p;
|
||||||
@@
|
@@
|
||||||
msg = "ERROR: Threaded IRQ with no primary handler requested without IRQF_ONESHOT"
|
msg = "WARNING: Threaded IRQ with no primary handler requested without IRQF_ONESHOT (unless it is nested IRQ)"
|
||||||
coccilib.org.print_todo(p[0],msg)
|
coccilib.org.print_todo(p[0],msg)
|
||||||
|
|
||||||
@script:python depends on report@
|
@script:python depends on report@
|
||||||
p << match.p;
|
p << match.p;
|
||||||
@@
|
@@
|
||||||
msg = "ERROR: Threaded IRQ with no primary handler requested without IRQF_ONESHOT"
|
msg = "WARNING: Threaded IRQ with no primary handler requested without IRQF_ONESHOT (unless it is nested IRQ)"
|
||||||
coccilib.report.print_report(p[0],msg)
|
coccilib.report.print_report(p[0],msg)
|
||||||
|
222
scripts/coccinelle/misc/minmax.cocci
Normal file
222
scripts/coccinelle/misc/minmax.cocci
Normal file
@@ -0,0 +1,222 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
///
|
||||||
|
/// Check for opencoded min(), max() implementations.
|
||||||
|
/// Generated patches sometimes require adding a cast to fix compile warning.
|
||||||
|
/// Warnings/patches scope intentionally limited to a function body.
|
||||||
|
///
|
||||||
|
// Confidence: Medium
|
||||||
|
// Copyright: (C) 2021 Denis Efremov ISPRAS
|
||||||
|
// Options: --no-includes --include-headers
|
||||||
|
//
|
||||||
|
// Keywords: min, max
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
virtual report
|
||||||
|
virtual org
|
||||||
|
virtual context
|
||||||
|
virtual patch
|
||||||
|
|
||||||
|
@rmax depends on !patch@
|
||||||
|
identifier func;
|
||||||
|
expression x, y;
|
||||||
|
binary operator cmp = {>, >=};
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
* ((x) cmp@p (y) ? (x) : (y))
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@rmaxif depends on !patch@
|
||||||
|
identifier func;
|
||||||
|
expression x, y;
|
||||||
|
expression max_val;
|
||||||
|
binary operator cmp = {>, >=};
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
* if ((x) cmp@p (y)) {
|
||||||
|
* max_val = (x);
|
||||||
|
* } else {
|
||||||
|
* max_val = (y);
|
||||||
|
* }
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@rmin depends on !patch@
|
||||||
|
identifier func;
|
||||||
|
expression x, y;
|
||||||
|
binary operator cmp = {<, <=};
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
* ((x) cmp@p (y) ? (x) : (y))
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@rminif depends on !patch@
|
||||||
|
identifier func;
|
||||||
|
expression x, y;
|
||||||
|
expression min_val;
|
||||||
|
binary operator cmp = {<, <=};
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
* if ((x) cmp@p (y)) {
|
||||||
|
* min_val = (x);
|
||||||
|
* } else {
|
||||||
|
* min_val = (y);
|
||||||
|
* }
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@pmax depends on patch@
|
||||||
|
identifier func;
|
||||||
|
expression x, y;
|
||||||
|
binary operator cmp = {>=, >};
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- ((x) cmp (y) ? (x) : (y))
|
||||||
|
+ max(x, y)
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@pmaxif depends on patch@
|
||||||
|
identifier func;
|
||||||
|
expression x, y;
|
||||||
|
expression max_val;
|
||||||
|
binary operator cmp = {>=, >};
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- if ((x) cmp (y)) {
|
||||||
|
- max_val = x;
|
||||||
|
- } else {
|
||||||
|
- max_val = y;
|
||||||
|
- }
|
||||||
|
+ max_val = max(x, y);
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't generate patches for errcode returns.
|
||||||
|
@errcode depends on patch@
|
||||||
|
position p;
|
||||||
|
identifier func;
|
||||||
|
expression x;
|
||||||
|
binary operator cmp = {<, <=};
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
return ((x) cmp@p 0 ? (x) : 0);
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@pmin depends on patch@
|
||||||
|
identifier func;
|
||||||
|
expression x, y;
|
||||||
|
binary operator cmp = {<=, <};
|
||||||
|
position p != errcode.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- ((x) cmp@p (y) ? (x) : (y))
|
||||||
|
+ min(x, y)
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@pminif depends on patch@
|
||||||
|
identifier func;
|
||||||
|
expression x, y;
|
||||||
|
expression min_val;
|
||||||
|
binary operator cmp = {<=, <};
|
||||||
|
@@
|
||||||
|
|
||||||
|
func(...)
|
||||||
|
{
|
||||||
|
<...
|
||||||
|
- if ((x) cmp (y)) {
|
||||||
|
- min_val = x;
|
||||||
|
- } else {
|
||||||
|
- min_val = y;
|
||||||
|
- }
|
||||||
|
+ min_val = min(x, y);
|
||||||
|
...>
|
||||||
|
}
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << rmax.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
for p0 in p:
|
||||||
|
coccilib.report.print_report(p0, "WARNING opportunity for max()")
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << rmax.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
for p0 in p:
|
||||||
|
coccilib.org.print_todo(p0, "WARNING opportunity for max()")
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << rmaxif.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
for p0 in p:
|
||||||
|
coccilib.report.print_report(p0, "WARNING opportunity for max()")
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << rmaxif.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
for p0 in p:
|
||||||
|
coccilib.org.print_todo(p0, "WARNING opportunity for max()")
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << rmin.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
for p0 in p:
|
||||||
|
coccilib.report.print_report(p0, "WARNING opportunity for min()")
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << rmin.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
for p0 in p:
|
||||||
|
coccilib.org.print_todo(p0, "WARNING opportunity for min()")
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << rminif.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
for p0 in p:
|
||||||
|
coccilib.report.print_report(p0, "WARNING opportunity for min()")
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << rminif.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
for p0 in p:
|
||||||
|
coccilib.org.print_todo(p0, "WARNING opportunity for min()")
|
122
scripts/coccinelle/misc/swap.cocci
Normal file
122
scripts/coccinelle/misc/swap.cocci
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
///
|
||||||
|
/// Check for opencoded swap() implementation.
|
||||||
|
///
|
||||||
|
// Confidence: High
|
||||||
|
// Copyright: (C) 2021 Denis Efremov ISPRAS
|
||||||
|
// Options: --no-includes --include-headers
|
||||||
|
//
|
||||||
|
// Keywords: swap
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual patch
|
||||||
|
virtual org
|
||||||
|
virtual report
|
||||||
|
virtual context
|
||||||
|
|
||||||
|
@rvar depends on !patch@
|
||||||
|
identifier tmp;
|
||||||
|
expression a, b;
|
||||||
|
type T;
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(
|
||||||
|
* T tmp;
|
||||||
|
|
|
||||||
|
* T tmp = 0;
|
||||||
|
|
|
||||||
|
* T *tmp = NULL;
|
||||||
|
)
|
||||||
|
... when != tmp
|
||||||
|
* tmp = a;
|
||||||
|
* a = b;@p
|
||||||
|
* b = tmp;
|
||||||
|
... when != tmp
|
||||||
|
|
||||||
|
@r depends on !patch@
|
||||||
|
identifier tmp;
|
||||||
|
expression a, b;
|
||||||
|
position p != rvar.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
* tmp = a;
|
||||||
|
* a = b;@p
|
||||||
|
* b = tmp;
|
||||||
|
|
||||||
|
@rpvar depends on patch@
|
||||||
|
identifier tmp;
|
||||||
|
expression a, b;
|
||||||
|
type T;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(
|
||||||
|
- T tmp;
|
||||||
|
|
|
||||||
|
- T tmp = 0;
|
||||||
|
|
|
||||||
|
- T *tmp = NULL;
|
||||||
|
)
|
||||||
|
... when != tmp
|
||||||
|
- tmp = a;
|
||||||
|
- a = b;
|
||||||
|
- b = tmp
|
||||||
|
+ swap(a, b)
|
||||||
|
;
|
||||||
|
... when != tmp
|
||||||
|
|
||||||
|
@rp depends on patch@
|
||||||
|
identifier tmp;
|
||||||
|
expression a, b;
|
||||||
|
@@
|
||||||
|
|
||||||
|
- tmp = a;
|
||||||
|
- a = b;
|
||||||
|
- b = tmp
|
||||||
|
+ swap(a, b)
|
||||||
|
;
|
||||||
|
|
||||||
|
@depends on patch && (rpvar || rp)@
|
||||||
|
@@
|
||||||
|
|
||||||
|
(
|
||||||
|
for (...;...;...)
|
||||||
|
- {
|
||||||
|
swap(...);
|
||||||
|
- }
|
||||||
|
|
|
||||||
|
while (...)
|
||||||
|
- {
|
||||||
|
swap(...);
|
||||||
|
- }
|
||||||
|
|
|
||||||
|
if (...)
|
||||||
|
- {
|
||||||
|
swap(...);
|
||||||
|
- }
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << r.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
coccilib.report.print_report(p[0], "WARNING opportunity for swap()")
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << r.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
coccilib.org.print_todo(p[0], "WARNING opportunity for swap()")
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << rvar.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
coccilib.report.print_report(p[0], "WARNING opportunity for swap()")
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << rvar.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
coccilib.org.print_todo(p[0], "WARNING opportunity for swap()")
|
@@ -1,7 +1,9 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
///
|
///
|
||||||
/// Please, don't reintroduce uninitialized_var().
|
/// Please, don't reintroduce uninitialized_var().
|
||||||
/// From Documentation/process/deprecated.rst:
|
///
|
||||||
|
/// From Documentation/process/deprecated.rst,
|
||||||
|
/// commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()"):
|
||||||
/// For any compiler warnings about uninitialized variables, just add
|
/// For any compiler warnings about uninitialized variables, just add
|
||||||
/// an initializer. Using warning-silencing tricks is dangerous as it
|
/// an initializer. Using warning-silencing tricks is dangerous as it
|
||||||
/// papers over real bugs (or can in the future), and suppresses unrelated
|
/// papers over real bugs (or can in the future), and suppresses unrelated
|
||||||
@@ -11,6 +13,11 @@
|
|||||||
/// obviously redundant, the compiler's dead-store elimination pass will make
|
/// obviously redundant, the compiler's dead-store elimination pass will make
|
||||||
/// sure there are no needless variable writes.
|
/// sure there are no needless variable writes.
|
||||||
///
|
///
|
||||||
|
/// Later, commit 3942ea7a10c9 ("deprecated.rst: Remove now removed
|
||||||
|
/// uninitialized_var") removed this section because all initializations of
|
||||||
|
/// this kind were cleaned-up from the kernel. This cocci rule checks that
|
||||||
|
/// the macro is not explicitly or implicitly reintroduced.
|
||||||
|
///
|
||||||
// Confidence: High
|
// Confidence: High
|
||||||
// Copyright: (C) 2020 Denis Efremov ISPRAS
|
// Copyright: (C) 2020 Denis Efremov ISPRAS
|
||||||
// Options: --no-includes --include-headers
|
// Options: --no-includes --include-headers
|
||||||
@@ -40,12 +47,10 @@ position p;
|
|||||||
p << r.p;
|
p << r.p;
|
||||||
@@
|
@@
|
||||||
|
|
||||||
coccilib.report.print_report(p[0],
|
coccilib.report.print_report(p[0], "WARNING this kind of initialization is deprecated")
|
||||||
"WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)")
|
|
||||||
|
|
||||||
@script:python depends on org@
|
@script:python depends on org@
|
||||||
p << r.p;
|
p << r.p;
|
||||||
@@
|
@@
|
||||||
|
|
||||||
coccilib.org.print_todo(p[0],
|
coccilib.org.print_todo(p[0], "WARNING this kind of initialization is deprecated")
|
||||||
"WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)")
|
|
||||||
|
Reference in New Issue
Block a user