summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2007-11-21 11:56:14 +1100
committerJon Loeliger <jdl@freescale.com>2007-11-26 15:57:58 -0600
commit67b6b33b9b413a450a72135b5dc59c0a1e33e647 (patch)
tree1a0896d7e11904459a7cf028d771631e0ff938a6
parent3ce53633871584ad93528fdf5cdcb939bb24ffc3 (diff)
downloaddtc-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.c6
-rw-r--r--tests/Makefile.tests5
-rw-r--r--tests/mangle-layout.supp7
-rw-r--r--tests/open_pack.supp7
-rwxr-xr-xtests/run_tests.sh22
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 "**********"