Revision: 156
http://www.exim.org/viewvc/pcre2?view=rev&revision=156
Author: ph10
Date: 2014-11-21 12:19:37 +0000 (Fri, 21 Nov 2014)
Log Message:
-----------
Add additional tests and fix some compiler warnings; update stack information.
Modified Paths:
--------------
code/trunk/RunTest
code/trunk/doc/pcre2stack.3
code/trunk/maint/ManyConfigTests
code/trunk/src/pcre2test.c
Modified: code/trunk/RunTest
===================================================================
--- code/trunk/RunTest 2014-11-20 17:39:28 UTC (rev 155)
+++ code/trunk/RunTest 2014-11-21 12:19:37 UTC (rev 156)
@@ -277,6 +277,17 @@
exit 1
fi
+# If it is possible to set the system stack size, arrange to set a value for
+# test 2, which needs more than the even the Linux default when PCRE2 has been
+# compiled with -fsanitize=address.
+
+$sim ./pcre2test -S 1 /dev/null /dev/null
+if [ $? -eq 0 ] ; then
+ test2stack="-S 16"
+else
+ test2stack=""
+fi
+
# All of 8-bit, 16-bit, and 32-bit character strings may be supported, but only
# one need be.
@@ -423,12 +434,12 @@
done
fi
- # PCRE2 tests that are not JIT or Perl-compatible: API, errors, internals
+ # PCRE2 tests that are not Perl-compatible: API, errors, internals
if [ $do2 = yes ] ; then
echo $title2 "(excluding UTF-$bits)"
for opt in "" $jitopt; do
- $sim $valgrind ./pcre2test -q $bmode $opt $testdata/testinput2 testtry
+ $sim $valgrind ./pcre2test -q $test2stack $bmode $opt $testdata/testinput2 testtry
if [ $? = 0 ] ; then
checkresult $? 2 "$opt"
else
Modified: code/trunk/doc/pcre2stack.3
===================================================================
--- code/trunk/doc/pcre2stack.3 2014-11-20 17:39:28 UTC (rev 155)
+++ code/trunk/doc/pcre2stack.3 2014-11-21 12:19:37 UTC (rev 156)
@@ -1,4 +1,4 @@
-.TH PCRE2STACK 3 "20 October 2014" "PCRE2 10.00"
+.TH PCRE2STACK 3 "21 November 2014" "PCRE2 10.00"
.SH NAME
PCRE2 - Perl-compatible regular expressions (revised API)
.SH "PCRE2 DISCUSSION OF STACK USAGE"
@@ -19,6 +19,12 @@
the recursive call would immediately be passed back as the result of the
current call (a "tail recursion"), the function is just restarted instead.
.P
+Each time the internal \fBmatch()\fP function is called recursively, it uses
+memory from the process stack. For certain kinds of pattern and data, very
+large amounts of stack may be needed, despite the recognition of "tail
+recursion". Note that if PCRE2 is compiled with the -fsanitize=address option
+of the GCC compiler, the stack requirements are greatly increased.
+.P
The above comments apply when \fBpcre2_match()\fP is run in its normal
interpretive manner. If the compiled pattern was processed by
\fBpcre2_jit_compile()\fP, and just-in-time compiling was successful, and the
@@ -47,10 +53,7 @@
.SS "Reducing \fBpcre2_match()\fP's stack usage"
.rs
.sp
-Each time that the internal \fBmatch()\fP function is called recursively, it
-uses memory from the process stack. For certain kinds of pattern and data, very
-large amounts of stack may be needed, despite the recognition of "tail
-recursion". You can often reduce the amount of recursion, and therefore the
+You can often reduce the amount of recursion, and therefore the
amount of stack used, by modifying the pattern that is being matched. Consider,
for example, this pattern:
.sp
@@ -194,6 +197,6 @@
.rs
.sp
.nf
-Last updated: 20 October 2014
+Last updated: 21 November 2014
Copyright (c) 1997-2014 University of Cambridge.
.fi
Modified: code/trunk/maint/ManyConfigTests
===================================================================
--- code/trunk/maint/ManyConfigTests 2014-11-20 17:39:28 UTC (rev 155)
+++ code/trunk/maint/ManyConfigTests 2014-11-21 12:19:37 UTC (rev 156)
@@ -53,7 +53,8 @@
# special test turns optimization on, because it can provoke some compiler
# warnings.
-CFLAGS="-g -O0"
+CFLAGS="-g"
+OFLAGS="-O0"
ISGCC=0
# If the compiler is gcc, add a lot of warning switches.
@@ -81,7 +82,7 @@
# This function runs a single test with the set of configuration options that
# are in $opts. The source directory must be set in srcdir. The function must
-# be defined as "runtest()" not "function runtest()" in order to run on
+# be defined as "runtest()" not "function runtest()" in order to run on
# Solaris.
runtest()
@@ -125,8 +126,8 @@
nlok=1
else
nlok=0
- fi
-
+ fi
+
./pcre2test -C jit >/dev/null
jit=$?
./pcre2test -C pcre2-8 >/dev/null
@@ -138,7 +139,7 @@
if [ $? -ne 0 -o -s teststderr ]; then
echo " "
echo "**** Test failed ****"
- cat teststderr
+ cat teststderr
if [ -s teststdout ] ; then cat teststdout; fi
exit 1
fi
@@ -158,7 +159,7 @@
fi
elif [ $nlok -gt 0 ]; then
echo "Skipping pcre2grep tests: 8-bit library not compiled"
- else
+ else
echo "Skipping pcre2grep tests: newline is $nl"
fi
@@ -182,7 +183,7 @@
testtotal=`expr 20 \* $usemain + \
1 \* $usetmp + \
- 1 \* $ISGCC \* $usemain + \
+ 2 \* $ISGCC \* $usemain + \
13 \* $usejit + \
\( 3 + 2 \* $usejit \) \* $usevalgrind`
testcount=0
@@ -201,7 +202,11 @@
export srcdir
# If gcc is in use, run a maximally configured test with -O2, because that can
-# throw up warnings that are not detected with -O0.
+# throw up warnings that are not detected with -O0. Then run a second test with
+# -fsanitize=address, which also may throw up new warnings as well as checking
+# things at runtime. Using -fsanitize=address increases the size of stack
+# frames by a lot, so run this test with --disable-stack-for-recursion, as
+# otherwise RunTest may fail on test 2.
if [ $usejit -ne 0 ]; then
enable_jit=--enable-jit
@@ -211,13 +216,22 @@
if [ $ISGCC -ne 0 -a $usemain -ne 0 ]; then
echo "---------- Maximally configured test with -O2 ----------"
- SAVECLFAGS="$CFLAGS"
- CFLAGS="$CFLAGS -O2"
+ SAVECFLAGS="$CFLAGS"
+ CFLAGS="-O2 $CFLAGS"
+ echo "CFLAGS=$CFLAGS"
opts="--disable-shared $enable_jit --enable-pcre2-16 --enable-pcre2-32"
runtest
- CFLAGS="$SAVECFLAGS"
+ echo "---------- Maximally configured test with -fsanitize=address ----------"
+ CFLAGS="$OFLAGS $SAVECFLAGS -fsanitize=address"
+ echo "CFLAGS=$CFLAGS"
+ opts="--disable-shared $enable_jit --disable-stack-for-recursion --enable-pcre2-16 --enable-pcre2-32"
+ runtest
+ CFLAGS="$OFLAGS $SAVECFLAGS"
fi
+echo "---------- CFLAGS for the remaining tests ----------"
+echo "CFLAGS=$CFLAGS"
+
if [ $usemain -ne 0 ]; then
echo "---------- Non-JIT tests in the current directory ----------"
for opts in \
Modified: code/trunk/src/pcre2test.c
===================================================================
--- code/trunk/src/pcre2test.c 2014-11-20 17:39:28 UTC (rev 155)
+++ code/trunk/src/pcre2test.c 2014-11-21 12:19:37 UTC (rev 156)
@@ -215,7 +215,7 @@
#include "pcre2posix.h"
#include "pcre2_internal.h"
-/* We need access to some of the data tables that PCRE uses. Defining
+/* We need access to some of the data tables that PCRE2 uses. Defining
PCRE2_PCRETEST makes some minor changes in the files. The previous definition
of PRIV avoids name clashes. */
@@ -731,7 +731,7 @@
#define CAST8VAR(x) CASTVAR(uint8_t *, x)
#define SET(x,y) SETOP(x,y,=)
#define SETPLUS(x,y) SETOP(x,y,+=)
-#define strlen8 strlen
+#define strlen8(x) strlen((char *)x)
/* ---------------- Mode-dependent, runtime-testing macros ------------------*/
@@ -1625,7 +1625,7 @@
#define SETFLDVEC(x,y,v,z) G(x,16)->y[v] = z
#define SETOP(x,y,z) G(x,16) z y
#define SETCASTPTR(x,y) G(x,16) = (uint16_t *)y
-#define STRLEN(p) (int)strlen16(p)
+#define STRLEN(p) (int)strlen16((PCRE2_SPTR16)p)
#define SUB1(a,b) G(a,16)(G(b,16))
#define SUB2(a,b,c) G(a,16)(G(b,16),G(c,16))
#define TEST(x,r,y) (G(x,16) r (y))
@@ -1706,7 +1706,7 @@
#define SETFLDVEC(x,y,v,z) G(x,32)->y[v] = z
#define SETOP(x,y,z) G(x,32) z y
#define SETCASTPTR(x,y) G(x,32) = (uint32_t *)y
-#define STRLEN(p) (int)strlen32(p)
+#define STRLEN(p) (int)strlen32((PCRE2_SPTR32)p)
#define SUB1(a,b) G(a,32)(G(b,32))
#define SUB2(a,b,c) G(a,32)(G(b,32),G(c,32))
#define TEST(x,r,y) (G(x,32) r (y))
@@ -2130,7 +2130,7 @@
and returns the codepoint of that character. Note that the function supports
the original UTF-8 definition of RFC 2279, allowing for values in the range 0
to 0x7fffffff, up to 6 bytes long. This makes it possible to generate
-codepoints greater than 0x10ffff which are useful for testing PCRE's error
+codepoints greater than 0x10ffff which are useful for testing PCRE2's error
checking, and also for generating 32-bit non-UTF data values above the UTF
limit.
@@ -2235,7 +2235,7 @@
* Find length of 0-terminated 16-bit string *
*************************************************/
-static int strlen16(PCRE2_SPTR16 p)
+static size_t strlen16(PCRE2_SPTR16 p)
{
PCRE2_SPTR16 pp = p;
while (*pp != 0) pp++;
@@ -2250,7 +2250,7 @@
* Find length of 0-terminated 32-bit string *
*************************************************/
-static int strlen32(PCRE2_SPTR32 p)
+static size_t strlen32(PCRE2_SPTR32 p)
{
PCRE2_SPTR32 pp = p;
while (*pp != 0) pp++;
@@ -2430,7 +2430,7 @@
pbuffer16 = (uint16_t *)malloc(pbuffer16_size);
if (pbuffer16 == NULL)
{
- fprintf(stderr, "pcretest: malloc(%ld) failed for pbuffer16\n",
+ fprintf(stderr, "pcre2test: malloc(%ld) failed for pbuffer16\n",
pbuffer16_size);
exit(1);
}
@@ -2507,7 +2507,7 @@
pbuffer32 = (uint32_t *)malloc(pbuffer32_size);
if (pbuffer32 == NULL)
{
- fprintf(stderr, "pcretest: malloc(%ld) failed for pbuffer32\n",
+ fprintf(stderr, "pcre2test: malloc(%ld) failed for pbuffer32\n",
pbuffer32_size);
exit(1);
}
@@ -4114,11 +4114,12 @@
* Callout function *
*************************************************/
-/* Called from PCRE as a result of the (?C) item. We print out where we are in
-the match. Yield zero unless more callouts than the fail count, or the callout
-data is not zero. The only differences in the callout block for different code
-unit widths are that the pointers to the subject and the most recent MARK point
-to strings of the appropriate width. Casts can be used to deal with this.
+/* Called from a PCRE2 library as a result of the (?C) item. We print out where
+we are in the match. Yield zero unless more callouts than the fail count, or
+the callout data is not zero. The only differences in the callout block for
+different code unit widths are that the pointers to the subject and the most
+recent MARK point to strings of the appropriate width. Casts can be used to
+deal with this.
Argument: a pointer to a callout block
Return:
@@ -5672,7 +5673,7 @@
/* Output is always to stdout.
Arguments:
- rc the return code from PCRE_CONFIG_NEWLINE
+ rc the return code from PCRE2_CONFIG_NEWLINE
isc TRUE if called from "-C newline"
Returns: nothing
*/
@@ -5732,7 +5733,7 @@
printf(" -help show usage information\n");
printf(" -i set default pattern control 'info'\n");
printf(" -jit set default pattern control 'jit'\n");
-printf(" -q quiet: do not output PCRE version number at start\n");
+printf(" -q quiet: do not output PCRE2 version number at start\n");
printf(" -pattern <s> set default pattern control fields\n");
printf(" -subject <s> set default subject control fields\n");
printf(" -S <n> set stack size to <n> megabytes\n");
@@ -5982,7 +5983,7 @@
test_mode = PCRE8_MODE;
#else
fprintf(stderr,
- "** This version of PCRE was built without 8-bit support\n");
+ "** This version of PCRE2 was built without 8-bit support\n");
exit(1);
#endif
}
@@ -5992,7 +5993,7 @@
test_mode = PCRE16_MODE;
#else
fprintf(stderr,
- "** This version of PCRE was built without 16-bit support\n");
+ "** This version of PCRE2 was built without 16-bit support\n");
exit(1);
#endif
}
@@ -6002,7 +6003,7 @@
test_mode = PCRE32_MODE;
#else
fprintf(stderr,
- "** This version of PCRE was built without 32-bit support\n");
+ "** This version of PCRE2 was built without 32-bit support\n");
exit(1);
#endif
}
@@ -6017,7 +6018,7 @@
((stack_size = get_value(argv[op+1], &endptr)), *endptr == 0))
{
#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS)
- fprintf(stderr, "PCRE: -S is not supported on this OS\n");
+ fprintf(stderr, "pcre2test: -S is not supported on this OS\n");
exit(1);
#else
int rc;
@@ -6027,7 +6028,7 @@
rc = setrlimit(RLIMIT_STACK, &rlim);
if (rc != 0)
{
- fprintf(stderr, "PCRE: setrlimit() failed with error %d\n", rc);
+ fprintf(stderr, "pcre2test: setrlimit() failed with error %d\n", rc);
exit(1);
}
op++;