lkml.org 
[lkml]   [2014]   [Oct]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [coccicheck PATCH 4/5] Deletion of unnecessary checks before specific function calls
    >>> If you are convinced that dropping the null tests is a good idea, then you 
    >>> can submit the patch that makes the change to the relevant maintainers and
    >>> mailing lists.

    From e6a21b920fcca2f6f01c9528909dc036a9b3bc41 Mon Sep 17 00:00:00 2001
    From: Markus Elfring <elfring@users.sourceforge.net>
    Date: Wed, 5 Mar 2014 19:10:32 +0100
    Subject: [PATCH 4/5] Addition of a semantic patch file for listing of
    unnecessary checks before a few known functions

    This semantic patch pattern tries to find source code places where a check
    is performed for an expression that is passed to a function (like "kfree")
    which checks this single parameter itself for usability.
    Redundant value or pointer checks can be avoided here.

    The pattern contains a special comment in a regular expression for a SmPL
    constraint which supports extensions.

    It uses Python statements to write information about the found places in
    a data format that is a variant of a CSV text file.

    Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
    ---
    ...nctions_with_unnecessary_checks_template1.cocci | 59 ++++++++++++++++++++++
    1 file changed, 59 insertions(+)
    create mode 100644
    scripts/coccinelle/deletions/list_functions_with_unnecessary_checks_template1.cocci

    diff --git
    a/scripts/coccinelle/deletions/list_functions_with_unnecessary_checks_template1.cocci
    b/scripts/coccinelle/deletions/list_functions_with_unnecessary_checks_template1.cocci
    new file mode 100644
    index 0000000..d2637e8
    --- /dev/null
    +++
    b/scripts/coccinelle/deletions/list_functions_with_unnecessary_checks_template1.cocci
    @@ -0,0 +1,59 @@
    +@initialize:python@
    +@@
    +import sys
    +result = []
    +mark = ['"', '', '"']
    +delimiter = '|'
    +
    +def store_positions(fun, point, places):
    + """Add source code positions to an internal list."""
    + for place in places:
    + fields = []
    + fields.append(fun)
    +
    + fields.append(point)
    +
    + mark[1] = place.file.replace('"', '""')
    + fields.append(''.join(mark))
    +
    + fields.append(place.line)
    + fields.append(str(int(place.column) + 1))
    + result.append(delimiter.join(fields))
    +
    +@is_unnecessary_check@
    +expression data;
    +identifier work;
    +identifier release =~ "^(?x)
    +(?:
    + (?:kz?|slob_)free
    +|
    + (?:
    +# Alternation placeholder
    + )
    +)$";
    +position pos;
    +type t;
    +@@
    + t work@pos(...)
    + {
    + ... when any
    +( if (data) release(data);
    +| if (likely(data)) release(data);
    +)
    + ... when any
    + }
    +
    +@script:python collection depends on is_unnecessary_check@
    +fun << is_unnecessary_check.work;
    +point << is_unnecessary_check.data;
    +places << is_unnecessary_check.pos;
    +@@
    +store_positions(fun, point, places)
    +
    +@finalize:python@
    +@@
    +if result:
    + result.insert(0, delimiter.join(("function", '"parameter"', '"source file"',
    "line", "column")))
    + print("\r\n".join(result))
    +else:
    + sys.stderr.write("No result for this analysis!\n")
    --
    1.9.0




    \
     
     \ /
      Last update: 2014-10-01 16:41    [W:4.022 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site