Messages in this thread Patch in this message | | | Date | Sat, 4 Jan 2020 08:16:58 +0100 (CET) | From | Julia Lawall <> | Subject | Re: [PATCH] coccinelle: semantic patch to check for inappropriate do_div() calls |
| |
--- Please note the new email address ---
On Sat, 4 Jan 2020, Wen Yang wrote:
> do_div() does a 64-by-32 division. > When the divisor is unsigned long, u64, or s64, > do_div() truncates it to 32 bits, this means it > can test non-zero and be truncated to zero for division.
Would it be worth having a specific warning message for the long/unsigned long case? If the target architecture has 32 bit longs then the warning can be immediately ignored.
julia
> This semantic patch is inspired by Mateusz Guzik's patch: > commit b0ab99e7736a ("sched: Fix possible divide by zero in avg_atom() calculation") > > Signed-off-by: Wen Yang <wenyang@linux.alibaba.com> > Cc: Julia Lawall <Julia.Lawall@lip6.fr> > Cc: Gilles Muller <Gilles.Muller@lip6.fr> > Cc: Nicolas Palix <nicolas.palix@imag.fr> > Cc: Michal Marek <michal.lkml@markovi.net> > Cc: Matthias Maennich <maennich@google.com> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: Masahiro Yamada <yamada.masahiro@socionext.com> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: cocci@systeme.lip6.fr > Cc: linux-kernel@vger.kernel.org > --- > scripts/coccinelle/misc/do_div.cocci | 66 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 66 insertions(+) > create mode 100644 scripts/coccinelle/misc/do_div.cocci > > diff --git a/scripts/coccinelle/misc/do_div.cocci b/scripts/coccinelle/misc/do_div.cocci > new file mode 100644 > index 0000000..f1b72d1 > --- /dev/null > +++ b/scripts/coccinelle/misc/do_div.cocci > @@ -0,0 +1,66 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/// do_div() does a 64-by-32 division. > +/// When the divisor is unsigned long, u64, or s64, > +/// do_div() truncates it to 32 bits, this means it > +/// can test non-zero and be truncated to zero for division. > +/// > +//# 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 > + > +@depends on context@ > +expression f; > +long l; > +unsigned long ul; > +u64 ul64; > +s64 sl64; > + > +@@ > +( > +* do_div(f, l); > +| > +* do_div(f, ul); > +| > +* do_div(f, ul64); > +| > +* do_div(f, sl64); > +) > + > +@r depends on (org || report)@ > +expression f; > +long l; > +unsigned long ul; > +position p; > +u64 ul64; > +s64 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; > +@@ > + > +msg="WARNING: WARNING: do_div() does a 64-by-32 division, which may truncation the divisor to 32-bit" > +coccilib.org.print_todo(p[0], msg) > + > +@script:python depends on report@ > +p << r.p; > +@@ > + > +msg="WARNING: WARNING: do_div() does a 64-by-32 division, which may truncation the divisor to 32-bit" > +coccilib.report.print_report(p[0], msg) > -- > 1.8.3.1 >
| |