]> granicus.if.org Git - php/commitdiff
Make MSVCRT memory leak checking usable for the test suite
authorChristoph M. Becker <cmbecker69@gmx.de>
Wed, 15 Jan 2020 22:04:03 +0000 (23:04 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 23 Jan 2020 10:47:20 +0000 (11:47 +0100)
While basic support for MSVCRT debugging has been added long
ago[1], the leak checking is not usable for the test suite, because we
are no longer calling `xmlCleanupParser()` on RSHUTDOWN of
ext/libxml[2], and therefore a few bogus leaks are reported whenever
ext/libxml is unloaded.

We therefore ignore memory leaks for this case.  We introduce
`ZEND_IGNORE_LEAKS_BEGIN()` and `ZEND_IGNORE_LEAKS_END()` to keep
those ignores better readable, and also because these *might* be
useful for other leak checkers as well.

We also explicitly free the `zend_handlers_table` and the `p5s` to
avoid spurious leak reports.

[1] <http://git.php.net/?p=php-src.git;a=commit;h=d756e1db2324c1f4ab6f9b52e329959ce6a02bc3>
[2] <http://git.php.net/?p=php-src.git;a=commit;h=8742276eb3905eb97a585417000c7b8df85006d4>

Zend/zend_portability.h
Zend/zend_strtod.c
Zend/zend_vm_execute.h
Zend/zend_vm_execute.skl
ext/libxml/config.w32
ext/libxml/libxml.c

index a2bb02045153a4a54148c0969dcf1233bd237a9d..58c42a289e324b4dd6dd7e29966160262ee659a0 100644 (file)
@@ -648,4 +648,12 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
 # define ZEND_PREFER_RELOAD
 #endif
 
+#if defined(ZEND_WIN32) && defined(_DEBUG) && defined(PHP_WIN32_DEBUG_HEAP)
+# define ZEND_IGNORE_LEAKS_BEGIN() _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) & ~_CRTDBG_ALLOC_MEM_DF)
+# define ZEND_IGNORE_LEAKS_END() _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_ALLOC_MEM_DF)
+#else
+# define ZEND_IGNORE_LEAKS_BEGIN()
+# define ZEND_IGNORE_LEAKS_END()
+#endif
+
 #endif /* ZEND_PORTABILITY_H */
index 08f8424e8c5b4d81a8798e27dc129e7b1a0a8676..2228e2262cf1f0f37ea25b82504323a9abcd9f37 100644 (file)
@@ -546,6 +546,7 @@ Bigint {
  static Bigint *freelist[Kmax+1];
 
 static void destroy_freelist(void);
+static void free_p5s(void);
 
 #ifdef ZTS
 static MUTEX_T dtoa_mutex;
@@ -564,6 +565,8 @@ ZEND_API int zend_startup_strtod(void) /* {{{ */
 ZEND_API int zend_shutdown_strtod(void) /* {{{ */
 {
        destroy_freelist();
+       free_p5s();
+
 #ifdef ZTS
        tsrm_mutex_free(dtoa_mutex);
        dtoa_mutex = NULL;
@@ -4540,6 +4543,19 @@ static void destroy_freelist(void)
        FREE_DTOA_LOCK(0)
 }
 
+static void free_p5s(void)
+{
+       Bigint **listp, *tmp;
+
+       ACQUIRE_DTOA_LOCK(1)
+       listp = &p5s;
+       while ((tmp = *listp) != NULL) {
+               *listp = tmp->next;
+               free(tmp);
+       }
+       FREE_DTOA_LOCK(1)
+}
+
 #ifdef __cplusplus
 }
 #endif
index 7fc4d1f691e19cec442c568f87e23e564934a22e..da4efc5ffbae8875b0bb0d44204b898f177680d3 100644 (file)
@@ -61333,13 +61333,17 @@ void zend_vm_init(void)
        VM_TRACE_START();
 }
 
+static HashTable *zend_handlers_table = NULL;
+
 void zend_vm_dtor(void)
 {
        VM_TRACE_END();
+       if (zend_handlers_table) {
+               zend_hash_destroy(zend_handlers_table);
+               free(zend_handlers_table);
+       }
 }
 
-static HashTable *zend_handlers_table = NULL;
-
 static void init_opcode_serialiser(void)
 {
        int i;
index 27aae163913ab2554e7e07692e096ae7a5c8792d..3e520e9bacd82a22d5c19c59213238acb7e84d44 100644 (file)
@@ -67,13 +67,17 @@ void {%INITIALIZER_NAME%}(void)
        VM_TRACE_START();
 }
 
+static HashTable *zend_handlers_table = NULL;
+
 void zend_vm_dtor(void)
 {
        VM_TRACE_END();
+       if (zend_handlers_table) {
+               zend_hash_destroy(zend_handlers_table);
+               free(zend_handlers_table);
+       }
 }
 
-static HashTable *zend_handlers_table = NULL;
-
 static void init_opcode_serialiser(void)
 {
        int i;
index b11c57bc44a72d645dfa3256f0be30baa3d28aac..dd91c4b89352cf881b6dc4dd6980bc2ce006bfc7 100644 (file)
@@ -16,6 +16,9 @@ if (PHP_LIBXML == "yes") {
                        ADD_DEF_FILE("ext\\libxml\\php_libxml2.def");
                }
                PHP_INSTALL_HEADERS("ext/libxml/", "php_libxml.h");
+               if (PHP_CRT_DEBUG == "yes") {
+                       ADD_FLAG("CFLAGS_LIBXML", "/D PHP_WIN32_DEBUG_HEAP");
+               }
        } else {
                WARNING("libxml support can't be enabled, iconv or libxml are missing")
                PHP_LIBXML = "no"
index 333dab4856ab99ba5ca539a482af0205dc1ce5e4..360d1999e7c131214f1356f109c5b44d5bd3db1b 100644 (file)
@@ -752,7 +752,9 @@ PHP_LIBXML_API void php_libxml_initialize(void)
 {
        if (!_php_libxml_initialized) {
                /* we should be the only one's to ever init!! */
+               ZEND_IGNORE_LEAKS_BEGIN();
                xmlInitParser();
+               ZEND_IGNORE_LEAKS_END();
 
                _php_libxml_default_entity_loader = xmlGetExternalEntityLoader();
                xmlSetExternalEntityLoader(_php_libxml_pre_ext_ent_loader);