Commit | Line | Data |
---|---|---|
6c2dd77e MN |
1 | #!/bin/sh |
2 | ||
3 | TMP=patcheck.tmp | |
4 | OPT="-nH" | |
5 | #FILES=`grep '^+++' $* | sed 's/+++ //g'` | |
6 | ||
7 | echo patCHeck 1e10.0 | |
8 | echo This tool is intended to help a human check/review patches it is very far from | |
9 | echo being free of false positives and negatives, its output are just hints of what | |
10 | echo may or may not be bad. When you use it and it misses something or detects | |
11 | echo something wrong, fix it and send a patch to the ffmpeg-dev ML | |
12 | echo License:GPL Autor: Michael Niedermayer | |
13 | ||
14 | ERE_PRITYP='(unsigned *|)(char|short|long|int|long *int|short *int|void|float|double|(u|)int(8|16|32|64)_t)' | |
15 | ERE_TYPES='(const|static|av_cold|inline| *)*('$ERE_PRITYP'|[a-zA-Z][a-zA-Z0-9_]*)[* ]{1,}[a-zA-Z][a-zA-Z0-9_]*' | |
16 | ERE_FUNCS="$ERE_TYPES"' *\(' | |
17 | ||
18 | hiegrep(){ | |
19 | arg="$1" | |
20 | msg="$2" | |
21 | shift 2 | |
22 | grep $OPT '^+' $* | grep -v ':+++'| egrep --color=always -- "$arg"> $TMP && echo -e "\n$msg" | |
23 | cat $TMP | |
24 | } | |
25 | ||
3d8f9025 MN |
26 | hiegrep2(){ |
27 | arg="$1" | |
28 | varg="$2" | |
29 | msg="$3" | |
30 | shift 3 | |
31 | grep $OPT '^+' $* | grep -v ':+++' | egrep -v -- "$varg" | egrep --color=always -- "$arg" > $TMP && echo -e "\n$msg" | |
32 | cat $TMP | |
33 | } | |
34 | ||
6c2dd77e MN |
35 | hiegrep '[[:space:]]$' 'trailing whitespace' $* |
36 | hiegrep "`echo x | tr 'x' '\t'`" 'tabs' $* | |
37 | #hiegrep ':\+$' 'Empty lines' $* | |
38 | hiegrep ';;' 'double ;' $* | |
74892f7a | 39 | hiegrep2 '\b_[a-zA-Z0-9_]{1,}' '__(asm|attribute)([^a-zA-Z0-9]|$)' 'reserved identifer' $* |
6c2dd77e MN |
40 | hiegrep '//[-/<\* ]*$' 'empty comment' $* |
41 | hiegrep '/\*[-<\* ]*\*/' 'empty comment' $* | |
42 | hiegrep 'for *\( *'"$ERE_PRITYP"' ' 'not gcc 2.95 compatible' $* | |
be3e68b2 | 43 | hiegrep '(static|inline|const) *\1' 'duplicate word' $* |
6c2dd77e | 44 | |
3d8f9025 | 45 | hiegrep2 '(int|unsigned|static|void)[a-zA-Z0-9 _]*(init|end)[a-zA-Z0-9 _]*\(.*[^;]$' '(av_cold|:\+[^a-zA-Z_])' 'These functions may need av_cold, please review the whole patch for similar functions needing av_cold' $* |
6c2dd77e MN |
46 | |
47 | hiegrep '\+= *1 *;' 'can be simplified to ++' $* | |
48 | hiegrep '-= *1 *;' 'can be simplified to --' $* | |
49 | hiegrep '((!|=)= *(0|NULL)[^0-9a-z]|[^0-9a-z](0|NULL) *(!|=)=)' 'x==0 / x!=0 can be simplified to !x / x' $* | |
50 | ||
51 | egrep $OPT '^\+ *(const *|)static' $*| egrep --color=always '[^=]= *(0|NULL)[^0-9a-zA-Z]'> $TMP && echo -e '\nuseless 0 init' | |
52 | cat $TMP | |
53 | hiegrep '# *ifdef * (HAVE|CONFIG)_' 'ifdefs that should be #if' $* | |
54 | ||
55 | hiegrep '\b(awnser|cant|dont|quantised|quantisation|teh|wont)\b' 'common typos' $* | |
56 | ||
57 | hiegrep 'av_log\( *NULL' 'Missing context in av_log' $* | |
58 | hiegrep '[^sn]printf' 'Please use av_log' $* | |
59 | hiegrep '\bmalloc' 'Please use av_malloc' $* | |
60 | hiegrep '\) *av_malloc' 'useless casts' $* | |
61 | hiegrep ':\+ *'"$ERE_PRITYP"' *inline' 'non static inline or strangely ordered inline+static' $* | |
62 | hiegrep "$ERE_FUNCS"' *\)' 'missing void' $* | |
63 | hiegrep '(sprintf|strcat|strcpy)' 'Possible security issue, make sure this is safe or use snprintf/av_strl*' $* | |
64 | hiegrep '/ *(2|4|8|16|32|64|128|256|512|1024|2048|4096|8192|16384|32768|65536)[^0-9]' 'divide by 2^x could use >> maybe' $* | |
65 | hiegrep '#(el|)if *(0|1)' 'useless #if' $* | |
66 | hiegrep 'if *\( *(0|1) *\)' 'useless if()' $* | |
67 | hiegrep '& *[a-zA-Z0-9_]* *\[ *0 *\]' 'useless & [0]' $* | |
68 | hiegrep '(\( *[0-9] *(&&|\|\|)|(&&|\|\|) *[0-9] *\))' 'overriding condition' $* | |
69 | ||
3d8f9025 | 70 | hiegrep2 '\.long_name *=' 'NULL_IF_CONFIG_SMAL' 'missing NULL_IF_CONFIG_SMAL' $* |
6c2dd77e MN |
71 | |
72 | #egrep $OPT '^\+.*const ' $*| grep -v 'static'> $TMP && echo -e '\nnon static const' | |
73 | #cat $TMP | |
74 | ||
3d8f9025 | 75 | hiegrep2 "$ERE_TYPES" '(static|av_|ff_|typedef|:\+[^a-zA-Z_])' 'Non static with no ff_/av_ prefix' $* |
6c2dd77e MN |
76 | |
77 | hiegrep ':\+[^}]*else' 'missing } prior to else' $* | |
78 | ||
79 | #FIXME this should print the previous statement maybe | |
80 | hiegrep ':\+ *{ *$' '{ should be on the same line as the related previous statement' $* | |
81 | ||
82 | ||
83 | rm $TMP | |
84 | for i in `grep -H '^+.*@param' $*| sed 's/^\([^:]*\):.*@param *\([a-zA-Z0-9_]*\) .*$/\1:\2/'` ; do | |
85 | doxpar=`echo $i | sed 's/^.*:\(.*\)$/\1/'` | |
86 | file=`echo $i | sed 's/^\([^:]*\):.*$/\1/'` | |
87 | grep " *$doxpar *[),]" $file | grep -v '@param' >/dev/null || grep --color=always "@param *$doxpar" $file >>$TMP | |
88 | done | |
89 | if test -e $TMP ; then | |
90 | echo -e '\nmismatching doxy params' | |
91 | cat $TMP | |
92 | fi | |
93 | ||
94 | egrep -B2 $OPT '^(\+|) *'"$ERE_TYPES" $* | egrep -A2 --color=always '(:|-)\+.*[^/]/(\*([^*]|$)|/([^/]|$))' > $TMP && echo -e "\n Non doxy comments" | |
95 | cat $TMP | |
96 | ||
97 | rm $TMP | |
98 | for i in \ | |
99 | `egrep -H '^\+ *'"$ERE_TYPES" $* |\ | |
100 | grep -v '(' | egrep -v '\Wgoto\W' |\ | |
101 | xargs -d '\n' -n 1 |\ | |
102 | grep -o '[* ][* ]*[a-zA-Z][0-9a-zA-Z_]* *[,;=]' |\ | |
103 | sed 's/.[* ]*\([a-zA-Z][0-9a-zA-Z_]*\) *[,;=]/\1/'` \ | |
104 | ; do | |
105 | echo $i | grep '^NULL$' && continue | |
106 | egrep $i' *(\+|-|\*|/|\||&|%|)=[^=]' $* >/dev/null || echo "possibly never written:"$i >> $TMP | |
107 | egrep '(=|\(|return).*'$i'[^=]*$' $* >/dev/null || echo "possibly never read :"$i >> $TMP | |
108 | egrep -o $i' *((\+|-|\*|/|\||&|%|)=[^=]|\+\+|--) *(0x|)[0-9]*(;|)' $* |\ | |
109 | egrep -v $i' *= *(0x|)[0-9]{1,};'>/dev/null || echo "possibly constant :"$i >> $TMP | |
110 | done | |
111 | if test -e $TMP ; then | |
112 | echo -e '\npossibly unused variables' | |
113 | cat $TMP | |
114 | fi | |
115 | ||
116 | grep '^Index:.*Changelog' $* >/dev/null || echo -e "\nMissing changelog entry (ignore if minor change)" | |
117 | ||
118 | cat $* | tr '\n' '@' | egrep --color=always -o '(fprintf|av_log|printf)\([^)]*\)[+ ;@]*\1' >$TMP && echo -e "\nMergeable calls" | |
119 | cat $TMP | tr '@' '\n' | |
120 | ||
121 | cat $* | tr '\n' '@' | egrep --color=always -o '\+ *if *\( *([A-Za-z0-9_]*) *[<>]=? *[0-9]* *\) * \1 *= *[0-9]* *;[ @\\+]*else *if *\( *\1 *[<>]=? *[0-9]* *\) *\1 *= *[0-9]* *;' >$TMP && echo -e "\nav_clip / av_clip_uint8 / av_clip_int16 / ..." | |
122 | cat $TMP | tr '@' '\n' | |
123 | ||
124 | cat $* | tr '\n' '@' | egrep --color=always -o '\+ *if *\( *([A-Za-z0-9_]*) *[<>]=? *([A-Za-z0-9_]*) *\)[ @\\+]*(\1|\2) *= *(\1|\2) *;' >$TMP && echo -e "\nFFMIN/FFMAX" | |
125 | cat $TMP | tr '@' '\n' | |
126 | ||
127 | cat $* | tr '\n' '@' | egrep --color=always -o '\+ *if *\( *([A-Za-z0-9_]*) *\)[ @\\+]*av_free(p|) *\( *(&|) *\1[^-.]' >$TMP && echo -e "\nav_free(NULL) is safe" | |
128 | cat $TMP | tr '@' '\n' | |
129 | ||
130 | cat $* | tr '\n' '@' | egrep --color=always -o '[^a-zA-Z0-9_]([a-zA-Z0-9_]*) *= *av_malloc *\([^)]*\)[ @;\\+]*memset *\( *\1' >$TMP && echo -e "\nav_mallocz()" | |
131 | cat $TMP | tr '@' '\n' | |
132 | ||
133 | ||
134 | # doesnt work | |
135 | #cat $* | tr '\n' '@' | egrep -o '[^a-zA-Z_0-9]([a-zA-Z][a-zA-Z_0-9]*) *=[^=].*\1' | egrep -o '[^a-zA-Z_0-9]([a-zA-Z][a-zA-Z_0-9]*) *=[^=].*\1 *=[^=]' >$TMP && echo -e "\nPossibly written 2x before read" | |
136 | #cat $TMP | tr '@' '\n' | |
137 | ||
138 | exit | |
139 | ||
140 | TODO/idea list: | |
141 | ||
142 | for all demuxers & muxers | |
143 | grep for "avctx->priv_data" | |
144 | ||
145 | vertical align = | |
146 | /* and * align | |
147 | arrays fitting in smaller types | |
148 | variables written to twice with no interspaced read | |
149 | memset(block, 0, 6*64*sizeof(DCTELEM)); -> clear_blocks | |
150 | check existence of long_name in AVCodec | |
151 | check that the patch does not touch codec & (de)muxer layer at the same time ->split | |
152 | ||
153 | write a regression test containing at least a line that triggers each warning once |