xref: /linux/scripts/coccicheck (revision 2c1160c87465ee2d61eee14596e5376d2ff74f31)
174425eeeSNicolas Palix#!/bin/sh
274425eeeSNicolas Palix
374425eeeSNicolas PalixSPATCH="`which ${SPATCH:=spatch}`"
474425eeeSNicolas Palix
51e9dea2aSNicolas Palixif [ "$C" = "1" -o "$C" = "2" ]; then
61e9dea2aSNicolas Palix    ONLINE=1
71e9dea2aSNicolas Palix
81e9dea2aSNicolas Palix# This requires Coccinelle >= 0.2.3
91e9dea2aSNicolas Palix#    FLAGS="-ignore_unknown_options -very_quiet"
101e9dea2aSNicolas Palix#    OPTIONS=$*
111e9dea2aSNicolas Palix
121e9dea2aSNicolas Palix# Workaround for Coccinelle < 0.2.3
131e9dea2aSNicolas Palix    FLAGS="-I $srctree/include -very_quiet"
141e9dea2aSNicolas Palix    shift $(( $# - 1 ))
151e9dea2aSNicolas Palix    OPTIONS=$1
161e9dea2aSNicolas Palixelse
171e9dea2aSNicolas Palix    ONLINE=0
181e9dea2aSNicolas Palix    FLAGS="-very_quiet"
19*2c1160c8SNicolas Palix    OPTIONS="-dir $srctree"
201e9dea2aSNicolas Palixfi
211e9dea2aSNicolas Palix
2274425eeeSNicolas Palixif [ ! -x "$SPATCH" ]; then
2374425eeeSNicolas Palix    echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
2474425eeeSNicolas Palix    exit 1
2574425eeeSNicolas Palixfi
2674425eeeSNicolas Palix
2774425eeeSNicolas Palixif [ "$MODE" = "" ] ; then
281e9dea2aSNicolas Palix    if [ "$ONLINE" = "0" ] ; then
29*2c1160c8SNicolas Palix	echo 'You have not explicitly specified the mode to use. Using default "chain" mode.'
30*2c1160c8SNicolas Palix	echo 'All available modes will be tried (in that order): patch, report, context, org'
3174425eeeSNicolas Palix	echo 'You can specify the mode with "make coccicheck MODE=<mode>"'
321e9dea2aSNicolas Palix    fi
33*2c1160c8SNicolas Palix    MODE="chain"
3474425eeeSNicolas Palixfi
3574425eeeSNicolas Palix
361e9dea2aSNicolas Palixif [ "$ONLINE" = "0" ] ; then
3774425eeeSNicolas Palix    echo ''
3874425eeeSNicolas Palix    echo 'Please check for false positives in the output before submitting a patch.'
3974425eeeSNicolas Palix    echo 'When using "patch" mode, carefully review the patch before submitting it.'
4074425eeeSNicolas Palix    echo ''
411e9dea2aSNicolas Palixfi
4274425eeeSNicolas Palix
431e9dea2aSNicolas Palixcoccinelle () {
4474425eeeSNicolas Palix    COCCI="$1"
4574425eeeSNicolas Palix
4674425eeeSNicolas Palix    OPT=`grep "Option" $COCCI | cut -d':' -f2`
471e9dea2aSNicolas Palix
481e9dea2aSNicolas Palix#   The option '-parse_cocci' can be used to syntaxically check the SmPL files.
491e9dea2aSNicolas Palix#
501e9dea2aSNicolas Palix#    $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null
511e9dea2aSNicolas Palix
521e9dea2aSNicolas Palix    if [ "$ONLINE" = "0" ] ; then
531e9dea2aSNicolas Palix
541e9dea2aSNicolas Palix	FILE=`echo $COCCI | sed "s|$srctree/||"`
5574425eeeSNicolas Palix
563c908417SNicolas Palix	echo "Processing `basename $COCCI`"
573c908417SNicolas Palix	echo "with option(s) \"$OPT\""
583c908417SNicolas Palix	echo ''
5974425eeeSNicolas Palix	echo 'Message example to submit a patch:'
6074425eeeSNicolas Palix
613c908417SNicolas Palix	sed -ne 's|^///||p' $COCCI
6274425eeeSNicolas Palix
6374425eeeSNicolas Palix	echo ' The semantic patch that makes this change is available'
6474425eeeSNicolas Palix	echo " in $FILE."
6574425eeeSNicolas Palix	echo ''
6674425eeeSNicolas Palix	echo ' More information about semantic patching is available at'
6774425eeeSNicolas Palix	echo ' http://coccinelle.lip6.fr/'
6874425eeeSNicolas Palix	echo ''
6974425eeeSNicolas Palix
703c908417SNicolas Palix	if [ "`sed -ne 's|^//#||p' $COCCI`" ] ; then
713c908417SNicolas Palix	    echo 'Semantic patch information:'
723c908417SNicolas Palix	    sed -ne 's|^//#||p' $COCCI
733c908417SNicolas Palix	    echo ''
743c908417SNicolas Palix	fi
75*2c1160c8SNicolas Palix    fi
763c908417SNicolas Palix
77*2c1160c8SNicolas Palix    if [ "$MODE" = "chain" ] ; then
78*2c1160c8SNicolas Palix	$SPATCH -D patch   $FLAGS -sp_file $COCCI $OPT $OPTIONS || \
79*2c1160c8SNicolas Palix	$SPATCH -D report  $FLAGS -sp_file $COCCI $OPT $OPTIONS || \
80*2c1160c8SNicolas Palix	$SPATCH -D context $FLAGS -sp_file $COCCI $OPT $OPTIONS || \
81*2c1160c8SNicolas Palix	$SPATCH -D org     $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
821e9dea2aSNicolas Palix    else
831e9dea2aSNicolas Palix	$SPATCH -D $MODE   $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
841e9dea2aSNicolas Palix    fi
8574425eeeSNicolas Palix
8674425eeeSNicolas Palix}
8774425eeeSNicolas Palix
8874425eeeSNicolas Palixif [ "$COCCI" = "" ] ; then
8974425eeeSNicolas Palix    for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do
901e9dea2aSNicolas Palix	coccinelle $f
9174425eeeSNicolas Palix    done
9274425eeeSNicolas Palixelse
931e9dea2aSNicolas Palix    coccinelle $COCCI
9474425eeeSNicolas Palixfi
95