Messages in this thread Patch in this message | | | From | Denis Efremov <> | Subject | [PATCH v2 4/4] coccinelle: api: add selfcheck for memdup_user rule | Date | Mon, 8 Jun 2020 18:00:38 +0300 |
| |
Check that the rule matches vmemdup_user implementation. memdup_user is out of scope because we are not matching kmalloc_track_caller() function.
Signed-off-by: Denis Efremov <efremov@linux.com> --- scripts/coccinelle/api/memdup_user.cocci | 46 ++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-)
diff --git a/scripts/coccinelle/api/memdup_user.cocci b/scripts/coccinelle/api/memdup_user.cocci index 8621bd98be1e..78fded83b197 100644 --- a/scripts/coccinelle/api/memdup_user.cocci +++ b/scripts/coccinelle/api/memdup_user.cocci @@ -14,13 +14,24 @@ virtual patch virtual context virtual org virtual report +virtual selfcheck @initialize:python@ @@ -filter = frozenset(['memdup_user', 'vmemdup_user']) + +definitions = { + 'memdup_user': 'mm/util.c', + 'vmemdup_user': 'mm/util.c', +} + +filter = frozenset(definitions.keys()) +coccinelle.filtered = set() +coccinelle.checked_files = set() def relevant(p): - return not (filter & {el.current_element for el in p}) + found = filter & {el.current_element for el in p} + coccinelle.filtered |= found + return not found @depends on patch@ expression from,to,size; @@ -117,3 +128,34 @@ p << rv.p; @@ coccilib.report.print_report(p[0], "WARNING opportunity for vmemdup_user") + +@script:python depends on selfcheck@ +@@ +coccinelle.checked_files |= set(definitions.values()) & set(cocci.files()) + +@finalize:python depends on selfcheck@ +filtered << merge.filtered; +checked_files << merge.checked_files; +@@ + +# Don't check memdup_user because the pattern is not capturing +# kmalloc_track_caller() calls +del definitions['memdup_user'] + +# mapping between checked files and filtered definitions +found_defns = {} +for files, funcs in zip(checked_files, filtered): + for file in files: + found_defns[file] = funcs + +# reverse mapping of definitions +expected_defns = {v : set() for v in definitions.values()} +for k, v in definitions.items(): + expected_defns[v] |= {k} + +for efile, efuncs in expected_defns.items(): + if efile in found_defns: + not_found = efuncs - found_defns[efile] + if not_found: + print('SELF-CHECK: the pattern no longer matches ' \ + 'definitions {} in file {}'.format(not_found, efile)) -- 2.26.2
| |