Re: [Cocci] [PATCH v2 RESEND] coccinelle: misc: add minmax script
On Fri, 19 Feb 2021, Denis Efremov wrote: > Check for opencoded min(), max() implementations. > > Signed-off-by: Denis Efremov > --- > > Changes in v2: > - <... ...> instead of ... when any > - org mode reports fixed > - patch rule to drop excessive () > > scripts/coccinelle/misc/minmax.cocci | 224 +++ > 1 file changed, 224 insertions(+) > create mode 100644 scripts/coccinelle/misc/minmax.cocci > > diff --git a/scripts/coccinelle/misc/minmax.cocci > b/scripts/coccinelle/misc/minmax.cocci > new file mode 100644 > index ..61d6b61fd82c > --- /dev/null > +++ b/scripts/coccinelle/misc/minmax.cocci > @@ -0,0 +1,224 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/// > +/// Check for opencoded min(), max() implementations. > +/// Generated patches sometimes require adding a cast to fix compile warning. > +/// Warnings/patches scope intentionally limited to a function body. > +/// > +// Confidence: Medium > +// Copyright: (C) 2021 Denis Efremov ISPRAS > +// Options: --no-includes --include-headers > +// > +// Keywords: min, max > +// > + > + > +virtual report > +virtual org > +virtual context > +virtual patch > + > +@rmax depends on !patch@ > +identifier func; > +expression x, y; > +binary operator cmp = {>, >=}; > +position p; > +@@ > + > +func(...) > +{ > + <... > +*x cmp@p y ? x : y The rule below indicated with FIXME is supposed to deal with the possibility of () that are unnecessary when using min and max. It doesn't work, because <... P ...> allow P to match 0 or more times, and thus func@p matches every function. A simpler solution is to just allow arbitrary () in the pattern, eg: (x) cmp@p (y) ? (x) : (y) That will allow each occurrence of x and y to occur with and without parentheses. In the submitted semantic patch, the () issue was only considered in the patch case. But it actually affects the purely matching cases too, because () can be used at one occurrence, but not the other. > +@script:python depends on report@ > +p << rmax.p; > +@@ > + > +coccilib.report.print_report(p[0], "WARNING opportunity for max()") p is an array because it can be bound to different positions on different control-flow paths. Notably this occurs with <... ...>. If there are multiple occurrences of the pattern, there will be one match that contains all of them. Thus the reporting code should be: for p0 in p: coccilib.report.print_report(p0, "WARNING opportunity for max()") julia ___ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci
[Cocci] [PATCH v2] scripts: coccicheck: Fix chain mode in coccicheck
As described in the Coccinelle documentation (Documentation/dev-tools/ coccinelle.rst), chain mode should try patch, report, context, and org modes until one of them succeed. It turns out that currently, the 'run_cmd_parmap' function, by failing to run $SPATCH, rather than returning an error code, kills the execution of the script by executing the exit command, rather than returning the error code. This way, when running coccicheck in chain mode, as in: $ make coccicheck MODE=chain the first .cocci file that does not support one of the virtual rules stops the execution of the makefile, rather than trying the remaining rules as specified in the documentation. Therefore, modify the coccicheck script to return the error code, rather than terminating the script. When returning the error code, it returns the same value obtained in run_cmd, instead of the generic value '1'. Signed-off-by: Davidson Francis --- Changes in v2: * Use the same return value from run_cmd as the exit value scripts/coccicheck | 8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/coccicheck b/scripts/coccicheck index 65fee63aeadb..165701657c5a 100755 --- a/scripts/coccicheck +++ b/scripts/coccicheck @@ -153,7 +153,7 @@ run_cmd_parmap() { err=$? if [[ $err -ne 0 ]]; then echo "coccicheck failed" - exit $err + return $err fi } @@ -251,14 +251,14 @@ coccinelle () { run_cmd $SPATCH -D context \ $FLAGS --cocci-file $COCCI $OPT $OPTIONS || \ run_cmd $SPATCH -D org \ - $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || exit 1 + $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || exit $? elif [ "$MODE" = "rep+ctxt" ] ; then run_cmd $SPATCH -D report \ $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff && \ run_cmd $SPATCH -D context \ - $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1 + $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit $? else - run_cmd $SPATCH -D $MODE $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1 + run_cmd $SPATCH -D $MODE $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit $? fi } -- 2.29.1 ___ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci