1 #!/usr/bin/env bash 2 # SPDX-License-Identifier: GPL-2.0 3 # Linux kernel coccicheck 4 # 5 # Read Documentation/dev-tools/coccinelle.rst 6 # 7 # This script requires at least spatch 8 # version 1.0.0-rc11. 9 10 DIR="$(dirname $(readlink -f $0))/.." 11 SPATCH="`which ${SPATCH:=spatch}`" 12 13 if [ ! -x "$SPATCH" ]; then 14 echo 'spatch is part of the Coccinelle pro 15 exit 1 16 fi 17 18 SPATCH_VERSION=$($SPATCH --version | head -1 | 19 20 USE_JOBS="no" 21 $SPATCH --help | grep -e "--jobs" > /dev/null 22 23 # The verbosity may be set by the environmenta 24 # as for example with 'make V=1 coccicheck' 25 26 if [ -n "$V" -a "$V" != "0" ]; then 27 VERBOSE="$V" 28 else 29 VERBOSE=0 30 fi 31 32 FLAGS="--very-quiet" 33 34 # You can use SPFLAGS to append extra argument 35 # heuristics done in this file as Coccinelle a 36 # options conflict. 37 # 38 # A good example for use of SPFLAGS is if you 39 # you can for instance use the following: 40 # 41 # $ export COCCI=scripts/coccinelle/misc/irqf_ 42 # $ make coccicheck MODE=report DEBUG_FILE="al 43 # 44 # "--show-trying" should show you what rule is 45 # stdout, you do not need a debug file for tha 46 # be sent to stdout, if you provide a DEBUG_FI 47 # inspected there. 48 # 49 # --profile will not output if --very-quiet is 50 echo $SPFLAGS | grep -E -e "--profile|--show-t 51 if [ $? -eq 0 ]; then 52 FLAGS="--quiet" 53 fi 54 55 # spatch only allows include directories with 56 # while gcc also allows "-Iinclude" and "-incl 57 COCCIINCLUDE=${LINUXINCLUDE//-I/-I } 58 COCCIINCLUDE=${COCCIINCLUDE// -include/ --incl 59 60 if [ "$C" = "1" -o "$C" = "2" ]; then 61 ONLINE=1 62 63 if [[ $# -le 0 ]]; then 64 echo '' 65 echo 'Specifying both the variable 66 command results in a shift count error.' 67 echo '' 68 echo 'Try specifying "scripts/cocc 69 echo '' 70 echo 'Example: make C=2 CHECK 71 echo '' 72 exit 1 73 fi 74 75 # Take only the last argument, which is th 76 shift $(( $# - 1 )) 77 OPTIONS="$COCCIINCLUDE $1" 78 79 # No need to parallelize Coccinelle since 80 NPROC=1 81 else 82 ONLINE=0 83 if [ "$KBUILD_EXTMOD" = "" ] ; then 84 OPTIONS="--dir $srctree $COCCIINCLUDE" 85 else 86 OPTIONS="--dir $KBUILD_EXTMOD $COCCIIN 87 fi 88 89 # Use only one thread per core by default 90 THREADS_PER_CORE=$(LANG=C lscpu | grep "Th 91 if [ -z "$J" ]; then 92 NPROC=$(getconf _NPROCESSORS_ONLN) 93 if [ $THREADS_PER_CORE -gt 1 -a $NPROC 94 NPROC=$((NPROC/2)) 95 fi 96 else 97 NPROC="$J" 98 fi 99 fi 100 101 if [ "$KBUILD_EXTMOD" != "" ] ; then 102 OPTIONS="--patch $srctree $OPTIONS" 103 fi 104 105 # You can override by using SPFLAGS 106 if [ "$USE_JOBS" = "no" ]; then 107 trap kill_running SIGTERM SIGINT 108 declare -a SPATCH_PID 109 elif [ "$NPROC" != "1" ]; then 110 # Using 0 should work as well, refer t 111 # https://github.com/rdicosmo/parmap/b 112 OPTIONS="$OPTIONS --jobs $NPROC --chun 113 fi 114 115 if [ "$MODE" = "" ] ; then 116 if [ "$ONLINE" = "0" ] ; then 117 echo 'You have not explicitly specifie 118 echo 'Available modes are the followin 119 echo 'You can specify the mode with "m 120 echo 'Note however that some modes are 121 fi 122 MODE="report" 123 fi 124 125 if [ "$MODE" = "chain" ] ; then 126 if [ "$ONLINE" = "0" ] ; then 127 echo 'You have selected the "chain" mo 128 echo 'All available modes will be trie 129 fi 130 elif [ "$MODE" = "report" -o "$MODE" = "org" ] 131 FLAGS="--no-show-diff $FLAGS" 132 fi 133 134 if [ "$ONLINE" = "0" ] ; then 135 echo '' 136 echo 'Please check for false positives in 137 echo 'When using "patch" mode, carefully r 138 echo '' 139 fi 140 141 run_cmd_parmap() { 142 if [ $VERBOSE -ne 0 ] ; then 143 echo "Running ($NPROC in paral 144 fi 145 if [ "$DEBUG_FILE" != "/dev/null" -a " 146 echo $@>>$DEBUG_FILE 147 $@ 2>>$DEBUG_FILE 148 else 149 echo $@ 150 $@ 2>&1 151 fi 152 153 err=$? 154 if [[ $err -ne 0 ]]; then 155 echo "coccicheck failed" 156 exit $err 157 fi 158 } 159 160 run_cmd_old() { 161 local i 162 if [ $VERBOSE -ne 0 ] ; then 163 echo "Running ($NPROC in paral 164 fi 165 for i in $(seq 0 $(( NPROC - 1)) ); do 166 eval "$@ --max $NPROC --index 167 SPATCH_PID[$i]=$! 168 if [ $VERBOSE -eq 2 ] ; then 169 echo "${SPATCH_PID[$i] 170 fi 171 done 172 wait 173 } 174 175 run_cmd() { 176 if [ "$USE_JOBS" = "yes" ]; then 177 run_cmd_parmap $@ 178 else 179 run_cmd_old $@ 180 fi 181 } 182 183 kill_running() { 184 for i in $(seq 0 $(( NPROC - 1 )) ); d 185 if [ $VERBOSE -eq 2 ] ; then 186 echo "Killing ${SPATCH 187 fi 188 kill ${SPATCH_PID[$i]} 2>/dev/ 189 done 190 } 191 192 # You can override heuristics with SPFLAGS, th 193 OPTIONS="$OPTIONS $SPFLAGS" 194 195 coccinelle () { 196 COCCI="$1" 197 198 OPT=`grep "Options:" $COCCI | cut -d':' -f 199 REQ=`grep "Requires:" $COCCI | cut -d':' - 200 if [ -n "$REQ" ] && ! { echo "$REQ"; echo 201 echo "Skipping coccinelle SmPL pat 202 echo "You have coccinelle: 203 echo "This SmPL patch requires: 204 return 205 fi 206 207 # The option '--parse-cocci' can be used to 208 # 209 # $SPATCH -D $MODE $FLAGS -parse_cocci $COC 210 211 if [ $VERBOSE -ne 0 -a $ONLINE -eq 0 ] ; t 212 213 FILE=${COCCI#$srctree/} 214 215 echo "Processing `basename $COCCI`" 216 echo "with option(s) \"$OPT\"" 217 echo '' 218 echo 'Message example to submit a patc 219 220 sed -ne 's|^///||p' $COCCI 221 222 if [ "$MODE" = "patch" ] ; then 223 echo ' The semantic patch that mak 224 elif [ "$MODE" = "report" ] ; then 225 echo ' The semantic patch that mak 226 elif [ "$MODE" = "context" ] ; then 227 echo ' The semantic patch that spo 228 elif [ "$MODE" = "org" ] ; then 229 echo ' The semantic patch that mak 230 else 231 echo ' The semantic patch that mak 232 fi 233 echo " in $FILE." 234 echo '' 235 echo ' More information about semantic 236 echo ' http://coccinelle.lip6.fr/' 237 echo '' 238 239 if [ "`sed -ne 's|^//#||p' $COCCI`" ] 240 echo 'Semantic patch information:' 241 sed -ne 's|^//#||p' $COCCI 242 echo '' 243 fi 244 fi 245 246 if [ "$MODE" = "chain" ] ; then 247 run_cmd $SPATCH -D patch \ 248 $FLAGS --cocci-file $COCCI $OP 249 run_cmd $SPATCH -D report \ 250 $FLAGS --cocci-file $COCCI $OP 251 run_cmd $SPATCH -D context \ 252 $FLAGS --cocci-file $COCCI $OP 253 run_cmd $SPATCH -D org \ 254 $FLAGS --cocci-file $COCCI $OP 255 elif [ "$MODE" = "rep+ctxt" ] ; then 256 run_cmd $SPATCH -D report \ 257 $FLAGS --cocci-file $COCCI $OP 258 run_cmd $SPATCH -D context \ 259 $FLAGS --cocci-file $COCCI $OP 260 else 261 run_cmd $SPATCH -D $MODE $FLAGS --co 262 fi 263 264 } 265 266 if [ "$DEBUG_FILE" != "/dev/null" -a "$DEBUG_F 267 if [ -f $DEBUG_FILE ]; then 268 echo "Debug file $DEBUG_FILE e 269 exit 270 fi 271 else 272 DEBUG_FILE="/dev/null" 273 fi 274 275 if [ "$COCCI" = "" ] ; then 276 for f in `find $srctree/scripts/coccinelle 277 coccinelle $f 278 done 279 else 280 coccinelle $COCCI 281 fi
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.