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