blob: f9293ab04a8bb879bc1dee83d8fa1ccc0159cb89 [file] [log] [blame]
Nicolas Palix9e395552013-03-02 22:36:26 +01001#!/bin/bash
Nicolas Palix74425ee2010-06-06 17:15:01 +02002
Nicolas Palixec979462013-07-03 16:41:01 +02003#
4# This script requires at least spatch
5# version 1.0.0-rc11.
6#
7
Luis R. Rodrigueza9e064c2016-06-29 15:14:57 -07008DIR="$(dirname $(readlink -f $0))/.."
Nicolas Palix74425ee2010-06-06 17:15:01 +02009SPATCH="`which ${SPATCH:=spatch}`"
10
Luis R. Rodriguez13d94862016-06-29 15:14:51 -070011if [ ! -x "$SPATCH" ]; then
12 echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
13 exit 1
14fi
15
Luis R. Rodrigueza9e064c2016-06-29 15:14:57 -070016SPATCH_VERSION=$($SPATCH --version | head -1 | awk '{print $3}')
17SPATCH_VERSION_NUM=$(echo $SPATCH_VERSION | ${DIR}/scripts/ld-version.sh)
18
Luis R. Rodriguezc930a1b2016-06-29 15:14:53 -070019USE_JOBS="no"
20$SPATCH --help | grep "\-\-jobs" > /dev/null && USE_JOBS="yes"
Kees Cook90d06a42013-06-18 14:49:29 -070021
Bernd Schubert26e56722013-01-29 17:03:37 +010022# The verbosity may be set by the environmental parameter V=
23# as for example with 'make V=1 coccicheck'
24
25if [ -n "$V" -a "$V" != "0" ]; then
Kees Cook90d06a42013-06-18 14:49:29 -070026 VERBOSE="$V"
Bernd Schubert26e56722013-01-29 17:03:37 +010027else
28 VERBOSE=0
29fi
30
Kees Cook90d06a42013-06-18 14:49:29 -070031if [ -z "$J" ]; then
32 NPROC=$(getconf _NPROCESSORS_ONLN)
33else
34 NPROC="$J"
35fi
36
Luis R. Rodriguez8e826ad2016-06-29 15:14:52 -070037FLAGS="--very-quiet"
Nicolas Palix9e395552013-03-02 22:36:26 +010038
Luis R. Rodriguez5c384db2016-06-29 15:14:55 -070039# You can use SPFLAGS to append extra arguments to coccicheck or override any
40# heuristics done in this file as Coccinelle accepts the last options when
41# options conflict.
42#
43# A good example for use of SPFLAGS is if you want to debug your cocci script,
44# you can for instance use the following:
45#
46# $ export COCCI=scripts/coccinelle/misc/irqf_oneshot.cocci
47# $ make coccicheck MODE=report DEBUG_FILE="all.err" SPFLAGS="--profile --show-trying" M=./drivers/mfd/arizona-irq.c
48#
49# "--show-trying" should show you what rule is being processed as it goes to
50# stdout, you do not need a debug file for that. The profile output will be
51# be sent to stdout, if you provide a DEBUG_FILE the profiling data can be
52# inspected there.
53#
54# --profile will not output if --very-quiet is used, so avoid it.
55echo $SPFLAGS | egrep -e "--profile|--show-trying" 2>&1 > /dev/null
56if [ $? -eq 0 ]; then
57 FLAGS="--quiet"
58fi
59
Nicolas Palix9e395552013-03-02 22:36:26 +010060# spatch only allows include directories with the syntax "-I include"
61# while gcc also allows "-Iinclude" and "-include include"
62COCCIINCLUDE=${LINUXINCLUDE//-I/-I }
Andrzej Hajda5b169102015-09-22 15:15:30 +020063COCCIINCLUDE=${COCCIINCLUDE// -include/ --include}
Nicolas Palix9e395552013-03-02 22:36:26 +010064
Nicolas Palix1e9dea22010-06-13 09:26:34 +020065if [ "$C" = "1" -o "$C" = "2" ]; then
66 ONLINE=1
67
Nicolas Palix9e395552013-03-02 22:36:26 +010068 # Take only the last argument, which is the C file to test
69 shift $(( $# - 1 ))
70 OPTIONS="$COCCIINCLUDE $1"
Nicolas Palix1e9dea22010-06-13 09:26:34 +020071else
72 ONLINE=0
Greg Dietsched0bc1fb2011-11-05 20:59:43 -050073 if [ "$KBUILD_EXTMOD" = "" ] ; then
Nicolas Palix93f14462013-06-20 13:10:56 +020074 OPTIONS="--dir $srctree $COCCIINCLUDE"
Greg Dietsched0bc1fb2011-11-05 20:59:43 -050075 else
Nicolas Palix93f14462013-06-20 13:10:56 +020076 OPTIONS="--dir $KBUILD_EXTMOD $COCCIINCLUDE"
Greg Dietsched0bc1fb2011-11-05 20:59:43 -050077 fi
Nicolas Palix1e9dea22010-06-13 09:26:34 +020078fi
79
Nicolas Palixbad6a402013-03-02 22:36:28 +010080if [ "$KBUILD_EXTMOD" != "" ] ; then
Nicolas Palix93f14462013-06-20 13:10:56 +020081 OPTIONS="--patch $srctree $OPTIONS"
Nicolas Palixbad6a402013-03-02 22:36:28 +010082fi
83
Luis R. Rodriguezc930a1b2016-06-29 15:14:53 -070084# You can override by using SPFLAGS
85if [ "$USE_JOBS" = "no" ]; then
86 trap kill_running SIGTERM SIGINT
87 declare -a SPATCH_PID
88elif [ "$NPROC" != "1" ]; then
89 # Using 0 should work as well, refer to _SC_NPROCESSORS_ONLN use on
90 # https://github.com/rdicosmo/parmap/blob/master/setcore_stubs.c
91 OPTIONS="$OPTIONS --jobs $NPROC --chunksize 1"
92fi
93
Nicolas Palix74425ee2010-06-06 17:15:01 +020094if [ "$MODE" = "" ] ; then
Nicolas Palix1e9dea22010-06-13 09:26:34 +020095 if [ "$ONLINE" = "0" ] ; then
Nicolas Palix1f0a6742013-06-06 23:39:52 +020096 echo 'You have not explicitly specified the mode to use. Using default "report" mode.'
97 echo 'Available modes are the following: patch, report, context, org'
Nicolas Palix1e9dea22010-06-13 09:26:34 +020098 echo 'You can specify the mode with "make coccicheck MODE=<mode>"'
Nicolas Palix1f0a6742013-06-06 23:39:52 +020099 echo 'Note however that some modes are not implemented by some semantic patches.'
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200100 fi
Nicolas Palix1f0a6742013-06-06 23:39:52 +0200101 MODE="report"
102fi
103
104if [ "$MODE" = "chain" ] ; then
105 if [ "$ONLINE" = "0" ] ; then
106 echo 'You have selected the "chain" mode.'
107 echo 'All available modes will be tried (in that order): patch, report, context, org'
108 fi
Nicolas Palix03ee0c42010-10-08 21:27:41 +0200109elif [ "$MODE" = "report" -o "$MODE" = "org" ] ; then
Deepa Dinamani7a2358b2016-06-12 12:04:39 -0700110 FLAGS="--no-show-diff $FLAGS"
Nicolas Palix74425ee2010-06-06 17:15:01 +0200111fi
112
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200113if [ "$ONLINE" = "0" ] ; then
114 echo ''
115 echo 'Please check for false positives in the output before submitting a patch.'
116 echo 'When using "patch" mode, carefully review the patch before submitting it.'
117 echo ''
118fi
Nicolas Palix74425ee2010-06-06 17:15:01 +0200119
Luis R. Rodriguezc930a1b2016-06-29 15:14:53 -0700120run_cmd_parmap() {
121 if [ $VERBOSE -ne 0 ] ; then
122 echo "Running ($NPROC in parallel): $@"
123 fi
Luis R. Rodriguezbe1fa902016-06-29 15:14:54 -0700124 if [ "$DEBUG_FILE" != "/dev/null" -a "$DEBUG_FILE" != "" ]; then
125 if [ -f $DEBUG_FILE ]; then
126 echo "Debug file $DEBUG_FILE exists, bailing"
127 exit
128 fi
129 else
130 DEBUG_FILE="/dev/null"
131 fi
132 $@ 2>$DEBUG_FILE
Luis R. Rodriguezc930a1b2016-06-29 15:14:53 -0700133 if [[ $? -ne 0 ]]; then
134 echo "coccicheck failed"
135 exit $?
136 fi
137}
138
139run_cmd_old() {
Kees Cook90d06a42013-06-18 14:49:29 -0700140 local i
Bernd Schubert53032652013-01-29 17:03:42 +0100141 if [ $VERBOSE -ne 0 ] ; then
Kees Cook90d06a42013-06-18 14:49:29 -0700142 echo "Running ($NPROC in parallel): $@"
Bernd Schubert53032652013-01-29 17:03:42 +0100143 fi
Kees Cook90d06a42013-06-18 14:49:29 -0700144 for i in $(seq 0 $(( NPROC - 1)) ); do
Nicolas Palix93f14462013-06-20 13:10:56 +0200145 eval "$@ --max $NPROC --index $i &"
Kees Cook90d06a42013-06-18 14:49:29 -0700146 SPATCH_PID[$i]=$!
147 if [ $VERBOSE -eq 2 ] ; then
148 echo "${SPATCH_PID[$i]} running"
149 fi
150 done
151 wait
Bernd Schubert53032652013-01-29 17:03:42 +0100152}
153
Luis R. Rodriguezc930a1b2016-06-29 15:14:53 -0700154run_cmd() {
155 if [ "$USE_JOBS" = "yes" ]; then
156 run_cmd_parmap $@
157 else
158 run_cmd_old $@
159 fi
160}
161
Kees Cook90d06a42013-06-18 14:49:29 -0700162kill_running() {
Kees Cook2552a392016-05-16 05:55:58 -0700163 for i in $(seq 0 $(( NPROC - 1 )) ); do
Kees Cook90d06a42013-06-18 14:49:29 -0700164 if [ $VERBOSE -eq 2 ] ; then
165 echo "Killing ${SPATCH_PID[$i]}"
166 fi
167 kill ${SPATCH_PID[$i]} 2>/dev/null
168 done
169}
Bernd Schubert53032652013-01-29 17:03:42 +0100170
Luis R. Rodriguez8e826ad2016-06-29 15:14:52 -0700171# You can override heuristics with SPFLAGS, these must always go last
172OPTIONS="$OPTIONS $SPFLAGS"
173
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200174coccinelle () {
Nicolas Palix74425ee2010-06-06 17:15:01 +0200175 COCCI="$1"
Nicolas Palix74425ee2010-06-06 17:15:01 +0200176
177 OPT=`grep "Option" $COCCI | cut -d':' -f2`
Luis R. Rodrigueza9e064c2016-06-29 15:14:57 -0700178 REQ=`grep "Requires" $COCCI | cut -d':' -f2 | sed "s| ||"`
179 REQ_NUM=$(echo $REQ | ${DIR}/scripts/ld-version.sh)
180 if [ "$REQ_NUM" != "0" ] ; then
181 if [ "$SPATCH_VERSION_NUM" -lt "$REQ_NUM" ] ; then
182 echo "Skipping coccinele SmPL patch: $COCCI"
183 echo "You have coccinelle: $SPATCH_VERSION"
184 echo "This SmPL patch requires: $REQ"
185 return
186 fi
187 fi
Nicolas Palix74425ee2010-06-06 17:15:01 +0200188
Nicolas Palix93f14462013-06-20 13:10:56 +0200189# The option '--parse-cocci' can be used to syntactically check the SmPL files.
Nicolas Palix74425ee2010-06-06 17:15:01 +0200190#
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200191# $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null
Nicolas Palix74425ee2010-06-06 17:15:01 +0200192
Nicolas Palix35d88a32013-03-02 22:36:25 +0100193 if [ $VERBOSE -ne 0 -a $ONLINE -eq 0 ] ; then
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200194
195 FILE=`echo $COCCI | sed "s|$srctree/||"`
196
Nicolas Palix3c908412010-10-08 21:27:38 +0200197 echo "Processing `basename $COCCI`"
198 echo "with option(s) \"$OPT\""
199 echo ''
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200200 echo 'Message example to submit a patch:'
201
Nicolas Palix3c908412010-10-08 21:27:38 +0200202 sed -ne 's|^///||p' $COCCI
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200203
Nicolas Palix062c1822010-10-24 23:37:34 +0200204 if [ "$MODE" = "patch" ] ; then
205 echo ' The semantic patch that makes this change is available'
206 elif [ "$MODE" = "report" ] ; then
207 echo ' The semantic patch that makes this report is available'
208 elif [ "$MODE" = "context" ] ; then
209 echo ' The semantic patch that spots this code is available'
210 elif [ "$MODE" = "org" ] ; then
211 echo ' The semantic patch that makes this Org report is available'
212 else
213 echo ' The semantic patch that makes this output is available'
214 fi
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200215 echo " in $FILE."
216 echo ''
217 echo ' More information about semantic patching is available at'
218 echo ' http://coccinelle.lip6.fr/'
219 echo ''
220
Nicolas Palix3c908412010-10-08 21:27:38 +0200221 if [ "`sed -ne 's|^//#||p' $COCCI`" ] ; then
222 echo 'Semantic patch information:'
223 sed -ne 's|^//#||p' $COCCI
224 echo ''
225 fi
Nicolas Palix2c1160c82010-10-08 21:27:40 +0200226 fi
Nicolas Palix3c908412010-10-08 21:27:38 +0200227
Nicolas Palix2c1160c82010-10-08 21:27:40 +0200228 if [ "$MODE" = "chain" ] ; then
Bernd Schubert53032652013-01-29 17:03:42 +0100229 run_cmd $SPATCH -D patch \
Nicolas Palix93f14462013-06-20 13:10:56 +0200230 $FLAGS --cocci-file $COCCI $OPT $OPTIONS || \
Bernd Schubert53032652013-01-29 17:03:42 +0100231 run_cmd $SPATCH -D report \
Nicolas Palix93f14462013-06-20 13:10:56 +0200232 $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || \
Bernd Schubert53032652013-01-29 17:03:42 +0100233 run_cmd $SPATCH -D context \
Nicolas Palix93f14462013-06-20 13:10:56 +0200234 $FLAGS --cocci-file $COCCI $OPT $OPTIONS || \
Bernd Schubert53032652013-01-29 17:03:42 +0100235 run_cmd $SPATCH -D org \
Nicolas Palix93f14462013-06-20 13:10:56 +0200236 $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || exit 1
Nicolas Palixc05cd6d2012-09-20 22:30:46 +0200237 elif [ "$MODE" = "rep+ctxt" ] ; then
Bernd Schubert53032652013-01-29 17:03:42 +0100238 run_cmd $SPATCH -D report \
Nicolas Palix93f14462013-06-20 13:10:56 +0200239 $FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff && \
Bernd Schubert53032652013-01-29 17:03:42 +0100240 run_cmd $SPATCH -D context \
Nicolas Palix93f14462013-06-20 13:10:56 +0200241 $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200242 else
Nicolas Palix93f14462013-06-20 13:10:56 +0200243 run_cmd $SPATCH -D $MODE $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200244 fi
245
Nicolas Palix74425ee2010-06-06 17:15:01 +0200246}
247
248if [ "$COCCI" = "" ] ; then
249 for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200250 coccinelle $f
Nicolas Palix74425ee2010-06-06 17:15:01 +0200251 done
252else
Nicolas Palix1e9dea22010-06-13 09:26:34 +0200253 coccinelle $COCCI
Nicolas Palix74425ee2010-06-06 17:15:01 +0200254fi