diff --git a/ChangeLog b/ChangeLog index 4e18926..62bd12d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -179,6 +179,11 @@ this work, the new command was added to several test files and the testing scripts were modified. The pcre2grep tests can now also be run when there is no LF in the default newline convention. +51. The RunTest script has been modified so that, when JIT is used and valgrind +is specified, a valgrind suppressions file is set up to ignore "Invalid read of +size 16" errors because these are false positives when the hardware supports +the SSE2 instruction set. + Version 10.20 30-June-2015 -------------------------- diff --git a/RunTest b/RunTest index d72a574..0431767 100755 --- a/RunTest +++ b/RunTest @@ -157,7 +157,7 @@ checkresult() checkspecial() { - $valgrind ./pcre2test $1 >>testtry + $valgrind $vjs ./pcre2test $1 >>testtry if [ $? -ne 0 ] ; then echo "** pcre2test $1 failed - check testtry" exit 1 @@ -194,6 +194,7 @@ bigstack= sim= skip= valgrind= +vjs= # This is in case the caller has set aliases (as I do - PH) unset cp ls mv rm @@ -377,11 +378,18 @@ fi $sim ./pcre2test -C unicode >/dev/null utf=$? +# When JIT is used with valgrind, we need to set up valgrind suppressions as +# otherwise there are a lot of false positive valgrind reports when the +# the hardware supports SSE2. + jitopt= $sim ./pcre2test -C jit >/dev/null jit=$? if [ $jit -ne 0 -a "$nojit" != "yes" ] ; then jitopt=-jit + if [ "$valgrind" != "" ] ; then + vjs="--suppressions=$testdata/valgrind-jit.supp" + fi fi # If no specific tests were requested, select all. Those that are not @@ -459,7 +467,7 @@ for bmode in "$test8" "$test16" "$test32"; do if [ $do1 = yes ] ; then echo $title1 for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput1 testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput1 testtry checkresult $? 1 "$opt" done fi @@ -469,7 +477,7 @@ for bmode in "$test8" "$test16" "$test32"; do if [ $do2 = yes ] ; then echo $title2 "(excluding UTF-$bits)" for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $test2stack $bmode $opt $testdata/testinput2 testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $test2stack $bmode $opt $testdata/testinput2 testtry if [ $? = 0 ] ; then checkresult $? 2 "$opt" else @@ -529,7 +537,7 @@ for bmode in "$test8" "$test16" "$test32"; do if [ "$locale" != "" ] ; then echo $title3 "(using '$locale' locale)" for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $infile testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $infile testtry if [ $? = 0 ] ; then case "$opt" in -jit) with=" with JIT";; @@ -566,7 +574,7 @@ for bmode in "$test8" "$test16" "$test32"; do echo " Skipped because UTF-$bits support is not available" else for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput4 testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput4 testtry checkresult $? 4 "$opt" done fi @@ -578,7 +586,7 @@ for bmode in "$test8" "$test16" "$test32"; do echo " Skipped because UTF-$bits support is not available" else for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput5 testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput5 testtry checkresult $? 5 "$opt" done fi @@ -630,7 +638,7 @@ for bmode in "$test8" "$test16" "$test32"; do echo " Skipped when running 16/32-bit tests" else for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput9 testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput9 testtry checkresult $? 9 "$opt" done fi @@ -646,7 +654,7 @@ for bmode in "$test8" "$test16" "$test32"; do echo " Skipped because UTF-$bits support is not available" else for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput10 testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput10 testtry checkresult $? 10 "$opt" done fi @@ -660,7 +668,7 @@ for bmode in "$test8" "$test16" "$test32"; do echo " Skipped when running 8-bit tests" else for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput11 testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput11 testtry checkresult $? 11-$bits "$opt" done fi @@ -677,7 +685,7 @@ for bmode in "$test8" "$test16" "$test32"; do echo " Skipped because UTF-$bits support is not available" else for opt in "" $jitopt; do - $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput12 testtry + $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput12 testtry checkresult $? 12-$bits "$opt" done fi @@ -734,7 +742,7 @@ for bmode in "$test8" "$test16" "$test32"; do if [ $jit -eq 0 -o "$nojit" = "yes" ] ; then echo " Skipped because JIT is not available or nojit was specified" else - $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput17 testtry + $sim $valgrind $vjs ./pcre2test -q $defaultstack $bmode $testdata/testinput17 testtry checkresult $? 17 "" fi fi diff --git a/maint/ManyConfigTests b/maint/ManyConfigTests index c693630..e1fd9a6 100755 --- a/maint/ManyConfigTests +++ b/maint/ManyConfigTests @@ -10,13 +10,16 @@ # tests, in order to run those that are giving errors. The following options # do this: # -# -noasan skip the test that uses -fsanitize=address -# -nousan skip the test that uses -fsanitize=undefined -# -nodebug skip the test that uses --enable-debug -# -nojit skip JIT tests -# -nomain skip the main set of tests -# -notmp skip the test in a temporary directory -# -novalgrind skip the valgrind tests +# -noasan skip the test that uses -fsanitize=address +# -nousan skip the test that uses -fsanitize=undefined +# -nodebug skip the test that uses --enable-debug +# -nojit skip all JIT tests +# -nojitmain skip non-valgrind JIT tests +# -nojitvalgrind skip JIT tests with valgrind +# -nomain skip the main set of tests +# -nomainvalgrind skip the non-JIT valgrind tests +# -notmp skip the test in a temporary directory +# -novalgrind skip the valgrind tests # The -v option causes a call to 'pcre2test -C' to happen for each # configuration. @@ -25,26 +28,35 @@ useasan=1 useusan=1 usedebug=1 usejit=1 +usejitvalgrind=1 usemain=1 +usemainvalgrind=1 usetmp=1 usevalgrind=1 verbose=0 while [ $# -gt 0 ] ; do case $1 in - -noasan) useasan=0;; - -nousan) useusan=0;; - -nodebug) usedebug=0;; - -nojit) usejit=0;; - -nomain) usemain=0;; - -notmp) usetmp=0;; - -novalgrind) usevalgrind=0;; - -v) verbose=1;; - *) echo "Unknown option '$1'"; exit 1;; + -noasan) useasan=0;; + -nousan) useusan=0;; + -nodebug) usedebug=0;; + -nojit) usejit=0; usejitvalgrind=0;; + -nojitmain) usejit=0;; + -nojitvalgrind) usejitvalgrind=0;; + -nomain) usemain=0; usemainvalgrind=0;; + -nomainvalgrind) usemainvalgrind=0;; + -notmp) usetmp=0;; + -novalgrind) usevalgrind=0;; + -v) verbose=1;; + *) echo "Unknown option '$1'"; exit 1;; esac shift done +if [ $usejitvalgrind -eq 0 -a $usemainvalgrind -eq 0 ] ; then + usevalgrind=0 +fi + # This is in case the caller has set aliases (as I do - PH) unset cp ls mv rm @@ -103,22 +115,21 @@ runtest() fi CFLAGS="$CFLAGS" \ - $srcdir/configure $opts >/dev/null 2>teststderr - + $srcdir/configure $opts >/dev/null 2>teststderrM if [ $? -ne 0 ]; then echo " " echo "******** Error while configuring ********" - cat teststderr + cat teststderrM exit 1 fi echo "Making" - make -j >/dev/null 2>teststderr - if [ $? -ne 0 -o -s teststderr ]; then + make -j >/dev/null 2>teststderrM + if [ $? -ne 0 -o -s teststderrM ]; then echo " " echo "******** Errors or warnings while making ********" echo " " - cat teststderr + cat teststderrM exit 1 fi @@ -132,23 +143,27 @@ runtest() pcre2_8=$? echo "Running PCRE2 library tests $withvalgrind" - $srcdir/RunTest $valgrind >teststdout 2>teststderr - if [ $? -ne 0 -o -s teststderr ]; then + $srcdir/RunTest $valgrind >teststdoutM 2>teststderrM + + if [ $? -ne 0 -o -s teststderrM ]; then echo " " echo "**** Test failed ****" - cat teststderr - if [ -s teststdout ] ; then cat teststdout; fi + if [ -s teststderrM ] ; then + cat teststderrM + else + cat teststdoutM + fi exit 1 fi if [ $pcre2_8 -gt 0 ]; then echo "Running pcre2grep tests $withvalgrind" - $srcdir/RunGrepTest $valgrind >teststdout 2>teststderr - if [ $? -ne 0 -o -s teststderr ]; then + $srcdir/RunGrepTest $valgrind >teststdoutM 2>teststderrM + if [ $? -ne 0 -o -s teststderrM ]; then echo " " echo "**** Test failed ****" - cat teststderr - cat teststdout + cat teststderrM + cat teststdoutM exit 1 fi else @@ -157,12 +172,12 @@ runtest() if [ "$jit" -gt 0 ]; then echo "Running JIT regression tests $withvalgrind" - $cvalgrind $srcdir/pcre2_jit_test >teststdout 2>teststderr - if [ $? -ne 0 -o -s teststderr ]; then + $cvalgrind $srcdir/pcre2_jit_test >teststdoutM 2>teststderrM + if [ $? -ne 0 -o -s teststderrM ]; then echo " " echo "**** Test failed ****" - cat teststderr - cat teststdout + cat teststderrM + cat teststdoutM exit 1 fi else @@ -180,9 +195,16 @@ testtotal=`expr 20 \* $usemain + \ 1 \* $ISGCC \* $usemain \* $useasan + \ 1 \* $ISGCC \* $usemain \* $useusan + \ 13 \* $usejit + \ - \( 3 + 2 \* $usejit \) \* $usevalgrind` + 3 \* $usemainvalgrind + \ + 2 \* $usejitvalgrind` + testcount=0 +if [ $testtotal -eq 0 ] ; then + echo "** No tests selected" + exit 1 +fi + valgrind= cvalgrind= withvalgrind= @@ -244,7 +266,7 @@ if [ $usemain -ne 0 ]; then echo "---------- Maximally configured test with --enable-debug ----------" opts="--disable-shared $enable_jit --enable-pcre2-16 --enable-pcre2-32 --enable-debug" runtest - fi + fi echo "---------- Non-JIT tests in the current directory ----------" for opts in \ @@ -304,16 +326,18 @@ if [ $usevalgrind -ne 0 ]; then cvalgrind="valgrind -q --smc-check=all" withvalgrind="with valgrind" - for opts in \ - "--disable-stack-for-recursion --disable-shared" \ - "--with-link-size=3 --enable-pcre2-16 --enable-pcre2-32 --disable-shared" \ - "--disable-unicode --disable-shared" - do - opts="--enable-valgrind $opts" - runtest - done + if [ $usemainvalgrind -ne 0 ]; then + for opts in \ + "--disable-stack-for-recursion --disable-shared" \ + "--with-link-size=3 --enable-pcre2-16 --enable-pcre2-32 --disable-shared" \ + "--disable-unicode --disable-shared" + do + opts="--enable-valgrind $opts" + runtest + done + fi - if [ $usejit -ne 0 ]; then + if [ $usejitvalgrind -ne 0 ]; then for opts in \ "--enable-jit --disable-shared" \ "--enable-jit --enable-pcre2-16 --enable-pcre2-32" @@ -341,26 +365,26 @@ if [ -f Makefile ]; then fi fi -echo "---------- Tests in the $tmp directory ----------" -srcdir=`pwd` -export srcdir - -if [ ! -e $tmp ]; then - mkdir $tmp -fi - -if [ ! -d $tmp ]; then - echo "** Failed to create $tmp or it is not a directory" - exit 1 -fi - -cd $tmp -if [ $? -ne 0 ]; then - echo "** Failed to cd to $tmp" - exit 1 -fi - if [ $usetmp -ne 0 ]; then + echo "---------- Tests in the $tmp directory ----------" + srcdir=`pwd` + export srcdir + + if [ ! -e $tmp ]; then + mkdir $tmp + fi + + if [ ! -d $tmp ]; then + echo "** Failed to create $tmp or it is not a directory" + exit 1 + fi + + cd $tmp + if [ $? -ne 0 ]; then + echo "** Failed to cd to $tmp" + exit 1 + fi + for opts in \ "--disable-shared" do @@ -369,8 +393,8 @@ if [ $usetmp -ne 0 ]; then fi echo "Removing $tmp" - rm -rf $tmp +rm -rf teststdoutM teststderrM echo "All done" diff --git a/testdata/valgrind-jit.supp b/testdata/valgrind-jit.supp new file mode 100644 index 0000000..73e87d2 --- /dev/null +++ b/testdata/valgrind-jit.supp @@ -0,0 +1,7 @@ +{ + name + Memcheck:Addr16 + obj:* + obj:* + obj:* +}