Browse Source

add script for reducing a C test case to be more minimal

main
John-Mark Gurney 1 year ago
parent
commit
92a1d81627
1 changed files with 71 additions and 0 deletions
  1. +71
    -0
      test.case.reduce.sh

+ 71
- 0
test.case.reduce.sh View File

@@ -0,0 +1,71 @@
#!/bin/sh -

#
# Script to reduce a test case down to a smaller set by deleting
# lines.

# Start by making the file into a single file via:
# cc -E -o newcfile.c -c inputfile.c
#
# Update the script w/ the compile command that will test for the
# failiure you're looking for. It is at the line marked UPDATE ME.
#
# And then run the script:
# sh test.case.reduce.sh newcfile.c
#
# After the run, it'll report how many lines were dropped, and
# the final test case will be named test.c.
#
# This isn't perfect (I know there is a better tool out there, but
# I can't remember/find it) in that it leaves blocks of code that
# are multiple lines where any one removed causes an error when
# compiling. This can be delt w/ by hand at the end as it's a bit
# easier, but could be improved by trying to delete n lines instead
# of just 1 for increasing n (or maybe decreasing n?).
#
# In my test case of reducing, it took a 2163 line file down to
# 313 befor manually reducing it to 18 lines.

cp "$1" "test.c"

totdroppedlines=0
droppedlines=1
while [ $droppedlines -ne 0 ]; do
droppedlines=0
i=0
while :; do
linecount=$(wc -l < test.c)

if [ $i -eq $linecount ]; then
break
fi

while [ $i -lt $linecount ]; do
# try to delete next line
(if [ $i -gt 0 ]; then head -n $i test.c; fi; tail -n +$(($i + 2)) test.c ) > curtest.c
#echo curtest line count: $(wc -l < curtest.c)

# modify this function such that when the test case
# still "fails" that it returns success.
#
# In this case, we are checking for a specific
# error message.
#
# ====== UPDATE ME ======
if arm-none-eabi-gcc -Werror=stringop-overflow=1 -mcpu=cortex-m3 -mthumb -O2 -g -Wall -Werror -c curtest.c 2>&1 | grep 'accessing 160 bytes in a region of size 32' > /dev/null; then
echo dropping line $(($i + 1 + $droppedlines))
droppedlines=$(($droppedlines + 1))
mv curtest.c test.c
break
fi
i=$(($i + 1))
echo keeping line $(($i + $droppedlines))
done
done

echo dropped $droppedlines lines

totdroppedlines=$(($totdroppedlines + $droppedlines))
done

echo dropped $totdroppedlines lines in total

Loading…
Cancel
Save