Обнаружение бесконечной рекурсии в v8

Я использую движок JavaScript v8 от Google, чтобы в моем проекте был встроенный интерпретатор js, который должен иметь возможность выполнять предоставленный пользователем код, но мне интересно, можно ли что-то настроить перед вызовом любого пользовательского кода, который гарантирует, что если код пытается выполнить бесконечное повторение (или даже если он просто выполняется слишком долго), то его можно каким-то образом сделать, чтобы прервать его, выдать необработанное в противном случае исключение и сообщить о проблеме вызывающей стороне.

Спасибо всем за ответы до сих пор … да, вскоре после публикации я понял, что я в основном просил какое-то решение проблемы остановки, которая, как я знаю, неразрешима и на самом деле намного больше, чем я на самом деле необходимость.

Мне нужен либо какой-то механизм для обнаружения, когда что-то работающее в среде v8 возвращается достаточно быстро, либо просто механизм для обнаружения того, происходит ли рекурсия вообще … Мои варианты использования таковы, что конечный пользователь не должен в любом случае использовать любую рекурсию, и если я смогу даже обнаружить это, то я мог бы отвергнуть ее в этот момент вместо слепого выполнения. Однако было бы разрешено для разных потоков с разными изолятами вызывать одни и те же функции в одно и то же время, поэтому я не могу просто использовать статическую локальную переменную для блокировки другого вызова той же функции.

0

Решение

Компилятор [V8 определенно является компилятором в этом контексте, даже если он не всегда компилятор] может обнаружить рекурсию, но если код достаточно умен (например, в зависимости от переменных, которые не известны во время компиляции) , невозможно определить, имеет ли он бесконечную или конечную рекурсию.

Я просто хотел бы заявить, что «выполнение в течение X секунд запрещено», и если выполнение занимает больше этого времени, прервать его. Вы можете сделать это, имея «сторожевой поток», который запускается по завершении кода — и если сторожевой поток запускает X секунд, завершите основной поток и отправьте отчет пользователю. Нет, я не знаю точно, как написать этот код в сочетании с V8.

3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector