summaryrefslogtreecommitdiff
path: root/shell/hush_leaktool.sh
blob: 3edd3df619249f90abacd487254a0b89ed52f063 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/sh

# hush's stderr with leak debug enabled
output=output

freelist=`grep 'free 0x' "$output" | cut -d' ' -f2 | sort | uniq | xargs`

grep -v free "$output" >"$output.leaked"

i=16
list=
for freed in $freelist; do
    list="$list -e $freed"
    test $((--i)) != 0 && continue
    echo Dropping $list
    grep -F -v $list <"$output.leaked" >"$output.temp"
    mv "$output.temp" "$output.leaked"
    i=16
    list=
done
if test "$list"; then
    echo Dropping $list
    grep -F -v $list <"$output.leaked" >"$output.temp"
    mv "$output.temp" "$output.leaked"
fi

# All remaining allocations are on addresses which were never freed.
# * Sort them by line, grouping together allocations which allocated the same address.
#	A leaky allocation will give many different addresses (because it's never freed,
#	the address can not be reused).
# * Remove the address (field #4).
# * Count the allocations per every unique source line and alloc type.
# * Show largest counts on top.
cat output.leaked \
	| sort -u \
	| cut -d' ' -f1-3 \
	| uniq -c \
	| sort -rn \
>output.leaked.counted_uniq_alloc_address