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