lkml.org 
[lkml]   [2020]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v3] coccinelle: misc: add flexible_array.cocci script


    On Mon, 21 Sep 2020, Denis Efremov wrote:

    > One-element and zero-length arrays are deprecated [1]. Kernel
    > code should always use "flexible array members" instead, except
    > for existing uapi definitions.
    >
    > The script warns about one-element and zero-length arrays in structs.
    >
    > [1] commit 68e4cd17e218 ("docs: deprecated.rst: Add zero-length and
    > one-element arrays")
    >
    > Cc: Kees Cook <keescook@chromium.org>
    > Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
    > Signed-off-by: Denis Efremov <efremov@linux.com>

    Applied, thanks.


    > ---
    > Changes in v2:
    > - all uapi headers are now filtered-out. Unfortunately, coccinelle
    > doesn't provide structure names in Location.current_element.
    > For structures the field is always "something_else". Thus, there is
    > no easy way to create a list of existing structures in uapi headers
    > and suppress the warning only for them, but not for the newly added
    > uapi structures.
    > - The pattern doesn't require 2+ fields in a structure/union anymore.
    > Now it also checks single field structures/unions.
    > - The pattern simplified and now uses disjuction in array elements
    > (Thanks, Markus)
    > - Unions are removed from patch mode
    > - one-element arrays are removed from patch mode. Correct patch may
    > involve turning the array to a simple field instead of a flexible
    > array.
    > Changes in v3:
    > - exists removed from "depends on patch"
    > - position argument fixed in org mode
    > - link to the online documentation added to the warning message
    >
    > scripts/coccinelle/misc/flexible_array.cocci | 88 ++++++++++++++++++++
    > 1 file changed, 88 insertions(+)
    > create mode 100644 scripts/coccinelle/misc/flexible_array.cocci
    >
    > diff --git a/scripts/coccinelle/misc/flexible_array.cocci b/scripts/coccinelle/misc/flexible_array.cocci
    > new file mode 100644
    > index 000000000000..947fbaff82a9
    > --- /dev/null
    > +++ b/scripts/coccinelle/misc/flexible_array.cocci
    > @@ -0,0 +1,88 @@
    > +// SPDX-License-Identifier: GPL-2.0-only
    > +///
    > +/// Zero-length and one-element arrays are deprecated, see
    > +/// Documentation/process/deprecated.rst
    > +/// Flexible-array members should be used instead.
    > +///
    > +//
    > +// Confidence: High
    > +// Copyright: (C) 2020 Denis Efremov ISPRAS.
    > +// Comments:
    > +// Options: --no-includes --include-headers
    > +
    > +virtual context
    > +virtual report
    > +virtual org
    > +virtual patch
    > +
    > +@initialize:python@
    > +@@
    > +def relevant(positions):
    > + for p in positions:
    > + if "uapi" in p.file:
    > + return False
    > + return True
    > +
    > +@r depends on !patch@
    > +identifier name, array;
    > +type T;
    > +position p : script:python() { relevant(p) };
    > +@@
    > +
    > +(
    > + struct name {
    > + ...
    > +* T array@p[\(0\|1\)];
    > + };
    > +|
    > + struct {
    > + ...
    > +* T array@p[\(0\|1\)];
    > + };
    > +|
    > + union name {
    > + ...
    > +* T array@p[\(0\|1\)];
    > + };
    > +|
    > + union {
    > + ...
    > +* T array@p[\(0\|1\)];
    > + };
    > +)
    > +
    > +@depends on patch@
    > +identifier name, array;
    > +type T;
    > +position p : script:python() { relevant(p) };
    > +@@
    > +
    > +(
    > + struct name {
    > + ...
    > + T array@p[
    > +- 0
    > + ];
    > + };
    > +|
    > + struct {
    > + ...
    > + T array@p[
    > +- 0
    > + ];
    > + };
    > +)
    > +
    > +@script: python depends on report@
    > +p << r.p;
    > +@@
    > +
    > +msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
    > +coccilib.report.print_report(p[0], msg)
    > +
    > +@script: python depends on org@
    > +p << r.p;
    > +@@
    > +
    > +msg = "WARNING use flexible-array member instead (https://www.kernel.org/doc/html/latest/process/deprecated.html#zero-length-and-one-element-arrays)"
    > +coccilib.org.print_todo(p[0], msg)
    > --
    > 2.26.2
    >
    >

    \
     
     \ /
      Last update: 2020-10-03 22:10    [W:2.287 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site