diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2007-11-21 11:56:14 +1100 |
---|---|---|
committer | Jon Loeliger <jdl@freescale.com> | 2007-11-26 15:57:58 -0600 |
commit | 67b6b33b9b413a450a72135b5dc59c0a1e33e647 (patch) | |
tree | 1a0896d7e11904459a7cf028d771631e0ff938a6 | |
parent | 3ce53633871584ad93528fdf5cdcb939bb24ffc3 (diff) | |
download | dtc-67b6b33b9b413a450a72135b5dc59c0a1e33e647.tar.gz |
dtc: Add valgrind support to testsuite
This patch adds some options to the run_tests.sh script allowing it to
run all the testcases under valgrind to check for pointer corruption
bugs and memory leaks. Invoking "make checkm" will run the testsuite
with valgrind.
It include a mechanism for specifying valgrind errors to be suppressed
on a per-testcase basis, and adds a couple of such suppression files
for the mangle-layout and open_pack testcases which dump for use by
other testcases a buffer which may contain uninitialized sections. We
use suppressions rather than initializing the buffer so that valgrind
will catch any internal access s to the uninitialized data, which
would be a bug.
The patch also fixes one genuine bug caught by valgrind -
_packblocks() in fdt_rw.c was using memcpy() where it should have been
using memmove().
At present the valgrinding won't do anything useful for testcases
invoked via a shell script - which includes all the dtc testcases. I
plan to fix that later.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r-- | libfdt/fdt_rw.c | 6 | ||||
-rw-r--r-- | tests/Makefile.tests | 5 | ||||
-rw-r--r-- | tests/mangle-layout.supp | 7 | ||||
-rw-r--r-- | tests/open_pack.supp | 7 | ||||
-rwxr-xr-x | tests/run_tests.sh | 22 |
5 files changed, 41 insertions, 6 deletions
diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c index dfe5628..6673f8e 100644 --- a/libfdt/fdt_rw.c +++ b/libfdt/fdt_rw.c @@ -358,12 +358,12 @@ static void _packblocks(const void *fdt, void *buf, memmove(buf + mem_rsv_off, fdt + fdt_off_mem_rsvmap(fdt), mem_rsv_size); fdt_set_off_mem_rsvmap(buf, mem_rsv_off); - memcpy(buf + struct_off, fdt + fdt_off_dt_struct(fdt), struct_size); + memmove(buf + struct_off, fdt + fdt_off_dt_struct(fdt), struct_size); fdt_set_off_dt_struct(buf, struct_off); fdt_set_size_dt_struct(buf, struct_size); - memcpy(buf + strings_off, fdt + fdt_off_dt_strings(fdt), - fdt_size_dt_strings(fdt)); + memmove(buf + strings_off, fdt + fdt_off_dt_strings(fdt), + fdt_size_dt_strings(fdt)); fdt_set_off_dt_strings(buf, strings_off); fdt_set_size_dt_strings(buf, fdt_size_dt_strings(fdt)); } diff --git a/tests/Makefile.tests b/tests/Makefile.tests index 5f0e668..569bd9e 100644 --- a/tests/Makefile.tests +++ b/tests/Makefile.tests @@ -26,7 +26,7 @@ TESTS_TARGETS = $(TESTS) $(TESTS_TREES) TESTS_DEPFILES = $(TESTS:%=%.d) \ $(addprefix $(TESTS_PREFIX),testutils.d trees.d dumptrees.d) -TESTS_CLEANFILES_L = *.output vgcore.* *.dtb *.test.dts +TESTS_CLEANFILES_L = *.output vglog.* vgcore.* *.dtb *.test.dts TESTS_CLEANFILES = $(TESTS_CLEANFILES_L:%=$(TESTS_PREFIX)%) BIN += $(TESTS) $(TESTS_PREFIX)dumptrees @@ -52,6 +52,9 @@ tests_clean: check: tests dtc cd $(TESTS_PREFIX); ./run_tests.sh +checkm: tests dtc + cd $(TESTS_PREFIX); ./run_tests.sh -m 2>&1 | tee vglog.$$$$ + checkv: tests dtc cd $(TESTS_PREFIX); ./run_tests.sh -v diff --git a/tests/mangle-layout.supp b/tests/mangle-layout.supp new file mode 100644 index 0000000..2cc8449 --- /dev/null +++ b/tests/mangle-layout.supp @@ -0,0 +1,7 @@ +{ + uninitialized alignment gaps can be dumped to output + Memcheck:Param + write(buf) + obj:/lib/ld-2.6.1.so + fun:main +} diff --git a/tests/open_pack.supp b/tests/open_pack.supp new file mode 100644 index 0000000..a38abc5 --- /dev/null +++ b/tests/open_pack.supp @@ -0,0 +1,7 @@ +{ + opened blob dumps uninitialized data + Memcheck:Param + write(buf) + obj:/lib/ld-2.6.1.so + fun:main +} diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 54d4504..6875c42 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -2,16 +2,26 @@ export QUIET_TEST=1 +export VALGRIND= +VGCODE=126 + tot_tests=0 tot_pass=0 tot_fail=0 tot_config=0 +tot_vg=0 tot_strange=0 run_test () { tot_tests=$[tot_tests + 1] echo -n "$@: " - if "./$@"; then + VGLOCAL="$VALGRIND" + if [ -n "$VALGRIND" ]; then + if [ -f $1.supp ]; then + VGLOCAL="$VGLOCAL --suppressions=$1.supp" + fi + fi + if $VGLOCAL "./$@"; then tot_pass=$[tot_pass + 1] else ret="$?" @@ -19,6 +29,8 @@ run_test () { tot_config=$[tot_config + 1] elif [ "$ret" == "2" ]; then tot_fail=$[tot_fail + 1] + elif [ "$ret" == "$VGCODE" ]; then + tot_vg=$[tot_vg + 1] else tot_strange=$[tot_strange + 1] fi @@ -147,7 +159,7 @@ dtc_tests () { run_test dtc-checkfails.sh -I dts -O dtb minusone-phandle.dts } -while getopts "vdt:" ARG ; do +while getopts "vt:m" ARG ; do case $ARG in "v") unset QUIET_TEST @@ -155,6 +167,9 @@ while getopts "vdt:" ARG ; do "t") TESTSETS=$OPTARG ;; + "m") + VALGRIND="valgrind --tool=memcheck -q --error-exitcode=$VGCODE" + ;; esac done @@ -181,6 +196,9 @@ echo -e "* Total testcases: $tot_tests" echo -e "* PASS: $tot_pass" echo -e "* FAIL: $tot_fail" echo -e "* Bad configuration: $tot_config" +if [ -n "$VALGRIND" ]; then + echo -e "* valgrind errors: $tot_vg" +fi echo -e "* Strange test result: $tot_strange" echo -e "**********" |