xref: /linux/scripts/coccicheck (revision b43ab901d671e3e3cad425ea5e9a3c74e266dcdd)
1#!/bin/sh
2
3SPATCH="`which ${SPATCH:=spatch}`"
4
5if [ "$C" = "1" -o "$C" = "2" ]; then
6    ONLINE=1
7
8# This requires Coccinelle >= 0.2.3
9#    FLAGS="-ignore_unknown_options -very_quiet"
10#    OPTIONS=$*
11
12    if [ "$KBUILD_EXTMOD" = "" ] ; then
13        # Workaround for Coccinelle < 0.2.3
14        FLAGS="-I $srctree/include -very_quiet"
15        shift $(( $# - 1 ))
16        OPTIONS=$1
17    else
18	echo M= is not currently supported when C=1 or C=2
19	exit 1
20    fi
21else
22    ONLINE=0
23    FLAGS="-very_quiet"
24    if [ "$KBUILD_EXTMOD" = "" ] ; then
25        OPTIONS="-dir $srctree"
26    else
27        OPTIONS="-dir $KBUILD_EXTMOD -patch $srctree -I $srctree/include -I $KBUILD_EXTMOD/include"
28    fi
29fi
30
31if [ ! -x "$SPATCH" ]; then
32    echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
33    exit 1
34fi
35
36if [ "$MODE" = "" ] ; then
37    if [ "$ONLINE" = "0" ] ; then
38	echo 'You have not explicitly specified the mode to use. Using default "chain" mode.'
39	echo 'All available modes will be tried (in that order): patch, report, context, org'
40	echo 'You can specify the mode with "make coccicheck MODE=<mode>"'
41    fi
42    MODE="chain"
43elif [ "$MODE" = "report" -o "$MODE" = "org" ] ; then
44    FLAGS="$FLAGS -no_show_diff"
45fi
46
47if [ "$ONLINE" = "0" ] ; then
48    echo ''
49    echo 'Please check for false positives in the output before submitting a patch.'
50    echo 'When using "patch" mode, carefully review the patch before submitting it.'
51    echo ''
52fi
53
54coccinelle () {
55    COCCI="$1"
56
57    OPT=`grep "Option" $COCCI | cut -d':' -f2`
58
59#   The option '-parse_cocci' can be used to syntactically check the SmPL files.
60#
61#    $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null
62
63    if [ "$ONLINE" = "0" ] ; then
64
65	FILE=`echo $COCCI | sed "s|$srctree/||"`
66
67	echo "Processing `basename $COCCI`"
68	echo "with option(s) \"$OPT\""
69	echo ''
70	echo 'Message example to submit a patch:'
71
72	sed -ne 's|^///||p' $COCCI
73
74	if [ "$MODE" = "patch" ] ; then
75	    echo ' The semantic patch that makes this change is available'
76	elif [ "$MODE" = "report" ] ; then
77	    echo ' The semantic patch that makes this report is available'
78	elif [ "$MODE" = "context" ] ; then
79	    echo ' The semantic patch that spots this code is available'
80	elif [ "$MODE" = "org" ] ; then
81	    echo ' The semantic patch that makes this Org report is available'
82	else
83	    echo ' The semantic patch that makes this output is available'
84	fi
85	echo " in $FILE."
86	echo ''
87	echo ' More information about semantic patching is available at'
88	echo ' http://coccinelle.lip6.fr/'
89	echo ''
90
91	if [ "`sed -ne 's|^//#||p' $COCCI`" ] ; then
92	    echo 'Semantic patch information:'
93	    sed -ne 's|^//#||p' $COCCI
94	    echo ''
95	fi
96    fi
97
98    if [ "$MODE" = "chain" ] ; then
99	$SPATCH -D patch   $FLAGS -sp_file $COCCI $OPT $OPTIONS               || \
100	$SPATCH -D report  $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || \
101	$SPATCH -D context $FLAGS -sp_file $COCCI $OPT $OPTIONS               || \
102	$SPATCH -D org     $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || exit 1
103    else
104	$SPATCH -D $MODE   $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
105    fi
106
107}
108
109if [ "$COCCI" = "" ] ; then
110    for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do
111	coccinelle $f
112    done
113else
114    coccinelle $COCCI
115fi
116