From 2d2628df0001d2b643811dc69717c4afe70c4e31 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Sun, 11 Aug 2019 17:22:20 +1200 Subject: Fix and add tests for NULL deref cases found by scan-build --- test/Makefile | 1 + test/asm/run-asm.sh | 59 ++++++++++++++++++++++ test/asm/should-fail/001-segfault-li-comma-end.asm | 2 + test/asm/should-fail/002-segfault-b-short.asm | 2 + test/asm/should-fail/003-segfault-j-short.asm | 2 + test/asm/should-fail/004-segfault-imm-short.asm | 2 + test/full-pipeline/001-nop.asm | 1 - test/full-pipeline/002-nops.asm | 12 ----- test/full-pipeline/003-rtype.asm | 6 --- test/full-pipeline/004-itype.asm | 5 -- test/full-pipeline/005-small-loop.asm | 7 --- test/full-pipeline/006-2-inst-2-words.asm | 2 - test/full-pipeline/007-3-inst-3-words.asm | 3 -- test/full-pipeline/008-3-inst-5-words.asm | 3 -- test/full-pipeline/009-3-inst-5-words-rev.asm | 3 -- test/full-pipeline/010-empty.asm | 0 test/full-pipeline/run-full-pipeline.sh | 21 ++++---- test/full-pipeline/should-pass/001-nop.asm | 1 + test/full-pipeline/should-pass/002-nops.asm | 12 +++++ test/full-pipeline/should-pass/003-rtype.asm | 6 +++ test/full-pipeline/should-pass/004-itype.asm | 5 ++ test/full-pipeline/should-pass/005-small-loop.asm | 7 +++ .../should-pass/006-2-inst-2-words.asm | 2 + .../should-pass/007-3-inst-3-words.asm | 3 ++ .../should-pass/008-3-inst-5-words.asm | 3 ++ .../should-pass/009-3-inst-5-words-rev.asm | 3 ++ test/full-pipeline/should-pass/010-empty.asm | 0 27 files changed, 121 insertions(+), 52 deletions(-) create mode 100755 test/asm/run-asm.sh create mode 100644 test/asm/should-fail/001-segfault-li-comma-end.asm create mode 100644 test/asm/should-fail/002-segfault-b-short.asm create mode 100644 test/asm/should-fail/003-segfault-j-short.asm create mode 100644 test/asm/should-fail/004-segfault-imm-short.asm delete mode 100644 test/full-pipeline/001-nop.asm delete mode 100644 test/full-pipeline/002-nops.asm delete mode 100644 test/full-pipeline/003-rtype.asm delete mode 100644 test/full-pipeline/004-itype.asm delete mode 100644 test/full-pipeline/005-small-loop.asm delete mode 100644 test/full-pipeline/006-2-inst-2-words.asm delete mode 100644 test/full-pipeline/007-3-inst-3-words.asm delete mode 100644 test/full-pipeline/008-3-inst-5-words.asm delete mode 100644 test/full-pipeline/009-3-inst-5-words-rev.asm delete mode 100644 test/full-pipeline/010-empty.asm create mode 100644 test/full-pipeline/should-pass/001-nop.asm create mode 100644 test/full-pipeline/should-pass/002-nops.asm create mode 100644 test/full-pipeline/should-pass/003-rtype.asm create mode 100644 test/full-pipeline/should-pass/004-itype.asm create mode 100644 test/full-pipeline/should-pass/005-small-loop.asm create mode 100644 test/full-pipeline/should-pass/006-2-inst-2-words.asm create mode 100644 test/full-pipeline/should-pass/007-3-inst-3-words.asm create mode 100644 test/full-pipeline/should-pass/008-3-inst-5-words.asm create mode 100644 test/full-pipeline/should-pass/009-3-inst-5-words-rev.asm create mode 100644 test/full-pipeline/should-pass/010-empty.asm (limited to 'test') diff --git a/test/Makefile b/test/Makefile index cb0f3ee..083802c 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,3 +1,4 @@ test: + ./asm/run-asm.sh ./full-pipeline/run-full-pipeline.sh ./emul/run-emul.sh diff --git a/test/asm/run-asm.sh b/test/asm/run-asm.sh new file mode 100755 index 0000000..7574abb --- /dev/null +++ b/test/asm/run-asm.sh @@ -0,0 +1,59 @@ +#!/bin/bash -e + +# +# Script for running all of the automated which will go from source to binary. +# + +fail() { + echo -e '[\e[1;31mFAIL\e[0m] '"$1:" "$2" + has_failure=1 +} + +pass() { + echo -e '[\e[1;32mPASS\e[0m] '"$1" +} + +clean() { + echo "Removing work dir $WORK" + rm -r "$WORK" +} + +if [ "$1" == "noclean" ]; then + NO_CLEAN=1 +else + NO_CLEAN=0 +fi +WORK=$(mktemp -d) +pushd $(dirname "$0") >/dev/null +source ../valgrind.sh +export ASM="$PWD/../../assembler" +export DISASM="$PWD/../../disassembler" +has_failure=0 + +for first_stage_asm in should-fail/*.asm ; do + t=$(basename "$first_stage_asm") + first_stage_bin="$WORK/${t}-first_stage.bin" + log="$WORK/${t}.log" + + # Assemble test code + set +e + $VALGRIND $VALGRIND_OPTS "$ASM" "$first_stage_asm" "$first_stage_bin" 2>"$log" + xc="$?" + set -e + if (( xc > 0 && xc < 128 )); then + pass "$t" "assembly xfailed" + elif (( xc == 0 )); then + fail "$t" "assembly didn't fail as expected" + else + fail "$t" "assembler was sent signal $(( xc - 128 ))" + fi +done +popd >/dev/null + +if [[ "$failure" != "0" && "$NO_CLEAN" == "1" ]] ; then + echo "Warning: Leaving work dir $WORK in place. Please remove this yourself" +else + clean +fi + +exit "$has_failure" diff --git a/test/asm/should-fail/001-segfault-li-comma-end.asm b/test/asm/should-fail/001-segfault-li-comma-end.asm new file mode 100644 index 0000000..bde586c --- /dev/null +++ b/test/asm/should-fail/001-segfault-li-comma-end.asm @@ -0,0 +1,2 @@ +; Test for bug previously found with scan-build. Important: no CR/LF at EOF +ldi $1, \ No newline at end of file diff --git a/test/asm/should-fail/002-segfault-b-short.asm b/test/asm/should-fail/002-segfault-b-short.asm new file mode 100644 index 0000000..898a3b0 --- /dev/null +++ b/test/asm/should-fail/002-segfault-b-short.asm @@ -0,0 +1,2 @@ +; Test for bug previously found with scan-build. Important: no CR/LF at EOF +bnz \ No newline at end of file diff --git a/test/asm/should-fail/003-segfault-j-short.asm b/test/asm/should-fail/003-segfault-j-short.asm new file mode 100644 index 0000000..0b1486b --- /dev/null +++ b/test/asm/should-fail/003-segfault-j-short.asm @@ -0,0 +1,2 @@ +; Test for bug previously found with scan-build. Important: no CR/LF at EOF +jmp \ No newline at end of file diff --git a/test/asm/should-fail/004-segfault-imm-short.asm b/test/asm/should-fail/004-segfault-imm-short.asm new file mode 100644 index 0000000..42e8c4b --- /dev/null +++ b/test/asm/should-fail/004-segfault-imm-short.asm @@ -0,0 +1,2 @@ +; Test for bug previously found with scan-build. Important: no CR/LF at EOF +addi $0, $0, \ No newline at end of file diff --git a/test/full-pipeline/001-nop.asm b/test/full-pipeline/001-nop.asm deleted file mode 100644 index c27745a..0000000 --- a/test/full-pipeline/001-nop.asm +++ /dev/null @@ -1 +0,0 @@ -nop diff --git a/test/full-pipeline/002-nops.asm b/test/full-pipeline/002-nops.asm deleted file mode 100644 index 45a3cbf..0000000 --- a/test/full-pipeline/002-nops.asm +++ /dev/null @@ -1,12 +0,0 @@ -nop -nop -nop -nop -add $0, $0, $0 -nop -bn 0 -nop -nop -jn $0 -nop -nop diff --git a/test/full-pipeline/003-rtype.asm b/test/full-pipeline/003-rtype.asm deleted file mode 100644 index 7ed5f78..0000000 --- a/test/full-pipeline/003-rtype.asm +++ /dev/null @@ -1,6 +0,0 @@ -; Test for some sort of parity between pseudo instructions for rtypes -mv $0, $1 -mv $H, $2 -mv $2, $1 -neg $1 -neg $0 diff --git a/test/full-pipeline/004-itype.asm b/test/full-pipeline/004-itype.asm deleted file mode 100644 index 4fbc032..0000000 --- a/test/full-pipeline/004-itype.asm +++ /dev/null @@ -1,5 +0,0 @@ -; Test for some sort of parity between pseudo instructions for itypes -ldi $0, 1234 -ldi $1, 0x1234 -ldi $1, 1 -ldi $1, 10 diff --git a/test/full-pipeline/005-small-loop.asm b/test/full-pipeline/005-small-loop.asm deleted file mode 100644 index 5c47e51..0000000 --- a/test/full-pipeline/005-small-loop.asm +++ /dev/null @@ -1,7 +0,0 @@ -ldi $1, 2 -ldi $2, 20 -ldi $3, 0 -loop: - add $3, $3, $1 - subi $2, $2, 1 - bnz loop diff --git a/test/full-pipeline/006-2-inst-2-words.asm b/test/full-pipeline/006-2-inst-2-words.asm deleted file mode 100644 index c4e2dbc..0000000 --- a/test/full-pipeline/006-2-inst-2-words.asm +++ /dev/null @@ -1,2 +0,0 @@ -nop -nop diff --git a/test/full-pipeline/007-3-inst-3-words.asm b/test/full-pipeline/007-3-inst-3-words.asm deleted file mode 100644 index 717a122..0000000 --- a/test/full-pipeline/007-3-inst-3-words.asm +++ /dev/null @@ -1,3 +0,0 @@ -nop -nop -nop diff --git a/test/full-pipeline/008-3-inst-5-words.asm b/test/full-pipeline/008-3-inst-5-words.asm deleted file mode 100644 index c0a33b5..0000000 --- a/test/full-pipeline/008-3-inst-5-words.asm +++ /dev/null @@ -1,3 +0,0 @@ -jmp 0 -jmp 0 -nop diff --git a/test/full-pipeline/009-3-inst-5-words-rev.asm b/test/full-pipeline/009-3-inst-5-words-rev.asm deleted file mode 100644 index 5592edd..0000000 --- a/test/full-pipeline/009-3-inst-5-words-rev.asm +++ /dev/null @@ -1,3 +0,0 @@ -nop -jmp 0 -jmp 0 diff --git a/test/full-pipeline/010-empty.asm b/test/full-pipeline/010-empty.asm deleted file mode 100644 index e69de29..0000000 diff --git a/test/full-pipeline/run-full-pipeline.sh b/test/full-pipeline/run-full-pipeline.sh index 25f7bf7..c5a1700 100755 --- a/test/full-pipeline/run-full-pipeline.sh +++ b/test/full-pipeline/run-full-pipeline.sh @@ -11,6 +11,7 @@ fail() { echo -e '[\e[1;31mFAIL\e[0m] '"$1:" "$2" + has_failure=1 } pass() { @@ -34,33 +35,33 @@ export ASM="$PWD/../../assembler" export DISASM="$PWD/../../disassembler" has_failure=0 -for first_stage_asm in *.asm ; do - first_stage_bin="$WORK/${first_stage_asm}-first_stage.bin" - second_stage_asm="$WORK/${first_stage_asm}-second_stage.asm" - second_stage_bin="$WORK/${first_stage_asm}-second_stage.bin" +for first_stage_asm in should-pass/*.asm ; do + t=$(basename "$first_stage_asm") + first_stage_bin="$WORK/${t}-first_stage.bin" + second_stage_asm="$WORK/${t}-second_stage.asm" + second_stage_bin="$WORK/${t}-second_stage.bin" # Assemble test code if ! $VALGRIND $VALGRIND_OPTS "$ASM" "$first_stage_asm" "$first_stage_bin" ; then - fail "$first_stage_asm" "first stage assembly failed" + fail "$t" "first stage assembly failed" continue fi # Disassemble test code and re-assemble that disassembly if ! $VALGRIND $VALGRIND_OPTS "$DISASM" "$first_stage_bin" "$second_stage_asm" ; then - fail "$first_stage_asm" "first stage disassembly failed" + fail "$t" "first stage disassembly failed" continue fi if ! $VALGRIND $VALGRIND_OPTS "$ASM" "$second_stage_asm" "$second_stage_bin" ; then - fail "$first_stage_asm" "second stage assembly failed" + fail "$t" "second stage assembly failed" continue fi # first stage bin and second stage identical for test pass if diff "$first_stage_bin" "$second_stage_bin" >/dev/null; then - pass "$first_stage_asm" + pass "$t" else - fail "$first_stage_asm" "binary mismatch" - has_failure=1 + fail "$t" "binary mismatch" fi done diff --git a/test/full-pipeline/should-pass/001-nop.asm b/test/full-pipeline/should-pass/001-nop.asm new file mode 100644 index 0000000..c27745a --- /dev/null +++ b/test/full-pipeline/should-pass/001-nop.asm @@ -0,0 +1 @@ +nop diff --git a/test/full-pipeline/should-pass/002-nops.asm b/test/full-pipeline/should-pass/002-nops.asm new file mode 100644 index 0000000..45a3cbf --- /dev/null +++ b/test/full-pipeline/should-pass/002-nops.asm @@ -0,0 +1,12 @@ +nop +nop +nop +nop +add $0, $0, $0 +nop +bn 0 +nop +nop +jn $0 +nop +nop diff --git a/test/full-pipeline/should-pass/003-rtype.asm b/test/full-pipeline/should-pass/003-rtype.asm new file mode 100644 index 0000000..7ed5f78 --- /dev/null +++ b/test/full-pipeline/should-pass/003-rtype.asm @@ -0,0 +1,6 @@ +; Test for some sort of parity between pseudo instructions for rtypes +mv $0, $1 +mv $H, $2 +mv $2, $1 +neg $1 +neg $0 diff --git a/test/full-pipeline/should-pass/004-itype.asm b/test/full-pipeline/should-pass/004-itype.asm new file mode 100644 index 0000000..4fbc032 --- /dev/null +++ b/test/full-pipeline/should-pass/004-itype.asm @@ -0,0 +1,5 @@ +; Test for some sort of parity between pseudo instructions for itypes +ldi $0, 1234 +ldi $1, 0x1234 +ldi $1, 1 +ldi $1, 10 diff --git a/test/full-pipeline/should-pass/005-small-loop.asm b/test/full-pipeline/should-pass/005-small-loop.asm new file mode 100644 index 0000000..5c47e51 --- /dev/null +++ b/test/full-pipeline/should-pass/005-small-loop.asm @@ -0,0 +1,7 @@ +ldi $1, 2 +ldi $2, 20 +ldi $3, 0 +loop: + add $3, $3, $1 + subi $2, $2, 1 + bnz loop diff --git a/test/full-pipeline/should-pass/006-2-inst-2-words.asm b/test/full-pipeline/should-pass/006-2-inst-2-words.asm new file mode 100644 index 0000000..c4e2dbc --- /dev/null +++ b/test/full-pipeline/should-pass/006-2-inst-2-words.asm @@ -0,0 +1,2 @@ +nop +nop diff --git a/test/full-pipeline/should-pass/007-3-inst-3-words.asm b/test/full-pipeline/should-pass/007-3-inst-3-words.asm new file mode 100644 index 0000000..717a122 --- /dev/null +++ b/test/full-pipeline/should-pass/007-3-inst-3-words.asm @@ -0,0 +1,3 @@ +nop +nop +nop diff --git a/test/full-pipeline/should-pass/008-3-inst-5-words.asm b/test/full-pipeline/should-pass/008-3-inst-5-words.asm new file mode 100644 index 0000000..c0a33b5 --- /dev/null +++ b/test/full-pipeline/should-pass/008-3-inst-5-words.asm @@ -0,0 +1,3 @@ +jmp 0 +jmp 0 +nop diff --git a/test/full-pipeline/should-pass/009-3-inst-5-words-rev.asm b/test/full-pipeline/should-pass/009-3-inst-5-words-rev.asm new file mode 100644 index 0000000..5592edd --- /dev/null +++ b/test/full-pipeline/should-pass/009-3-inst-5-words-rev.asm @@ -0,0 +1,3 @@ +nop +jmp 0 +jmp 0 diff --git a/test/full-pipeline/should-pass/010-empty.asm b/test/full-pipeline/should-pass/010-empty.asm new file mode 100644 index 0000000..e69de29 -- cgit v1.1