124 lines
2.4 KiB
Bash
124 lines
2.4 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
out_prefix=$(dirname "$0")/../test-results/valgrind.out
|
||
|
output=
|
||
|
count=0
|
||
|
total_count=0
|
||
|
missing_message=
|
||
|
new_line='
|
||
|
'
|
||
|
|
||
|
# start outputting the current valgrind error in $out_prefix.++$count,
|
||
|
# and the test case which failed in the corresponding .message file
|
||
|
start_output () {
|
||
|
test -z "$output" || return
|
||
|
|
||
|
# progress
|
||
|
total_count=$(($total_count+1))
|
||
|
test -t 2 && printf "\rFound %d errors" $total_count >&2
|
||
|
|
||
|
count=$(($count+1))
|
||
|
output=$out_prefix.$count
|
||
|
: > $output
|
||
|
|
||
|
echo "*** $1 ***" > $output.message
|
||
|
}
|
||
|
|
||
|
finish_output () {
|
||
|
test ! -z "$output" || return
|
||
|
output=
|
||
|
|
||
|
# if a test case has more than one valgrind error, we need to
|
||
|
# copy the last .message file to the previous errors
|
||
|
test -z "$missing_message" || {
|
||
|
while test $missing_message -lt $count
|
||
|
do
|
||
|
cp $out_prefix.$count.message \
|
||
|
$out_prefix.$missing_message.message
|
||
|
missing_message=$(($missing_message+1))
|
||
|
done
|
||
|
missing_message=
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# group the valgrind errors by backtrace
|
||
|
output_all () {
|
||
|
last_line=
|
||
|
j=0
|
||
|
i=1
|
||
|
while test $i -le $count
|
||
|
do
|
||
|
# output <number> <backtrace-in-one-line>
|
||
|
echo "$i $(tr '\n' ' ' < $out_prefix.$i)"
|
||
|
i=$(($i+1))
|
||
|
done |
|
||
|
sort -t ' ' -k 2 | # order by <backtrace-in-one-line>
|
||
|
while read number line
|
||
|
do
|
||
|
# find duplicates, do not output backtrace twice
|
||
|
if test "$line" != "$last_line"
|
||
|
then
|
||
|
last_line=$line
|
||
|
j=$(($j+1))
|
||
|
printf "\nValgrind error $j:\n\n"
|
||
|
cat $out_prefix.$number
|
||
|
printf "\nfound in:\n"
|
||
|
fi
|
||
|
# print the test case where this came from
|
||
|
printf "\n"
|
||
|
cat $out_prefix.$number.message
|
||
|
done
|
||
|
}
|
||
|
|
||
|
handle_one () {
|
||
|
OLDIFS=$IFS
|
||
|
IFS="$new_line"
|
||
|
while read line
|
||
|
do
|
||
|
case "$line" in
|
||
|
# backtrace, possibly a new one
|
||
|
==[0-9]*)
|
||
|
|
||
|
# Does the current valgrind error have a message yet?
|
||
|
case "$output" in
|
||
|
*.message)
|
||
|
test -z "$missing_message" &&
|
||
|
missing_message=$count
|
||
|
output=
|
||
|
esac
|
||
|
|
||
|
start_output $(basename $1)
|
||
|
echo "$line" |
|
||
|
sed 's/==[0-9]*==/==valgrind==/' >> $output
|
||
|
;;
|
||
|
# end of backtrace
|
||
|
'}')
|
||
|
test -z "$output" || {
|
||
|
echo "$line" >> $output
|
||
|
test $output = ${output%.message} &&
|
||
|
output=$output.message
|
||
|
}
|
||
|
;;
|
||
|
# end of test case
|
||
|
'')
|
||
|
finish_output
|
||
|
;;
|
||
|
# normal line; if $output is set, print the line
|
||
|
*)
|
||
|
test -z "$output" || echo "$line" >> $output
|
||
|
;;
|
||
|
esac
|
||
|
done < $1
|
||
|
IFS=$OLDIFS
|
||
|
|
||
|
# just to be safe
|
||
|
finish_output
|
||
|
}
|
||
|
|
||
|
for test_script in "$(dirname "$0")"/../test-results/*.out
|
||
|
do
|
||
|
handle_one $test_script
|
||
|
done
|
||
|
|
||
|
output_all
|