xref: /openbmc/linux/scripts/coccicheck (revision ca79522c)
1#!/bin/bash
2
3SPATCH="`which ${SPATCH:=spatch}`"
4
5# The verbosity may be set by the environmental parameter V=
6# as for example with 'make V=1 coccicheck'
7
8if [ -n "$V" -a "$V" != "0" ]; then
9	VERBOSE=1
10else
11	VERBOSE=0
12fi
13
14FLAGS="$SPFLAGS -very_quiet"
15
16# spatch only allows include directories with the syntax "-I include"
17# while gcc also allows "-Iinclude" and "-include include"
18COCCIINCLUDE=${LINUXINCLUDE//-I/-I }
19COCCIINCLUDE=${COCCIINCLUDE//-include/-I}
20
21if [ "$C" = "1" -o "$C" = "2" ]; then
22    ONLINE=1
23
24    # Take only the last argument, which is the C file to test
25    shift $(( $# - 1 ))
26    OPTIONS="$COCCIINCLUDE $1"
27else
28    ONLINE=0
29    if [ "$KBUILD_EXTMOD" = "" ] ; then
30        OPTIONS="-dir $srctree $COCCIINCLUDE"
31    else
32        OPTIONS="-dir $KBUILD_EXTMOD $COCCIINCLUDE"
33    fi
34fi
35
36if [ "$KBUILD_EXTMOD" != "" ] ; then
37    OPTIONS="-patch $srctree $OPTIONS"
38fi
39
40if [ ! -x "$SPATCH" ]; then
41    echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
42    exit 1
43fi
44
45if [ "$MODE" = "" ] ; then
46    if [ "$ONLINE" = "0" ] ; then
47	echo 'You have not explicitly specified the mode to use. Using default "chain" mode.'
48	echo 'All available modes will be tried (in that order): patch, report, context, org'
49	echo 'You can specify the mode with "make coccicheck MODE=<mode>"'
50    fi
51    MODE="chain"
52elif [ "$MODE" = "report" -o "$MODE" = "org" ] ; then
53    FLAGS="$FLAGS -no_show_diff"
54fi
55
56if [ "$ONLINE" = "0" ] ; then
57    echo ''
58    echo 'Please check for false positives in the output before submitting a patch.'
59    echo 'When using "patch" mode, carefully review the patch before submitting it.'
60    echo ''
61fi
62
63run_cmd() {
64	if [ $VERBOSE -ne 0 ] ; then
65		echo "Running: $@"
66	fi
67	eval $@
68}
69
70
71coccinelle () {
72    COCCI="$1"
73
74    OPT=`grep "Option" $COCCI | cut -d':' -f2`
75
76#   The option '-parse_cocci' can be used to syntactically check the SmPL files.
77#
78#    $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null
79
80    if [ $VERBOSE -ne 0 -a $ONLINE -eq 0 ] ; then
81
82	FILE=`echo $COCCI | sed "s|$srctree/||"`
83
84	echo "Processing `basename $COCCI`"
85	echo "with option(s) \"$OPT\""
86	echo ''
87	echo 'Message example to submit a patch:'
88
89	sed -ne 's|^///||p' $COCCI
90
91	if [ "$MODE" = "patch" ] ; then
92	    echo ' The semantic patch that makes this change is available'
93	elif [ "$MODE" = "report" ] ; then
94	    echo ' The semantic patch that makes this report is available'
95	elif [ "$MODE" = "context" ] ; then
96	    echo ' The semantic patch that spots this code is available'
97	elif [ "$MODE" = "org" ] ; then
98	    echo ' The semantic patch that makes this Org report is available'
99	else
100	    echo ' The semantic patch that makes this output is available'
101	fi
102	echo " in $FILE."
103	echo ''
104	echo ' More information about semantic patching is available at'
105	echo ' http://coccinelle.lip6.fr/'
106	echo ''
107
108	if [ "`sed -ne 's|^//#||p' $COCCI`" ] ; then
109	    echo 'Semantic patch information:'
110	    sed -ne 's|^//#||p' $COCCI
111	    echo ''
112	fi
113    fi
114
115    if [ "$MODE" = "chain" ] ; then
116	run_cmd $SPATCH -D patch   \
117		$FLAGS -sp_file $COCCI $OPT $OPTIONS               || \
118	run_cmd $SPATCH -D report  \
119		$FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || \
120	run_cmd $SPATCH -D context \
121		$FLAGS -sp_file $COCCI $OPT $OPTIONS               || \
122	run_cmd $SPATCH -D org     \
123		$FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || exit 1
124    elif [ "$MODE" = "rep+ctxt" ] ; then
125	run_cmd $SPATCH -D report  \
126		$FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff && \
127	run_cmd $SPATCH -D context \
128		$FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
129    else
130	run_cmd $SPATCH -D $MODE   $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
131    fi
132
133}
134
135if [ "$COCCI" = "" ] ; then
136    for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do
137	coccinelle $f
138    done
139else
140    coccinelle $COCCI
141fi
142