coccinelle patches for 5.16-rc1

Update MAINTAINERS information (mailing list, web page, etc).
 
 Add a semantic patch from Wen Yang to check for do_div calls that may
 cause truncation, motivated by
 commit b0ab99e773 ("sched: Fix possible divide by zero in avg_atom() calculation")
 
 Signed-off-by: Julia Lawall <Julia.Lawall@inria.fr>
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEnGZC8gbRfLXdcpA0F+92B3f5RZ0FAmGOQVMACgkQF+92B3f5
 RZ37Hw//R4CEHgb+E5hUUFhejNZTdX93pgoc1nMO8lmE1OwGf1ZMrsdBDrRZe270
 LYKKXgH3H/J/Mc3MstPRDPjIeN6K/DRB1LrYksSEtTJnLwdcd4MoLX5ozwQdWfDQ
 7pJkmdEAhrfGUh7Z2qopINa8XzaE6vAk3alo81GLUL2rOFDaJrtqoSKGZIZ/SPHZ
 p9bnyqfU2Jv/PHCJrnIhAx4af6kae9WY4dSnVd16cB+e5h8u3x/2xEPobNF5+awd
 hUNH+zu3QRP362Mb2rDa8P5Z15bAxLhAv4SwY8BJ8LYYvTtCGv4Vbu661egPahit
 Jgj9mDUoEDMHVBqDMqH4LEc+aCmhKIl4k3p4rODQvW8L+hEP/2Q++FsKuJOK8CfF
 a24NaMed1j6ORW00n1XW6c1AEbPAlfsNYfEGTin6LYtP/AA1FL04jW3FeF/WlPuv
 X1P9U6X0Y/qCzLeCk5IqcoBD9Zf4iYOxEGGXuFEiXm7S41jK7N+TiwXhlEMUKsqF
 0V/xfiXnwzrsCQQLaF5tX4CU9gXDxuZw1b5QfUVDptD42KTfdmss9xGxYVCrRKZy
 R6rLgMcdgTHgRaYzGb3qlIQ0chyjBo8HGCbW1EDYWJwQoR92AkTlFcrWuqxsD2lM
 GDafd6jqDQxdl441siJlZrjxY2EDiXfuWfdJ+fl60yVF6lo1YW0=
 =vMjw
 -----END PGP SIGNATURE-----

Merge tag 'coccinelle-5.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlawall/linux

Pull coccinelle updates from Julia Lawall:

 - Update MAINTAINERS information (mailing list, web page, etc).

 - Add a semantic patch from Wen Yang to check for do_div calls that may
   cause truncation, motivated by commit b0ab99e773 ("sched: Fix
   possible divide by zero in avg_atom() calculation")

* tag 'coccinelle-5.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlawall/linux:
  coccinelle: update Coccinelle entry
  coccinelle: semantic patch to check for inappropriate do_div() calls
This commit is contained in:
Linus Torvalds 2021-11-13 10:45:17 -08:00
commit a9b9669d98
2 changed files with 158 additions and 4 deletions

View File

@ -4676,11 +4676,10 @@ COCCINELLE/Semantic Patches (SmPL)
M: Julia Lawall <Julia.Lawall@inria.fr>
M: Gilles Muller <Gilles.Muller@inria.fr>
M: Nicolas Palix <nicolas.palix@imag.fr>
M: Michal Marek <michal.lkml@markovi.net>
L: cocci@systeme.lip6.fr (moderated for non-subscribers)
L: cocci@inria.fr (moderated for non-subscribers)
S: Supported
W: http://coccinelle.lip6.fr/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild.git misc
W: https://coccinelle.gitlabpages.inria.fr/website/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlawall/linux.git
F: Documentation/dev-tools/coccinelle.rst
F: scripts/coccicheck
F: scripts/coccinelle/

View File

@ -0,0 +1,155 @@
// SPDX-License-Identifier: GPL-2.0-only
/// do_div() does a 64-by-32 division.
/// When the divisor is long, unsigned long, u64, or s64,
/// do_div() truncates it to 32 bits, this means it can test
/// non-zero and be truncated to 0 for division on 64bit platforms.
///
//# This makes an effort to find those inappropriate do_div() calls.
//
// Confidence: Moderate
// Copyright: (C) 2020 Wen Yang, Alibaba.
// Comments:
// Options: --no-includes --include-headers
virtual context
virtual org
virtual report
@initialize:python@
@@
def get_digit_type_and_value(str):
is_digit = False
value = 0
try:
if (str.isdigit()):
is_digit = True
value = int(str, 0)
elif (str.upper().endswith('ULL')):
is_digit = True
value = int(str[:-3], 0)
elif (str.upper().endswith('LL')):
is_digit = True
value = int(str[:-2], 0)
elif (str.upper().endswith('UL')):
is_digit = True
value = int(str[:-2], 0)
elif (str.upper().endswith('L')):
is_digit = True
value = int(str[:-1], 0)
elif (str.upper().endswith('U')):
is_digit = True
value = int(str[:-1], 0)
except Exception as e:
print('Error:',e)
is_digit = False
value = 0
finally:
return is_digit, value
def filter_out_safe_constants(str):
is_digit, value = get_digit_type_and_value(str)
if (is_digit):
if (value >= 0x100000000):
return True
else:
return False
else:
return True
def construct_warnings(suggested_fun):
msg="WARNING: do_div() does a 64-by-32 division, please consider using %s instead."
return msg % suggested_fun
@depends on context@
expression f;
long l: script:python() { filter_out_safe_constants(l) };
unsigned long ul : script:python() { filter_out_safe_constants(ul) };
u64 ul64 : script:python() { filter_out_safe_constants(ul64) };
s64 sl64 : script:python() { filter_out_safe_constants(sl64) };
@@
(
* do_div(f, l);
|
* do_div(f, ul);
|
* do_div(f, ul64);
|
* do_div(f, sl64);
)
@r depends on (org || report)@
expression f;
position p;
long l: script:python() { filter_out_safe_constants(l) };
unsigned long ul : script:python() { filter_out_safe_constants(ul) };
u64 ul64 : script:python() { filter_out_safe_constants(ul64) };
s64 sl64 : script:python() { filter_out_safe_constants(sl64) };
@@
(
do_div@p(f, l);
|
do_div@p(f, ul);
|
do_div@p(f, ul64);
|
do_div@p(f, sl64);
)
@script:python depends on org@
p << r.p;
ul << r.ul;
@@
coccilib.org.print_todo(p[0], construct_warnings("div64_ul"))
@script:python depends on org@
p << r.p;
l << r.l;
@@
coccilib.org.print_todo(p[0], construct_warnings("div64_long"))
@script:python depends on org@
p << r.p;
ul64 << r.ul64;
@@
coccilib.org.print_todo(p[0], construct_warnings("div64_u64"))
@script:python depends on org@
p << r.p;
sl64 << r.sl64;
@@
coccilib.org.print_todo(p[0], construct_warnings("div64_s64"))
@script:python depends on report@
p << r.p;
ul << r.ul;
@@
coccilib.report.print_report(p[0], construct_warnings("div64_ul"))
@script:python depends on report@
p << r.p;
l << r.l;
@@
coccilib.report.print_report(p[0], construct_warnings("div64_long"))
@script:python depends on report@
p << r.p;
sl64 << r.sl64;
@@
coccilib.report.print_report(p[0], construct_warnings("div64_s64"))
@script:python depends on report@
p << r.p;
ul64 << r.ul64;
@@
coccilib.report.print_report(p[0], construct_warnings("div64_u64"))