3 # if no argument provided, write stdin to a file and re-run the script
15 #FILES=$($GREP '^+++' $* | sed 's/+++ //g')
18 echo This tool is intended to
help a human check
/review patches. It is very far from
19 echo being free of false positives and negatives
, and its output are just hints of what
20 echo may or may not be bad. When you use it and it misses something or detects
21 echo something wrong
, fix it and send a
patch to the ffmpeg-devel mailing list.
22 echo License
: GPL
, Author
: Michael Niedermayer
24 ERE_PRITYP
='(unsigned *|)(char|short|long|int|long *int|short *int|void|float|double|(u|)int(8|16|32|64)_t)'
25 ERE_TYPES
='(const|static|av_cold|inline| *)*('$ERE_PRITYP'|[a-zA-Z][a-zA-Z0-9_]*)[* ]{1,}[a-zA-Z][a-zA-Z0-9_]*'
26 ERE_FUNCS
="$ERE_TYPES"' *\('
32 $GREP $OPT '^+' $
* |
$GREP -v ':+++'|
$EGREP --color=always
-- "$arg"> $TMP && printf "\n$msg\n"
41 $GREP $OPT '^+' $
* |
$GREP -v ':+++' |
$EGREP -v -- "$varg" |
$EGREP --color=always
-- "$arg" > $TMP && printf "\n$msg\n"
45 hiegrep
'static[^(]*\*[a-zA-Z_]*\[' 'pointer array is not const' $
*
46 hiegrep
'[[:space:]]$' 'trailing whitespace' $
*
47 hiegrep
"$(echo x | tr 'x' '\t')" 'tabs' $
*
48 #hiegrep ':\+$' 'Empty lines' $*
49 hiegrep
';;' 'double ;' $
*
50 hiegrep2
'\b_[a-zA-Z0-9_]{1,}' '__(asm|attribute)([^a-zA-Z0-9]|$)' 'reserved identifer' $
*
51 hiegrep
'//[-/<\* ]*$' 'empty comment' $
*
52 hiegrep
'/\*[-<\* ]*\*/' 'empty comment' $
*
53 hiegrep
'for *\( *'"$ERE_PRITYP"' ' 'not gcc 2.95 compatible' $
*
54 hiegrep
'(static|inline|const) *\1[^_a-zA-Z]' 'duplicate word' $
*
55 hiegrep
'INIT_VLC_USE_STATIC' 'forbidden ancient vlc type' $
*
56 hiegrep
'=[-+\*\&] ' 'looks like compound assignment' $
*
57 hiegrep2
'/\*\* *[a-zA-Z0-9].*' '\*/' 'Inconsistently formatted doxygen comment' $
*
58 hiegrep
'; */\*\*[^<]' 'Misformatted doxygen comment' $
*
59 hiegrep
'//!|/\*!' 'inconsistent doxygen syntax' $
*
61 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' $
*
63 hiegrep
'\+= *1 *;' 'can be simplified to ++' $
*
64 hiegrep
'-= *1 *;' 'can be simplified to --' $
*
65 hiegrep
'((!|=)= *(0|NULL)[^0-9a-z]|[^0-9a-z](0|NULL) *(!|=)=)' 'x==0 / x!=0 can be simplified to !x / x' $
*
67 $EGREP $OPT '^\+ *(const *|)static' $
*|
$EGREP --color=always
'[^=]= *(0|NULL)[^0-9a-zA-Z]'> $TMP && printf '\nuseless 0 init\n'
69 hiegrep
'# *ifdef * (HAVE|CONFIG)_' 'ifdefs that should be #if' $
*
71 hiegrep
'\b(awnser|cant|dont|wont|doesnt|usefull|successfull|occured|teh|alot|wether|skiped|skiping|heigth|informations|colums|loosy|loosing|ouput|seperate|preceed|upto|paket|posible|unkown|inpossible|dimention|acheive|funtions|overriden|outputing|seperation|initalize|compatibilty|bistream|knwon|unknwon|choosen|additonal|gurantee|availble|wich)\b' 'common typos' $
*
73 hiegrep
'av_log\( *NULL' 'Missing context in av_log' $
*
74 hiegrep
'[^sn]printf' 'Please use av_log' $
*
75 hiegrep
'\bmalloc' 'Please use av_malloc' $
*
76 hiegrep
'\) *av_malloc' 'useless casts' $
*
77 hiegrep
':\+ *'"$ERE_PRITYP"' *inline' 'non static inline or strangely ordered inline+static' $
*
78 hiegrep
"$ERE_FUNCS"' *\)' 'missing void' $
*
79 hiegrep
'(sprintf|strcat|strcpy)' 'Possible security issue, make sure this is safe or use snprintf/av_strl*' $
*
80 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' $
*
81 hiegrep
'#(el|)if *(0|1)' 'useless #if' $
*
82 hiegrep
'if *\( *(0|1) *\)' 'useless if()' $
*
83 hiegrep
'& *[a-zA-Z0-9_]* *\[ *0 *\]' 'useless & [0]' $
*
84 hiegrep
'(\( *[0-9] *(&&|\|\|)|(&&|\|\|) *[0-9] *\))' 'overriding condition' $
*
85 hiegrep
'(:\+|,|;)( *|static|\*)*'"$ERE_PRITYP"' *\*( |\*)*(src|source|input|in[^a-z])' 'missing const?' $
*
86 hiegrep
'(:\+|,|;)( *|static|\*)*'"$ERE_PRITYP"' *(src|source|input|in)([0-9A-Z_][0-9A-Za-z_]*){1,} *\[' 'missing const (test2)?' $
*
87 hiegrep
' *static *'"$ERE_FUNCS"'[^)]*\);' 'static prototype, maybe you should reorder your functions' $
*
88 hiegrep
'@file: *[a-zA-Z0-9_]' 'doxy filetag with filename can in the future cause problems when forgotten during a rename' $
*
89 hiegrep
'\bassert' 'Please use av_assert0, av_assert1 or av_assert2' $
*
91 hiegrep2
'\.long_name *=' 'NULL_IF_CONFIG_SMAL' 'missing NULL_IF_CONFIG_SMAL' $
*
92 hiegrep2
'\.pix_fmts *= *\(' 'const' 'missing const for pix_fmts array' $
*
93 hiegrep2
'\.sample_fmts *= *\(' 'const' 'missing const for sample_fmts array' $
*
94 hiegrep2
'\.supported_framerates *= *\(' 'const' 'missing const for supported_framerates array' $
*
95 hiegrep2
'\.channel_layouts *= *\(' 'const' 'missing const for channel_layouts array' $
*
97 #$EGREP $OPT '^\+.*const ' $*| $GREP -v 'static'> $TMP && printf '\nnon static const\n'
100 hiegrep2
"$ERE_TYPES" '(static|av_|ff_|typedef|:\+[^a-zA-Z_])' 'Non static with no ff_/av_ prefix' $
*
102 hiegrep
':\+[^}#]*else' 'missing } prior to else' $
*
103 hiegrep
'(if|while|for)\(' 'missing whitespace between keyword and ( (feel free to ignore)' $
*
104 hiegrep
'(else|do){' 'missing whitespace between keyword and { (feel free to ignore)' $
*
105 hiegrep
'}(else|while)' 'missing whitespace between } and keyword (feel free to ignore)' $
*
107 #FIXME this should print the previous statement maybe
108 hiegrep
':\+ *{ *$' '{ should be on the same line as the related previous statement' $
*
112 for i
in $
($GREP -H '^+.*@param' $
*|
sed 's/^\([^:]*\):.*@param\(\[.*\]\|\) *\([a-zA-Z0-9_]*\) .*$/\1:\3/') ; do
113 doxpar
=$
(echo $i |
sed 's/^.*:\(.*\)$/\1/')
114 file=$
(echo $i |
sed 's/^\([^:]*\):.*$/\1/')
115 $GREP " *$doxpar *[),]" $file |
$GREP -v '@param' >/dev
/null ||
$GREP --color=always
"@param *$doxpar" $file >>$TMP
117 if test -e $TMP ; then
118 printf '\nmismatching doxy params\n'
122 $EGREP -B2 $OPT '^(\+|) *('"$ERE_TYPES"'|# *define)' $
* |
$EGREP -A2 --color=always
'(:|-)\+[^/]*/(\*([^*]|$)|/([^/]|$))' > $TMP && printf "\n Non doxy comments\n"
127 $
($EGREP -H '^\+ *'"$ERE_TYPES" $
* |\
128 $GREP -v '(' |
$EGREP -v '\Wgoto\W' |\
129 xargs -d '\n' -n 1 |\
130 $GREP -o '[* ][* ]*[a-zA-Z][0-9a-zA-Z_]* *[,;=]' |\
131 sed 's/.[* ]*\([a-zA-Z][0-9a-zA-Z_]*\) *[,;=]/\1/') \
133 echo $i |
$GREP '^NULL$' && continue
134 $EGREP $i' *(\+|-|\*|/|\||&|%|)=[^=]' $
* >/dev
/null ||
echo "possibly never written:"$i >> $TMP
135 $EGREP '(=|\(|return).*'$i'(==|[^=])*$' $
* >/dev
/null ||
echo "possibly never read :"$i >> $TMP
136 $EGREP -o $i' *((\+|-|\*|/|\||&|%|)=[^=]|\+\+|--) *(0x|)[0-9]*(;|)' $
* |\
137 $EGREP -v $i' *= *(0x|)[0-9]{1,};'>/dev
/null ||
echo "possibly constant :"$i >> $TMP
139 if test -e $TMP ; then
140 printf '\npossibly unused variables\n'
144 $GREP '^+++ .*Changelog' $
* >/dev
/null ||
printf "\nMissing changelog entry (ignore if minor change)\n"
146 cat $
* |
tr '\n' '@' |
$EGREP --color=always
-o '(fprintf|av_log|printf)\([^)]*\)[+ ;@]*\1' >$TMP && printf "\nMergeable calls\n"
147 cat $TMP |
tr '@' '\n'
149 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"
150 cat $TMP |
tr '@' '\n'
152 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"
153 cat $TMP |
tr '@' '\n'
155 cat $
* |
tr '\n' '@' |
$EGREP --color=always
-o '\+ *if *\( *([A-Za-z0-9_]*) *\)[ @\\+]*av_free(p|) *\( *(&|) *\1[^-.]' >$TMP && printf "\nav_free(NULL) is safe\n"
156 cat $TMP |
tr '@' '\n'
158 cat $
* |
tr '\n' '@' |
$EGREP --color=always
-o '[^a-zA-Z0-9_]([a-zA-Z0-9_]*) *= *av_malloc *\([^)]*\)[ @;\\+]*memset *\( *\1' >$TMP && printf "\nav_mallocz()\n"
159 cat $TMP |
tr '@' '\n'
163 #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"
164 #cat $TMP | tr '@' '\n'
170 for all demuxers
& muxers
171 $EGREP for "avctx->priv_data"
175 arrays fitting
in smaller types
176 variables written to twice with no interspaced
read
177 memset
(block
, 0, 6*64*sizeof
(int16_t
)); -> clear_blocks
178 check existence of long_name
in AVCodec
179 check that the
patch does not
touch codec
& (de
)muxer layer
at the same
time ->split
181 write a regression
test containing
at least a line that triggers each warning once