If USE_ZEND_ALLOC=0 valgrind /path/to/php arguments shows lots of errors like this:

==30030== Conditional jump or move depends on uninitialised value(s)
==30030==    at 0x4047F2C: ???
==30030==    by 0x120D1630: ???
==30030==    by 0x120D15C7: ???
==30030==    by 0x120D1636: ???
==30030==    by 0x120D1A4F: ???
==30030==    by 0xAC9244: add_next_index_stringl (zend_API.c:1585)

==30030== Conditional jump or move depends on uninitialised value(s)
==30030==    at 0x404766A: ???
==30030==    by 0x1268F850: ???
==30030==    by 0x1268F7E7: ???
==30030==    by 0x1268F851: ???
==30030==    by 0x127C0BBF: ???
==30030==    by 0xCA3157: ??? (in /path/to/php)

==30030== Conditional jump or move depends on uninitialised value(s)
==30030==    at 0x403FFF4: ???
==30030==    by 0x11BEBBF7: ???
==30030==    by 0x11BEBBF7: ???
==30030==    by 0x11BEBC86: ???
==30030==    by 0x11BEF92F: ???
==30030==    by 0xA7BC9E: __zend_malloc (zend_alloc.c:2829)

this is probably because PCRE JIT support was enabled, and PCRE is unaware of valgrind presence.

You usually can see these errors when running PHPUnit (the first two; they show before PHPUnit runs tests) or make test for a PHP extension (the last one).

See a simpler solution in Update 2 below.
To fix, PHP needs to be rebuilt with

./configure --with-valgrind --with-pcre-valgrind

Valgrind also shows me a bunch of memory leaks:

==2372== 48 bytes in 1 blocks are definitely lost in loss record 32 of 107
==2372==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2372==    by 0xACE065: zend_register_functions (zend_API.c:2306)
==2372==    by 0xACF7AE: do_register_internal_class (zend_API.c:2716)
==2372==    by 0xACF9CE: zend_register_internal_class (zend_API.c:2764)
==2372==    by 0xACF864: zend_register_internal_class_ex (zend_API.c:2736)
==2372==    by 0x5109AF: zm_startup_dom (php_dom.c:780)
==2372==    by 0xACC4B1: zend_startup_module_ex (zend_API.c:1873)
==2372==    by 0xACC53B: zend_startup_module_zval (zend_API.c:1888)
==2372==    by 0xADC1CA: zend_hash_apply (zend_hash.c:1506)
==2372==    by 0xACCBDD: zend_startup_modules (zend_API.c:1999)
==2372==    by 0x9F9388: php_module_startup (main.c:2309)
==2372==    by 0xBC6B0A: php_cli_startup (php_cli.c:431)
==2372==    by 0xBC919F: main (php_cli.c:1371)

They originate from the core, and unfortunately, I don’t have any solution other than suppression files.

UPDATE: memory leak is a known bug which has already been fixed but not yet released (7.2.5).

UPDATE 2: there is a simpler solution: instead of rebuilding PHP (which is not always possible — for example, Travis CI’s PHP is not built with Valgrind support), it is enough to set pcre.jit = 0 in php.ini or invoke ini_set('pcre.jit', 0); early in the code.

PHP 7.2 and Valgrind
Tagged on:     

Leave a Reply

Your email address will not be published. Required fields are marked *