Перейти к основному содержимому

Временное отключение анализа выхода

· 2 мин. чтения
Матиас Биненс ([@mathias](https://twitter.com/mathias)), аналитик выхода из изолированной среды

В JavaScript выделенный объект выходит, если он доступен извне текущей функции. Обычно V8 выделяет новые объекты в куче JavaScript, но используя анализ выхода, оптимизирующий компилятор может понять, когда объект можно обрабатывать по-особому, так как его срок жизни доказано ограничен активацией функции. Когда ссылка на вновь выделенный объект не выходит за пределы функции, которая его создала, движки JavaScript не обязаны явно выделять этот объект в куче. Вместо этого они могут эффективно рассматривать значения объекта как локальные переменные функции. Это, в свою очередь, позволяет проводить множество оптимизаций, таких как хранение этих значений на стеке или в регистрах, а в некоторых случаях даже полное устранение этих значений. Объекты, которые выходят (точнее, объекты, для которых невозможно доказать, что они не выходят), должны выделяться в куче.

Например, анализ выхода позволяет V8 эффективно переписать следующий код:

function foo(a, b) {
const object = { a, b };
return object.a + object.b;
// Примечание: `object` не выходит за пределы функции.
}

…в этот код, который позволяет провести несколько оптимизаций:

function foo(a, b) {
const object_a = a;
const object_b = b;
return object_a + object_b;
}

V8 v6.1 и более ранние версии использовали реализацию анализа выхода, которая была сложной и вызывала множество ошибок с момента своего появления. Эта реализация была удалена, и новая кодовая база анализа выхода доступна в V8 v6.2.

Однако уязвимость безопасности Chrome, связанная со старой реализацией анализа выхода в V8 v6.1, была обнаружена и ответственно раскрыта нам. Чтобы защитить наших пользователей, мы отключили анализ выхода в Chrome 61. Node.js не должен быть затронут, так как эксплойт зависит от выполнения недоверенного JavaScript.

Отключение анализа выхода отрицательно сказалось на производительности, так как оно отключает вышеупомянутые оптимизации. В частности, следующие функции ES2015 могут временно замедлиться:

  • деструктуризация
  • итерация с использованием for-of
  • оператор spread для массивов
  • параметры rest

Обратите внимание, что отключение анализа выхода является лишь временной мерой. С выходом Chrome 62 мы запустим новую — и, что самое главное, включенную — реализацию анализа выхода, представленную в V8 v6.2.