1 #!/bin/bash 2 3 context=6 4 while true ; do 5 if [ "$1" = "-C" ] ; then 6 shift 7 context=$1 8 shift 9 continue 10 fi 11 if [ "$1" = "-k" ] ; then 12 shift 13 mode=kernel 14 continue 15 fi 16 if [ "$1" = "-b" ] ; then 17 shift 18 nobreak=yes 19 continue 20 fi 21 break 22 done 23 24 25 file=$1 26 if [[ "$file" = "" ]] ; then 27 echo "Usage: $0 [-C <lines>] [-b] [-k] <file with smatch messages>" 28 echo " -C <lines>: Print <lines> of context" 29 echo " -b : Ignore unreachable break statements" 30 echo " -k : Ignore some kernel defines" 31 exit 1 32 fi 33 34 kernel_ignore_functions="DLM_ASSERT 35 BT_SI_SM_RETURN 36 BT_STATE_CHANGE 37 PARSE_ERROR1 38 PARSE_ERROR 39 CMDINSIZE 40 PROCESS_SYSTEM_PARAM 41 RETURN_STATUS 42 ar9170_regwrite_result 43 module_put_and_exit 44 SEG32 45 CASE_PIPExTRE 46 " 47 48 grep 'ignoring unreachable' $file | cut -d ' ' -f1 | while read loc; do 49 code_file=$(echo $loc | cut -d ':' -f 1) 50 line=$(echo $loc | cut -d ':' -f 2) 51 52 if [ "$mode" = "kernel" ] ; then 53 # BUG() is sometimes defined away on embedded systems 54 if tail -n +$(($line - 1)) $code_file | head -n 1 | \ 55 egrep -qw '(BUG|BT_STATE_CHANGE)' ; then 56 continue; 57 fi 58 skip=0 59 line_txt=$(tail -n +$(($line)) $code_file | head -n 1) 60 for func in $kernel_ignore_functions ; do 61 if echo "$line_txt" | egrep -qw $func ; then 62 skip=1 63 break 64 fi 65 done 66 if [ "$skip" == 1 ] ; then 67 continue 68 fi 69 fi 70 71 if [ "$nobreak" = "yes" ] ; then 72 if tail -n +$(($line)) $code_file | head -n 1 | grep -qw 'break' ; then 73 continue; 74 fi 75 76 fi 77 echo "=========================================================" 78 echo $code_file:$line 79 tail -n +$(($line - ($context - 1))) $code_file | head -n $(($context - 1)) 80 echo "---------------------------------------------------------" 81 tail -n +${line} $code_file | head -n $context 82 done 83