busybox/shell/hush_leaktool.sh
Denys Vlasenko 02b518db1c hush: fix memory leak caused by compiler optimizing out a store
function                                             old     new   delta
generate_stream_from_string                          222     232     +10
setup_heredoc                                        329     330      +1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 11/0)               Total: 11 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2025-08-03 20:42:52 +02:00

39 lines
1.1 KiB
Bash
Executable file

#!/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