Statistics
| Branch: | Revision:

ffmpeg / tools / patcheck @ 5d6e4c16

History | View | Annotate | Download (8.07 KB)

1
#!/bin/sh
2

    
3
# if no argument provided, write stdin to a file and re-run the script
4
if [ $# = 0 ]; then
5
    cat > patcheck.stdout
6
    $0 patcheck.stdout
7
    rm -f patcheck.stdout
8
    exit
9
fi
10

    
11
TMP=patcheck.tmp
12
OPT="-nH"
13
#FILES=`grep '^+++' $* | sed 's/+++ //g'`
14

    
15
echo patCHeck 1e10.0
16
echo This tool is intended to help a human check/review patches it is very far from
17
echo being free of false positives and negatives, its output are just hints of what
18
echo may or may not be bad. When you use it and it misses something or detects
19
echo something wrong, fix it and send a patch to the ffmpeg-dev ML
20
echo License:GPL Autor: Michael Niedermayer
21

    
22
ERE_PRITYP='(unsigned *|)(char|short|long|int|long *int|short *int|void|float|double|(u|)int(8|16|32|64)_t)'
23
ERE_TYPES='(const|static|av_cold|inline| *)*('$ERE_PRITYP'|[a-zA-Z][a-zA-Z0-9_]*)[* ]{1,}[a-zA-Z][a-zA-Z0-9_]*'
24
ERE_FUNCS="$ERE_TYPES"' *\('
25

    
26
hiegrep(){
27
    arg="$1"
28
    msg="$2"
29
    shift 2
30
    grep $OPT '^+' $* | grep -v ':+++'| egrep --color=always -- "$arg"> $TMP && printf "\n$msg\n"
31
    cat $TMP
32
}
33

    
34
hiegrep2(){
35
    arg="$1"
36
    varg="$2"
37
    msg="$3"
38
    shift 3
39
    grep $OPT '^+' $* | grep -v ':+++' | egrep -v -- "$varg" | egrep --color=always -- "$arg" > $TMP && printf "\n$msg\n"
40
    cat $TMP
41
}
42

    
43
hiegrep '[[:space:]]$'    'trailing whitespace' $*
44
hiegrep "`echo x | tr 'x' '\t'`"         'tabs' $*
45
#hiegrep ':\+$'          'Empty lines' $*
46
hiegrep ';;'              'double ;' $*
47
hiegrep2 '\b_[a-zA-Z0-9_]{1,}' '__(asm|attribute)([^a-zA-Z0-9]|$)' 'reserved identifer' $*
48
hiegrep '//[-/<\* ]*$'    'empty comment' $*
49
hiegrep '/\*[-<\* ]*\*/'  'empty comment' $*
50
hiegrep 'for *\( *'"$ERE_PRITYP"' '  'not gcc 2.95 compatible' $*
51
hiegrep '(static|inline|const) *\1'  'duplicate word' $*
52
hiegrep 'INIT_VLC_USE_STATIC' 'forbidden ancient vlc type' $*
53
hiegrep '=[-+\*\&] ' 'looks like compound assignment' $*
54
hiegrep2 '/\*\* *[a-zA-Z0-9].*' '\*/' 'Inconsistently formatted doxygen comment' $*
55
hiegrep '; */\*\*[^<]' 'Misformatted doxygen comment' $*
56

    
57
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' $*
58

    
59
hiegrep '\+= *1 *;'     'can be simplified to ++' $*
60
hiegrep '-= *1 *;'      'can be simplified to --' $*
61
hiegrep '((!|=)= *(0|NULL)[^0-9a-z]|[^0-9a-z](0|NULL) *(!|=)=)' 'x==0 / x!=0 can be simplified to !x / x' $*
62

    
63
egrep $OPT '^\+ *(const *|)static' $*| egrep --color=always '[^=]= *(0|NULL)[^0-9a-zA-Z]'> $TMP && printf '\nuseless 0 init\n'
64
cat $TMP
65
hiegrep '# *ifdef * (HAVE|CONFIG)_' 'ifdefs that should be #if' $*
66

    
67
hiegrep '\b(awnser|cant|dont|quantised|quantisation|teh|wont)\b' 'common typos' $*
68

    
69
hiegrep 'av_log\( *NULL' 'Missing context in av_log' $*
70
hiegrep '[^sn]printf' 'Please use av_log' $*
71
hiegrep '\bmalloc' 'Please use av_malloc' $*
72
hiegrep '\) *av_malloc' 'useless casts' $*
73
hiegrep ':\+ *'"$ERE_PRITYP"' *inline' 'non static inline or strangely ordered inline+static' $*
74
hiegrep "$ERE_FUNCS"' *\)' 'missing void' $*
75
hiegrep '(sprintf|strcat|strcpy)' 'Possible security issue, make sure this is safe or use snprintf/av_strl*' $*
76
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' $*
77
hiegrep '#(el|)if *(0|1)' 'useless #if' $*
78
hiegrep 'if *\( *(0|1) *\)' 'useless if()' $*
79
hiegrep '& *[a-zA-Z0-9_]* *\[ *0 *\]' 'useless & [0]' $*
80
hiegrep '(\( *[0-9] *(&&|\|\|)|(&&|\|\|) *[0-9] *\))' 'overriding condition' $*
81
hiegrep '(:\+|,|;)( *|static|\*)*'"$ERE_PRITYP"' *\*( |\*)*(src|source|input|in[^a-z])' 'missing const?' $*
82
hiegrep '(:\+|,|;)( *|static|\*)*'"$ERE_PRITYP"' *(src|source|input|in)([0-9A-Z_][0-9A-Za-z_]*){1,} *\[' 'missing const (test2)?' $*
83
hiegrep ' *static *'"$ERE_FUNCS"'[^)]*\);' 'static prototype, maybe you should reorder your functions' $*
84
hiegrep '@file: *[a-zA-Z0-9_]' 'doxy filetag with filename can in the future cause problems when forgotten during a rename' $*
85

    
86
hiegrep2 '\.long_name *=' 'NULL_IF_CONFIG_SMAL' 'missing NULL_IF_CONFIG_SMAL' $*
87
hiegrep2 '\.pix_fmts *= *\(' 'const' 'missing const for pix_fmts array' $*
88
hiegrep2 '\.sample_fmts *= *\(' 'const' 'missing const for sample_fmts array' $*
89
hiegrep2 '\.supported_framerates *= *\(' 'const' 'missing const for supported_framerates array' $*
90
hiegrep2 '\.channel_layouts *= *\(' 'const' 'missing const for channel_layouts array' $*
91

    
92
#egrep $OPT '^\+.*const ' $*| grep -v 'static'> $TMP && printf '\nnon static const\n'
93
#cat $TMP
94

    
95
hiegrep2 "$ERE_TYPES" '(static|av_|ff_|typedef|:\+[^a-zA-Z_])' 'Non static with no ff_/av_ prefix' $*
96

    
97
hiegrep ':\+[^}#]*else' 'missing } prior to else' $*
98
hiegrep '(if|while|for)\(' 'missing whitespace between keyword and ( (feel free to ignore)' $*
99
hiegrep '(else|do){'       'missing whitespace between keyword and { (feel free to ignore)' $*
100
hiegrep '}(else|while)'    'missing whitespace between } and keyword (feel free to ignore)' $*
101

    
102
#FIXME this should print the previous statement maybe
103
hiegrep ':\+  *{ *$' '{ should be on the same line as the related previous statement' $*
104

    
105

    
106
rm $TMP
107
for i in `grep -H '^+.*@param' $*| sed 's/^\([^:]*\):.*@param\(\[.*\]\|\) *\([a-zA-Z0-9_]*\) .*$/\1:\3/'` ; do
108
    doxpar=`echo $i | sed 's/^.*:\(.*\)$/\1/'`
109
    file=`echo $i | sed 's/^\([^:]*\):.*$/\1/'`
110
    grep " *$doxpar *[),]" $file | grep -v '@param' >/dev/null || grep --color=always "@param *$doxpar" $file >>$TMP
111
done
112
if test -e $TMP ; then
113
    printf '\nmismatching doxy params\n'
114
    cat $TMP
115
fi
116

    
117
egrep -B2 $OPT '^(\+|) *('"$ERE_TYPES"'|# *define)' $* | egrep -A2 --color=always '(:|-)\+[^/]*/(\*([^*]|$)|/([^/]|$))' > $TMP && printf "\n Non doxy comments\n"
118
cat $TMP
119

    
120
rm $TMP
121
for i in \
122
    `egrep -H '^\+ *'"$ERE_TYPES" $* |\
123
    grep -v '(' | egrep -v '\Wgoto\W' |\
124
    xargs -d '\n' -n 1 |\
125
    grep -o '[* ][* ]*[a-zA-Z][0-9a-zA-Z_]* *[,;=]' |\
126
    sed 's/.[* ]*\([a-zA-Z][0-9a-zA-Z_]*\) *[,;=]/\1/'` \
127
    ; do
128
    echo $i | grep '^NULL$' && continue
129
    egrep $i' *(\+|-|\*|/|\||&|%|)=[^=]' $* >/dev/null || echo "possibly never written:"$i >> $TMP
130
    egrep '(=|\(|return).*'$i'(==|[^=])*$'    $* >/dev/null || echo "possibly never read   :"$i >> $TMP
131
    egrep -o $i' *((\+|-|\*|/|\||&|%|)=[^=]|\+\+|--) *(0x|)[0-9]*(;|)'   $* |\
132
           egrep -v $i' *= *(0x|)[0-9]{1,};'>/dev/null || echo "possibly constant     :"$i >> $TMP
133
done
134
if test -e $TMP ; then
135
    printf '\npossibly unused variables\n'
136
    cat $TMP
137
fi
138

    
139
grep '^+++ .*Changelog' $* >/dev/null || printf "\nMissing changelog entry (ignore if minor change)\n"
140

    
141
cat $* | tr '\n' '@' | egrep --color=always -o '(fprintf|av_log|printf)\([^)]*\)[+ ;@]*\1'  >$TMP && printf "\nMergeable calls\n"
142
cat $TMP | tr '@' '\n'
143

    
144
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 && printf "\nav_clip / av_clip_uint8 / av_clip_int16 / ...\n"
145
cat $TMP | tr '@' '\n'
146

    
147
cat $* | tr '\n' '@' | egrep --color=always -o '\+ *if *\( *([A-Za-z0-9_]*) *[<>]=? *([A-Za-z0-9_]*) *\)[ @\\+]*(\1|\2) *= *(\1|\2) *;'  >$TMP && printf "\nFFMIN/FFMAX\n"
148
cat $TMP | tr '@' '\n'
149

    
150
cat $* | tr '\n' '@' | egrep --color=always -o '\+ *if *\( *([A-Za-z0-9_]*) *\)[ @\\+]*av_free(p|) *\( *(&|) *\1[^-.]'  >$TMP && printf "\nav_free(NULL) is safe\n"
151
cat $TMP | tr '@' '\n'
152

    
153
cat $* | tr '\n' '@' | egrep --color=always -o '[^a-zA-Z0-9_]([a-zA-Z0-9_]*) *= *av_malloc *\([^)]*\)[ @;\\+]*memset *\( *\1'  >$TMP && printf "\nav_mallocz()\n"
154
cat $TMP | tr '@' '\n'
155

    
156

    
157
# doesnt work
158
#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 && printf "\nPossibly written 2x before read\n"
159
#cat $TMP | tr '@' '\n'
160

    
161
exit
162

    
163
TODO/idea list:
164

    
165
for all demuxers & muxers
166
    grep for "avctx->priv_data"
167

    
168
vertical align =
169
/* and * align
170
arrays fitting in smaller types
171
variables written to twice with no interspaced read
172
memset(block, 0, 6*64*sizeof(DCTELEM)); -> clear_blocks
173
check existence of long_name in AVCodec
174
check that the patch does not touch codec & (de)muxer layer at the same time ->split
175

    
176
write a regression test containing at least a line that triggers each warning once