diff --git a/ChangeLog b/ChangeLog index 82ca771..23d35de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -45,6 +45,10 @@ It is freed with the match data block. different in different environments and so cannot be included in the standard tests. +12. Created a test for pcre2_match() heap processing that is not part of the +tests run by 'make check', but can be run manually. The current output is from +a 64-bit system. + Version 10.40 15-April-2022 --------------------------- diff --git a/RunTest b/RunTest index 9b67870..8fb6a2c 100755 --- a/RunTest +++ b/RunTest @@ -17,8 +17,16 @@ # individual test numbers, ranges of tests such as 3-6 or 3- (meaning 3 to the # end), or a number preceded by ~ to exclude a test. For example, "3-15 ~10" # runs tests 3 to 15, excluding test 10, and just "~10" runs all the tests -# except test 10. Whatever order the arguments are in, the tests are always run -# in numerical order. +# except test 10. Whatever order the arguments are in, these tests are always +# run in numerical order. +# +# If no specific tests are selected (which is the case when this script is run +# via 'make check') the default is to run all the numbered tests. +# +# There may also be named (as well as numbered) tests for special purposes. At +# present there is just one, called "heap". This test's output contains the +# sizes of heap frames and frame vectors, which depend on the environment. It +# is therefore not run unless explicitly requested. # # Inappropriate tests are automatically skipped (with a comment to say so). For # example, if JIT support is not compiled, test 16 is skipped, whereas if JIT @@ -82,6 +90,7 @@ title24="Test 24: Non-UTF pattern conversion tests" title25="Test 25: UTF pattern conversion tests" title26="Test 26: Auto-generated unicode property tests" maxtest=26 +titleheap="Test 'heap': Environment-specific heap tests" if [ $# -eq 1 -a "$1" = "list" ]; then echo $title0 @@ -111,6 +120,11 @@ if [ $# -eq 1 -a "$1" = "list" ]; then echo $title24 echo $title25 echo $title26 + echo "" + echo $titleheap + echo "" + echo "Numbered tests are automatically run if nothing selected." + echo "Named tests must be explicitly selected." exit 0 fi @@ -241,6 +255,7 @@ do23=no do24=no do25=no do26=no +doheap=no while [ $# -gt 0 ] ; do case $1 in @@ -271,6 +286,7 @@ while [ $# -gt 0 ] ; do 24) do24=yes;; 25) do25=yes;; 26) do26=yes;; + heap) doheap=yes;; -8) arg8=yes;; -16) arg16=yes;; -32) arg32=yes;; @@ -412,8 +428,8 @@ if [ $jit -ne 0 -a "$nojit" != "yes" ] ; then fi fi -# If no specific tests were requested, select all. Those that are not -# relevant will be automatically skipped. +# If no specific tests were requested, select all the numbered tests. Those +# that are not relevant will be automatically skipped. if [ $do0 = no -a $do1 = no -a $do2 = no -a $do3 = no -a \ $do4 = no -a $do5 = no -a $do6 = no -a $do7 = no -a \ @@ -421,7 +437,7 @@ if [ $do0 = no -a $do1 = no -a $do2 = no -a $do3 = no -a \ $do12 = no -a $do13 = no -a $do14 = no -a $do15 = no -a \ $do16 = no -a $do17 = no -a $do18 = no -a $do19 = no -a \ $do20 = no -a $do21 = no -a $do22 = no -a $do23 = no -a \ - $do24 = no -a $do25 = no -a $do26 = no \ + $do24 = no -a $do25 = no -a $do26 = no -a $doheap = no \ ]; then do0=yes do1=yes @@ -882,6 +898,15 @@ for bmode in "$test8" "$test16" "$test32"; do fi fi + # Manually selected heap tests - output may vary in different environments, + # which is why that are not automatically run. + + if [ $doheap = yes ] ; then + echo $titleheap + $sim $valgrind ./pcre2test -q $setstack $bmode $testdata/testinputheap testtry + checkresult $? heap-$bits "" + fi + # End of loop for 8/16/32-bit tests done diff --git a/src/pcre2test.c b/src/pcre2test.c index 7f68b1d..7f44de7 100644 --- a/src/pcre2test.c +++ b/src/pcre2test.c @@ -1246,19 +1246,19 @@ are supported. */ #define PCRE2_MATCH_DATA_CREATE(a,b,c) \ if (test_mode == PCRE8_MODE) \ - G(a,8) = pcre2_match_data_create_8(b,c); \ + G(a,8) = pcre2_match_data_create_8(b,G(c,8)); \ else if (test_mode == PCRE16_MODE) \ - G(a,16) = pcre2_match_data_create_16(b,c); \ + G(a,16) = pcre2_match_data_create_16(b,G(c,16)); \ else \ - G(a,32) = pcre2_match_data_create_32(b,c) + G(a,32) = pcre2_match_data_create_32(b,G(c,32)) #define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \ if (test_mode == PCRE8_MODE) \ - G(a,8) = pcre2_match_data_create_from_pattern_8(G(b,8),c); \ + G(a,8) = pcre2_match_data_create_from_pattern_8(G(b,8),G(c,8)); \ else if (test_mode == PCRE16_MODE) \ - G(a,16) = pcre2_match_data_create_from_pattern_16(G(b,16),c); \ + G(a,16) = pcre2_match_data_create_from_pattern_16(G(b,16),G(c,16)); \ else \ - G(a,32) = pcre2_match_data_create_from_pattern_32(G(b,32),c) + G(a,32) = pcre2_match_data_create_from_pattern_32(G(b,32),G(c,32)) #define PCRE2_MATCH_DATA_FREE(a) \ if (test_mode == PCRE8_MODE) \ @@ -1766,15 +1766,15 @@ the three different cases. */ #define PCRE2_MATCH_DATA_CREATE(a,b,c) \ if (test_mode == G(G(PCRE,BITONE),_MODE)) \ - G(a,BITONE) = G(pcre2_match_data_create_,BITONE)(b,c); \ + G(a,BITONE) = G(pcre2_match_data_create_,BITONE)(b,G(c,BITONE)); \ else \ - G(a,BITTWO) = G(pcre2_match_data_create_,BITTWO)(b,c) + G(a,BITTWO) = G(pcre2_match_data_create_,BITTWO)(b,G(c,BITTWO)) #define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \ if (test_mode == G(G(PCRE,BITONE),_MODE)) \ - G(a,BITONE) = G(pcre2_match_data_create_from_pattern_,BITONE)(G(b,BITONE),c); \ + G(a,BITONE) = G(pcre2_match_data_create_from_pattern_,BITONE)(G(b,BITONE),G(c,BITONE)); \ else \ - G(a,BITTWO) = G(pcre2_match_data_create_from_pattern_,BITTWO)(G(b,BITTWO),c) + G(a,BITTWO) = G(pcre2_match_data_create_from_pattern_,BITTWO)(G(b,BITTWO),G(c,BITTWO)) #define PCRE2_MATCH_DATA_FREE(a) \ if (test_mode == G(G(PCRE,BITONE),_MODE)) \ @@ -2074,9 +2074,9 @@ the three different cases. */ #define PCRE2_MAKETABLES(a) a = pcre2_maketables_8(NULL) #define PCRE2_MATCH(a,b,c,d,e,f,g,h) \ a = pcre2_match_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),h) -#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,8) = pcre2_match_data_create_8(b,c) +#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,8) = pcre2_match_data_create_8(b,G(c,8)) #define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \ - G(a,8) = pcre2_match_data_create_from_pattern_8(G(b,8),c) + G(a,8) = pcre2_match_data_create_from_pattern_8(G(b,8),G(c,8)) #define PCRE2_MATCH_DATA_FREE(a) pcre2_match_data_free_8(G(a,8)) #define PCRE2_PATTERN_CONVERT(a,b,c,d,e,f,g) a = pcre2_pattern_convert_8(G(b,8),c,d,(PCRE2_UCHAR8 **)e,f,G(g,8)) #define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_8(G(b,8),c,d) @@ -2181,9 +2181,9 @@ the three different cases. */ #define PCRE2_MAKETABLES(a) a = pcre2_maketables_16(NULL) #define PCRE2_MATCH(a,b,c,d,e,f,g,h) \ a = pcre2_match_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),h) -#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,16) = pcre2_match_data_create_16(b,c) +#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,16) = pcre2_match_data_create_16(b,G(c,16)) #define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \ - G(a,16) = pcre2_match_data_create_from_pattern_16(G(b,16),c) + G(a,16) = pcre2_match_data_create_from_pattern_16(G(b,16),G(c,16)) #define PCRE2_MATCH_DATA_FREE(a) pcre2_match_data_free_16(G(a,16)) #define PCRE2_PATTERN_CONVERT(a,b,c,d,e,f,g) a = pcre2_pattern_convert_16(G(b,16),c,d,(PCRE2_UCHAR16 **)e,f,G(g,16)) #define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_16(G(b,16),c,d) @@ -2288,9 +2288,9 @@ the three different cases. */ #define PCRE2_MAKETABLES(a) a = pcre2_maketables_32(NULL) #define PCRE2_MATCH(a,b,c,d,e,f,g,h) \ a = pcre2_match_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),h) -#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,32) = pcre2_match_data_create_32(b,c) +#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,32) = pcre2_match_data_create_32(b,G(c,32)) #define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \ - G(a,32) = pcre2_match_data_create_from_pattern_32(G(b,32),c) + G(a,32) = pcre2_match_data_create_from_pattern_32(G(b,32),G(c,32)) #define PCRE2_MATCH_DATA_FREE(a) pcre2_match_data_free_32(G(a,32)) #define PCRE2_PATTERN_CONVERT(a,b,c,d,e,f,g) a = pcre2_pattern_convert_32(G(b,32),c,d,(PCRE2_UCHAR32 **)e,f,G(g,32)) #define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_32(G(b,32),c,d) @@ -2784,7 +2784,7 @@ return block; static void my_free(void *block, void *data) { (void)data; -if (show_memory) +if (show_memory && block != NULL) { uint32_t i, j; BOOL found = FALSE; @@ -7318,7 +7318,8 @@ causes a new match data block to be obtained that exactly fits the pattern. */ if (dat_datctl.oveccount == 0) { PCRE2_MATCH_DATA_FREE(match_data); - PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(match_data, compiled_code, NULL); + PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(match_data, compiled_code, + general_context); PCRE2_GET_OVECTOR_COUNT(max_oveccount, match_data); } else if (dat_datctl.oveccount <= max_oveccount) @@ -7329,7 +7330,7 @@ else { max_oveccount = dat_datctl.oveccount; PCRE2_MATCH_DATA_FREE(match_data); - PCRE2_MATCH_DATA_CREATE(match_data, max_oveccount, NULL); + PCRE2_MATCH_DATA_CREATE(match_data, max_oveccount, general_context); } if (CASTVAR(void *, match_data) == NULL) diff --git a/testdata/testinputheap b/testdata/testinputheap new file mode 100644 index 0000000..ee165e1 --- /dev/null +++ b/testdata/testinputheap @@ -0,0 +1,13 @@ +#pattern framesize, memory + +/abcd/ + abcd\=memory + abcd\=find_limits + +/(((((((((((((((((((((((((((((( (^abc|xyz){1,20}$ ))))))))))))))))))))))))))))))/x + abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcX\=memory + abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcX\=find_limits + +/ab(cd)/ + abcd\=memory + abcd\=memory,ovector=0 diff --git a/testdata/testoutputheap-16 b/testdata/testoutputheap-16 new file mode 100644 index 0000000..41855e4 --- /dev/null +++ b/testdata/testoutputheap-16 @@ -0,0 +1,40 @@ +#pattern framesize, memory + +/abcd/ +Memory allocation (code space): 26 +Frame size for pcre2_match(): 128 + abcd\=memory +malloc 20480 + 0: abcd + abcd\=find_limits +Minimum heap limit = 1 +Minimum match limit = 2 +Minimum depth limit = 2 + 0: abcd + +/(((((((((((((((((((((((((((((( (^abc|xyz){1,20}$ ))))))))))))))))))))))))))))))/x +Memory allocation (code space): 1294 +Frame size for pcre2_match(): 624 + abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcX\=memory +malloc 40960 +free unremembered block +No match + abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcX\=find_limits +Minimum heap limit = 22 +Minimum match limit = 37 +Minimum depth limit = 35 +No match + +/ab(cd)/ +Memory allocation (code space): 36 +Frame size for pcre2_match(): 144 + abcd\=memory + 0: abcd + 1: cd + abcd\=memory,ovector=0 +free 40960 +free unremembered block +malloc 128 +malloc 20480 + 0: abcd + 1: cd diff --git a/testdata/testoutputheap-32 b/testdata/testoutputheap-32 new file mode 100644 index 0000000..36fa1e3 --- /dev/null +++ b/testdata/testoutputheap-32 @@ -0,0 +1,40 @@ +#pattern framesize, memory + +/abcd/ +Memory allocation (code space): 52 +Frame size for pcre2_match(): 128 + abcd\=memory +malloc 20480 + 0: abcd + abcd\=find_limits +Minimum heap limit = 1 +Minimum match limit = 2 +Minimum depth limit = 2 + 0: abcd + +/(((((((((((((((((((((((((((((( (^abc|xyz){1,20}$ ))))))))))))))))))))))))))))))/x +Memory allocation (code space): 2588 +Frame size for pcre2_match(): 624 + abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcX\=memory +malloc 40960 +free unremembered block +No match + abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcX\=find_limits +Minimum heap limit = 22 +Minimum match limit = 37 +Minimum depth limit = 35 +No match + +/ab(cd)/ +Memory allocation (code space): 72 +Frame size for pcre2_match(): 144 + abcd\=memory + 0: abcd + 1: cd + abcd\=memory,ovector=0 +free 40960 +free unremembered block +malloc 128 +malloc 20480 + 0: abcd + 1: cd diff --git a/testdata/testoutputheap-8 b/testdata/testoutputheap-8 new file mode 100644 index 0000000..05a6b0c --- /dev/null +++ b/testdata/testoutputheap-8 @@ -0,0 +1,40 @@ +#pattern framesize, memory + +/abcd/ +Memory allocation (code space): 15 +Frame size for pcre2_match(): 128 + abcd\=memory +malloc 20480 + 0: abcd + abcd\=find_limits +Minimum heap limit = 1 +Minimum match limit = 2 +Minimum depth limit = 2 + 0: abcd + +/(((((((((((((((((((((((((((((( (^abc|xyz){1,20}$ ))))))))))))))))))))))))))))))/x +Memory allocation (code space): 855 +Frame size for pcre2_match(): 624 + abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcX\=memory +malloc 40960 +free unremembered block +No match + abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcX\=find_limits +Minimum heap limit = 22 +Minimum match limit = 37 +Minimum depth limit = 35 +No match + +/ab(cd)/ +Memory allocation (code space): 23 +Frame size for pcre2_match(): 144 + abcd\=memory + 0: abcd + 1: cd + abcd\=memory,ovector=0 +free 40960 +free unremembered block +malloc 128 +malloc 20480 + 0: abcd + 1: cd