Условный переход или перемещение зависит от неинициализированных значений с помощью php_pcre_match_impl.Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Условный переход или перемещение зависит от неинициализированных значений с помощью php_pcre_match_impl.

Сообщение Anonymous »

Я создаю простую функцию в расширении PHP-C, использую PHP 8.3 из исходного кода, включаю opcache и pcre.jit. Я установил ZEND_DONT_UNLOAD_MODULES равным 1, а USE_ZEND_ALLOC равным 0 для Valgrind

Внутри моего расширения я вызываю php_pcre_match_impl напрямую

Код: Выделить всё

#include
#include 
#include 
#include 

#include "swat.h"

PHP_FUNCTION(run) {
zval matched, matches;

ZEND_PARSE_PARAMETERS_NONE();

ZVAL_UNDEF(&matched);
array_init(&matches);

zend_string *pattern = zend_string_init(ZEND_STRL("/\\/page-[0-9]+/"), 0);
zend_string *subject = zend_string_init(ZEND_STRL("backend/product"), 0); // Valgrind stack trace error

pcre_cache_entry *pce = pcre_get_compiled_regex_cache(pattern);

if (!pce) {
zend_string_release(pattern);
zend_string_release(subject);
RETURN_FALSE;
}

php_pcre_match_impl(pce, subject, &matched, &matches, 1, 0, 0, 0);

zend_string_release(pattern);
zend_string_release(subject);

zval_ptr_dtor(&matched);
zval_ptr_dtor(&matches);

RETURN_TRUE;
}
При запуске PHP с Valgrind:

Код: Выделить всё

valgrind --leak-check=full php -S 0.0.0.0:8686 index.php
Я получаю такие ошибки:

Код: Выделить всё

==11== Invalid read of size 16
==11==    at 0x8B43C56: ???
==11==    by 0x8850AF7: ???
==11==    by 0x8850AF7: ???
==11==    by 0x8850B06: ???
==11==    by 0x84BF75F: ???
==11==    by 0x8850AF7: ???
==11==  Address 0x8850aff is 31 bytes inside a block of size 40 alloc'd
==11==    at 0x4846828: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==11==    by 0x89B4E5: __zend_malloc (zend_alloc.c:3142)
==11==    by 0x899FBA: _malloc_custom (zend_alloc.c:2494)
==11==    by 0x89A104: _emalloc (zend_alloc.c:2613)
==11==    by 0x87003FB: zend_string_alloc (zend_string.h:174)
==11==    by 0x870046E: zend_string_init (zend_string.h:196)
==11==    by 0x87005CB: zif_run (swat.c:20)
==11==    by 0x923C92: ZEND_DO_ICALL_SPEC_RETVAL_UNUSED_HANDLER (zend_vm_execute.h:1275)
==11==    by 0x9A257B: execute_ex (zend_vm_execute.h:57273)
==11==    by 0x9A7E45: zend_execute (zend_vm_execute.h:61665)
==11==    by 0x8DE991: zend_execute_scripts (zend.c:1895)
==11==    by 0xA7551F: php_cli_server_dispatch_router (php_cli_server.c:2286)
==11==    by 0xA756FF: php_cli_server_dispatch (php_cli_server.c:2326)
==11==    by 0xA762DD: php_cli_server_recv_event_read_request (php_cli_server.c:2667)
==11==    by 0xA766D9: php_cli_server_do_event_for_each_fd_callback (php_cli_server.c:2754)
==11==    by 0xA71C73: php_cli_server_poller_iter_on_active (php_cli_server.c:932)
==11==    by 0xA76773: php_cli_server_do_event_for_each_fd (php_cli_server.c:2774)
==11==    by 0xA7681F: php_cli_server_do_event_loop (php_cli_server.c:2786)
==11==    by 0xA76C84: do_cli_server (php_cli_server.c:2918)
==11==    by 0xA6C1D9: main (php_cli.c:1344)
==11==
==11== Conditional jump or move depends on uninitialised value(s)
==11==    at 0x8B43CFA: ???
==11==    by 0x8850AF7: ???
==11==    by 0x8850AF7: ???
==11==    by 0x8850B06: ???
==11==    by 0x84BF75F: ???
==11==    by 0x8850AF7: ???
==11==
Ожидается:

Функция должна работать без ошибок памяти.
Факт:

Valgrind сообщает о недопустимых чтениях и использовании неинициализированных значений.
Я подозреваю, что проблема может быть связана с тем, как я использую php_pcre_match_impl или с тем, как инициализируются zval, но я не уверен, что именно. неверно.
Безопасно ли вызывать php_pcre_match_impl непосредственно из расширения или я пропустил необходимые шаги инициализации?

Подробнее здесь: https://stackoverflow.com/questions/798 ... re-match-i
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»