Skip to content

Commit

Permalink
Merge branch 'for-5.14' of git://git.kernel.org/pub/scm/linux/kernel/…
Browse files Browse the repository at this point in the history
…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
  • Loading branch information
torvalds committed Jul 6, 2021
2 parents 8e4f3e1 + 5e52344 commit 76e2d16
Show file tree
Hide file tree
Showing 8 changed files with 384 additions and 61 deletions.
2 changes: 1 addition & 1 deletion scripts/coccicheck
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ else
fi

# 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
NPROC=$(getconf _NPROCESSORS_ONLN)
if [ $THREADS_PER_CORE -gt 1 -a $NPROC -gt 4 ] ; then
Expand Down
45 changes: 0 additions & 45 deletions scripts/coccinelle/api/kobj_to_dev.cocci

This file was deleted.

12 changes: 6 additions & 6 deletions scripts/coccinelle/free/kfree.cocci
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ position p1;
@@

(
* kfree@p1(E)
kfree@p1(E)
|
* kfree_sensitive@p1(E)
kfree_sensitive@p1(E)
)

@print expression@
Expand Down Expand Up @@ -66,9 +66,9 @@ position ok;

while (1) { ...
(
* kfree@ok(E)
kfree@ok(E)
|
* kfree_sensitive@ok(E)
kfree_sensitive@ok(E)
)
... when != break;
when != goto l;
Expand All @@ -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,...)
)
...
(
Expand Down
23 changes: 21 additions & 2 deletions scripts/coccinelle/misc/flexible_array.cocci
Original file line number Diff line number Diff line change
Expand Up @@ -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@
identifier name, array;
type T;
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[
- 0
];
};
|
struct {
struct {@q
...
T array@p[
- 0
Expand Down
4 changes: 2 additions & 2 deletions scripts/coccinelle/misc/irqf_oneshot.cocci
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,11 @@ devm_request_threaded_irq@p(dev, irq, NULL, ...)
@script:python depends on org@
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)
@script:python depends on report@
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)
222 changes: 222 additions & 0 deletions scripts/coccinelle/misc/minmax.cocci
Original file line number Diff line number Diff line change
@@ -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()")
Loading

0 comments on commit 76e2d16

Please sign in to comment.